web-dev-qa-db-fra.com

Comment filtrer SQL uniquement pour un type de publication spécifique

J'ai essayé de joindre une table personnalisée avec une requête wordpress standard, mais uniquement dans des conditions spécifiques (un type de publication spécifique).

J'ai un modèle single-event.php qui exécute la requête principale et un WP_Query secondaire dans la barre latérale.

Je voudrais filtrer le SQL pour la requête principale sans interférer avec la requête secondaire.

J'utilise le code suivant, malheureusement, cela affecte les deux requêtes:

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;
}

Le code ci-dessus joint avec succès une table contenant beaucoup de champs à l'objet post. Malheureusement, il ajoute également ce code SQL à la requête de la barre latérale, même si cette requête n'est pas du type "événement". Lorsque je reçois le $ wp_query global, je reçois la requête "principale", et puisque la requête principale sur single-event.php est de type post "événement", toutes les requêtes de la page seront affectées, même si dans son propre opbject WP_Query.

Comment puis-je contourner cela et m'assurer qu'il affecte UNIQUEMENT la requête principale sur single-event.php?

1
Malibur

Comme @bonger l'a dit, laissez vos filtres accepter un deuxième argument, qui sera l'instance de WP_Query qui exécute le filtre, et vérifiez qu'il s'agit bien de la requête principale pour un événement:

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 */ );
2
TheDeadMedic