Как фильтровать sql только для определенного типа записи
Я пытался присоединиться к пользовательской таблице с помощью обычного запроса wordpress, но только при определенном условии (определенный тип записи).
У меня есть single-event.php шаблон, который запускает основной запрос, и дополнительный WP_Query на боковой панели.
Я хотел бы отфильтровать SQL для основного запроса, не вмешиваясь во вторичный запрос.
Я использую следующий код, к сожалению, он влияет на оба запроса:
add_filter( 'posts_fields', 'single_posts_fields' );
function single_posts_fields( $sql ) {
global $wp_query;
if(is_single() && $wp_query->query_vars['post_type'] == 'event') {
global $wpdb;
$sql = $sql . ",
some fields...
";
}
return $sql;
}
add_filter( 'posts_join', 'single_posts_join' );
function single_posts_join( $sql ) {
global $wp_query;
if(is_single() && $wp_query->query_vars['post_type'] == 'performance') {
global $wpdb;
$table = $wpdb->base_prefix . "events";
$sql = $sql . "
LEFT JOIN $table AS something ON something = something
";
}
return $sql;
}
Приведенный выше код успешно соединяет таблицу с большим количеством полей с объектом post. К сожалению, он также добавляет этот sql в запрос боковой панели, даже если этот запрос не относится к типу сообщения "событие". Я изменяю размер, когда получаю глобальный запрос $wp_, я получаю "основной" запрос, а поскольку основной запрос на single-event.php имеет тип сообщения "событие", это повлияет на каждый запрос на странице, даже если он находится в собственном opbject WP_Query.
Как я могу обойти это и убедиться, что это влияет ТОЛЬКО на основные запрос на single-event.php?
1 answers
Как сказал @бонгер, позвольте вашим фильтрам принять второй аргумент, который будет экземпляром WP_Query
, выполняющего фильтр, и проверьте, действительно ли это основной запрос для события:
function single_posts_fields( $sql, $wp_query ) {
if ( $wp_query->is_main_query() && $wp_query->is_singular( 'event' ) ) {
// Do your stuff
}
}
add_filter( 'posts_fields', 'single_posts_fields', 10, 2 /* Number of accepted arguments */ );
function single_posts_join( $sql, $wp_query ) {
if ( $wp_query->is_main_query() && $wp_query->is_singular( 'event' ) ) {
// Do your stuff
}
}
add_filter( 'posts_join', 'single_posts_join', 10, 2 /* Number of accepted arguments */ );