C'est un peu difficile à expliquer mais je suppose que vous pouvez comprendre si je le développe encore plus ...
Normalement, lorsque vous effectuez une recherche sur un site WordPress, les résultats sont basés sur Titre, Contenu, Catégorie, Tags.
Je souhaite que ma recherche parcourt les publications et examine également les champs personnalisés ... Ainsi, si un utilisateur recherche un champ personnalisé spécifique, supposons que le message intitulé "Blah" et que je crée un nom de champ "Chocolat" et le le contenu du champ est "Cadbury", donc lorsque l'utilisateur recherche "Cadbury", le message "Blah" devrait s'afficher ... Je sais qu'il y a peu de plugins pour cela comme <http://wordpress.org/plugins/relevanssi/>
mais je ferais mieux de ne pas gonfler mon site avec trop de plugins et des plugins pour chaque petite chose ...
Je ne suis pas très bon avec WordPress mais je suppose que wp_query peut faire le travail ... Merci pour toute aide
Il y a peu de façons de résoudre ce problème ...
Vous pouvez souvent entendre que l'utilisation de nombreux plugins est une mauvaise chose. Ce n'est pas tout à fait vrai. Ce n'est grave que si ces plugins ont un impact important sur l'utilisation des ressources. Dans ce cas, Relevansi ne causera pas un tel impact.
Bien sûr, il existe un autre problème avec les plugins: vous devez les maintenir (mises à jour, etc.).
C'est le moyen le plus simple de résoudre votre problème. Joignez simplement les tables posts et postmeta et ajoutez des clauses WHERE qui rechercheront votre valeur dans les champs personnalisés appropriés.
// Join with postmeta table
function mycf_search_join( $join ) {
global $wpdb;
if ( is_search() ) {
$join .= " LEFT JOIN {$wpdb->postmeta} mycfpm ON ({$wpdb->posts}.ID = mycfpm.post_id ";
}
return $join;
}
add_filter('posts_join', 'mycf_search_join' );
// Add where clauses
function mycf_search_where( $where ) {
global $wpdb;
if ( is_search() ) {
$where = preg_replace(
"/\(\s*".$wpdb->posts.".post_title\s+LIKE\s*(\'[^\']+\')\s*\)/",
"({$wpdb->posts}.post_title LIKE $1) OR (mycfpm.meta_value LIKE $1)", $where );
}
return $where;
}
add_filter( 'posts_where', 'mycf_search_where' );
// Prevent duplicates
function cf_search_distinct( $distinct ) {
global $wpdb;
if ( is_search() ) {
return 'DISTINCT';
}
return $distinct;
}
add_filter( 'posts_distinct', 'mycf_search_distinct' );
Le seul problème avec cette solution est qu’elle peut être un peu lente. Surtout si vous ne voulez pas chercher dans tous les champs personnalisés.
Vous pouvez également utiliser le crochet save_post
pour créer quelque chose comme un index. Après avoir sauvegardé votre publication, vous obtenez tous les champs personnalisés qui doivent être interrogeables, combinez leurs valeurs et enregistrez sous un autre champ personnalisé.
Supposons donc qu’il existe un poste avec CF: color=red
, location=europe
, name=john
et qu’ils devraient tous être consultables. Vous pouvez obtenir ces valeurs, les séparer avec un caractère/séquence de séparation (par exemple #, vous obtiendrez donc red#europe#john
) et enregistrer cette chaîne en tant que nouveau CF (appelons-le _cf_search_string).
function mycf_prepare_search_index_cf( $post_id ) {
if ( wp_is_post_revision( $post_id ) ) return;
$meta_keys = array('cf_key1', 'cf_key2', 'cf_key3');
$search_string = '';
foreach ( $meta_keys as $k ) {
$search_string .= get_post_meta( $post_id, $k, true ) . '#';
}
update_post_meta( $post_id, '_cf_search_string', $search_string );
}
add_action( 'save_post', 'mycf_prepare_search_index_cf', 100, 1 );
Ensuite, vous pouvez utiliser le code de 2. pour rechercher uniquement dans ce seul champ personnalisé, mais pas dans tous, de sorte qu'il ajoute une seule jointure et ne multiplie les lignes qui seront recherchées lors de la recherche dans la base de données.