web-dev-qa-db-fra.com

Réplication du paramètre 'WP_Query' avec $ wpdb

Prenez cette requête de base:

$posts = new WP_Query(array(
    'post_type' => 'page'
    's' => 'some search query'
));

WordPress divisera le some search query en 3 termes de recherche distincts, c'est pourquoi je dois créer cette fonction $ wpdb. Je veux les mêmes fonctionnalités, mais avec la requête entière traitée comme un terme de recherche.

Voici où je suis:

global $wpdb;
$post_type = 'product';

$db_matches = $wpdb->get_results("
                                    SELECT ID
                                    FROM $wpdb->posts
                                    INNER JOIN $wpdb->term_relationships ON $wpdb->term_relationships.object_id = $wpdb->posts.post_title
                                    WHERE post_title LIKE '%$query%'
                                        AND post_type = '$post_type'
                                        AND post_status = 'publish'
                                    ");

C'est ma première jointure interne, alors c'est probablement tout faux. Deux choses doivent être faites pour résoudre cette requête:

  1. Corrige la syntaxe dans la ligne de jointure interne
  2. Ajoutez le filtre de langue dans les clauses WHERE (devrait ressembler à AND term_taxonomy_id = 2, n'est-ce pas?). J'utilise Polylang, donc je dois juste vérifier que le object_id existe dans la table term_relationships avec la valeur 2.

Alors quelqu'un peut-il me donner un coup de main avec ça? Merci beaucoup.

1
Brian
  1. Il semble que vous dans votre INNER JOIN, vous rejoignez sur

    wp_term_relationships.object_id == wp_posts.post_title
    

    ce qui est erroné, carobject_idest le post-id dans ce scénario.

    Je veux tous les identifiants (post-ids)

    SELECT ID FROM $wpdb->posts
    

    Qui ont un enregistrement dans la table wp_term_relationships

    // Now we are comparing the correct columns
    INNER JOIN $wpdb->term_relationships ON $wpdb->term_relationships.object_id = $wpdb->posts.ID 
    
  2. Ajout de la clause where supplémentaire

    Où term_taxonomy_id est égal à 2

    WHERE $wpdb->term_relationships.term_taxonomy_id = 2
    
2
trevbro

WordPress divisera la requête de recherche en 3 termes de recherche distincts, c'est pourquoi je dois créer cette fonction $ wpdb. Je veux les mêmes fonctionnalités, mais avec la requête entière traitée comme un terme de recherche.

Il existe les paramètres de recherche d'entrée sentence et exact pour WP_Query.

Au lieu de construire manuellement la requête de recherche, essayez, par exemple, par exemple.

$query = new WP_Query( [
    'post_type' => 'page',
    's'         => 'some search query',
    'sentence'  => true,
    'exact'     => true,
] );

La requête SQL générée comprendra:

(wp_posts.post_title LIKE 'some search query') OR 
(wp_posts.post_excerpt LIKE 'some search query') OR 
(wp_posts.post_content LIKE 'some search query')

Avec exact comme false, il sera remplacé par:

(wp_posts.post_title LIKE '%some search query%') OR 
(wp_posts.post_excerpt LIKE '%some search query%') OR 
(wp_posts.post_content LIKE '%some search query%')

J'espère que ça aide!

1
birgire