Je veux créer une recherche qui:
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.
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
.
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';
}