У меня есть пользовательский тип сообщения trips
, properties
, room-types
и features
. Я назначил свойства для поездок, а свойства имеют свои особенности и типы комнат. Теперь мне нужен фильтр на странице архива поездок, который отображает поездки в соответствии с характеристиками свойств, а также с типами комнат.
Выбранные объекты и типы комнат сохраняются в properties_post_meta_data
. В настоящее время, когда выбраны объекты свойств и типы комнат, тогда он отфильтровывает поездки, но возникают проблемы, когда выбирается один объект, т. Е. Объекты или типы комнат.
Мой текущий код для фильтрации:
$relation = empty($property_feature_id) ? 'OR' : (empty($room_types_id) ? 'OR' : "AND");
$args = [
'post_type' => 'properties',
'meta_query' => [],
];
if(!empty( $property_feature_id ) && !empty( $room_types_id ) ){
$args['meta_query']['relation'] = $relation;
}
if( !empty( $property_feature_id ) && empty( $room_types_id ) ) {
$args['meta_query'][] = array(
'key' => 'properties_post_meta_data',
'value' => $property_feature_id,
'compare' => 'LIKE',
);
}
if( !empty( $room_types_id ) && empty( $property_feature_id ) ) {
$args['meta_query'][] = array(
'key' => 'properties_post_meta_data',
'value' => $room_types_id,
'compare' => 'LIKE',
);
}
$properties_data = get_posts( $args );
$look_for_properties = [];
foreach ($properties_data as $property) {
$metas = get_post_meta( $property->ID, 'properties_post_meta_data', true );
$features = isset( $metas['property_features'] ) ? $metas['property_features'] : [];
$room_types = isset( $metas['roomtypes_select'] ) ? $metas['roomtypes_select'] : [];
if ( in_array( $property_feature_id, $features ) ) {
$look_for_properties[] = $property->ID;
}
if ( in_array( $room_types_id, $room_types ) ) {
$look_for_properties[] = $property->ID;
}
}
wp_reset_postdata();
$meta_query_args = [];
if ( empty( $look_for_properties ) ) {
$meta_query_args[] = [
'key' => 'not_exist_meta',
'value' => '',
'compare' => '=',
];
} else {
$value = implode( ',', $look_for_properties );
foreach ( $look_for_properties as $vproperty ) {
$meta_query_args['relation'] = 'OR';
$meta_query_args[] = [
'key' => 'wp_trip_properties',
'value' => $vproperty,
'compare' => 'LIKE',
];
}
}
$query->set( 'meta_key', 'wp_trip_properties' );
$query->set( 'meta_query', array([
array(
$meta_query_args,
)
]));