Как фильтровать 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?

Author: Malibur, 2015-05-14

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 */ );
 4
Author: TheDeadMedic, 2015-05-14 18:33:43