web-dev-qa-db-fra.com

requête de recherche dans un terme de taxonomie personnalisée, un titre de publication et un champ méta

Je veux créer une recherche qui:

  1. Rechercher dans ma taxonomie personnalisée - custom-tags
  2. rechercher le titre de l'article
  3. rechercher select meta field ?? ne sais pas
  4. recherche avec type de message personnalisé - partie facile

Je cherchais une API wordpress, mais je ne trouvais aucune fonction intégrée utile. J'ai créé une requête personnalisée ci-dessous: il y a un bogue ici car il renvoie des résultats en double de temps en temps, peut-être qu'une jointure de gauche pourrait être nécessaire ici.

cette requête recherche le terme et le titre seulement pour le moment, mais je veux aussi un méta-champ appelé cterm recherché.

SELECT   wp_posts.*
    FROM wp_posts, wp_term_relationships, wp_term_taxonomy, wp_terms
    WHERE (wp_terms.name LIKE '%car%'
        OR wp_posts.post_title LIKE '%car%')
            AND wp_posts.post_status = 'publish'
            AND wp_posts.post_type = 'posts_vch'
        AND wp_posts.ID = wp_term_relationships.object_id
        AND wp_term_relationships.term_taxonomy_id = wp_term_taxonomy.term_taxonomy_id
        AND wp_term_taxonomy.term_id = wp_terms.term_id  GROUP BY  wp_posts.ID  LIMIT  1 ,50

METTRE À JOUR:

au-dessus de la requête mise à jour, réussissez à supprimer le résultat en double à l'aide de group by MAIS un autre bogue est qu'il n'apporte pas de messages POST avec le terme "voiture". Fondamentalement, il ne montre que les posts qui ont le mot "voiture" dans le titre mais pas dans le terme/tag.

1
TheDeveloper

Vous pouvez faire tout ce dont vous avez besoin en utilisant les paramètres de recherche autorisés dans WP_Query - sauf dans le titre de l'article uniquement. Pour ce faire, voir cette réponse .

Assurez-vous de consulter la taxonomie et les méta-requêtes autorisées dans les arguments transmis à WP_Query.

EDIT: Puisque vous devez sélectionner OR, vous avez 2 options: vous pouvez exécuter 2 requêtes et fusionner les 2 tableaux de post par la suite, ou si vous êtes plus préoccupé par les performances, vous pouvez utiliser une requête personnalisée et simplement exécuter le écrit ci-dessus. Utilisez l'objet global $ wpdb et la fonction $wpdb->get_results(). Pour que votre requête ne renvoie pas les résultats en double, vous devriez pouvoir utiliser SELECT DISTINCT.

1
jessica

Essayez ceci, cela peut aider:

if( !defined( 'ABSPATH' ) )
    exit;

function modify_wp_search_where( $where ) {
    if( is_search() ) {
        global $wpdb, $wp;
        $where = preg_replace(
            "/($wpdb->posts.post_title (LIKE '%{$wp->query_vars['s']}%'))/i",
            "$0 OR ( $wpdb->postmeta.meta_value LIKE '%{$wp->query_vars['s']}%' )",
            $where
            );
        add_filter( 'posts_join_request', 'modify_wp_search_join' );
        add_filter( 'posts_distinct_request', 'modify_wp_search_distinct' );
    }
    return $where;      
}
add_action( 'posts_where_request', 'modify_wp_search_where' );

function modify_wp_search_join( $join ) {  
    global $wpdb;   
    return $join .= " LEFT JOIN $wpdb->postmeta ON ($wpdb->posts.ID = $wpdb->postmeta.post_id) ";   
}

function modify_wp_search_distinct( $distinct ) {   
    return 'DISTINCT';      
} 
0
Alvin