Je suis presque là sur celui-ci.
Sur functions.php, j'ai ceci:
function base_home_product_post_type( $query ) {
if($query->is_search() && $_POST['box'] == 'sku') {
$query->query_vars['post_type'] = 'product';
$query->query_vars['meta_key'] = 'sku';
$query->query_vars['meta_value'] = $query->query_vars['s'];
return;
}
}
add_action('pre_get_posts', 'base_home_product_post_type', 1);
Et ça fait ce qu'on dit. Recherche la chaîne de recherche sur la méta_key 'sku'. Le problème ici est que par défaut, l'objet requête renvoyé par WordPress contient également ceci et les requêtes post_title
et post_content
par défaut:
SELECT SQL_CALC_FOUND_ROWS whirl_2_posts.ID FROM whirl_2_posts INNER JOIN whirl_2_postmeta ON (whirl_2_posts.ID = whirl_2_postmeta.post_id) WHERE 1=1 AND (((whirl_2_posts.post_title LIKE '%__SEARCH_STRING__%') OR (whirl_2_posts.post_content LIKE '%__SEARCH_STRING__%')))
Je ne veux vraiment pas cela quand je cherche seulement la valeur "sku", alors j'ai essayé de la supprimer en utilisant posts_where
et quelques REINEX plutôt laids comme ceci (avertissement, hacky et buggy):
function get_rid_of_titles($search) {
if(is_search() && $_POST['box'] == 'sku') {
$search = preg_filter('|AND\s\({3}\w*\.post_title\sLIKE\s\'\%[^%]*\%\'\) OR \(\w*\.post_content\sLIKE\s\'\%[^%]*\%\'\){3}\s|', '', $search);
}
return $search;
}
add_filter('posts_where','get_rid_of_titles');
Mais pas de chance. Quelqu'un peut-il m'indiquer comment procéder pour rechercher en ligne la valeur personnalisée dans ce cas?
SOLUTION
Grâce à @kaiser ci-dessous, cela fonctionne:
function get_rid_of_titles($search) {
if(is_search() && $_POST['box'] == 'sku') {
$sku = $_POST['s']; // get search string
$needle = "LIKE '%$sku%'"; // search only for LIKE '%_SEARCH_STRING_%'. This is a multisite environment, so involving table names directly is a bad idea
$replace = "LIKE '%'"; // replace it with SQL Wildcard so any title and any content are welcome
$count = 2; // only the first 2 occurrencies which happen to be post_title and post_content
return str_replace($needle,$replace,$search, $count);
}
}
add_filter('posts_where','get_rid_of_titles');
Vous pouvez faire deux choses:
A) remplacez la recherche par une requête SQL qui ne cherche que dans la table postmeta (plus rapidement, aucune variable JOIN
n'est impliquée - vous pouvez obtenir le message via son ID ultérieurement, lors de l'affichage des résultats).
B) Fractionnez la chaîne juste après WHERE 1=1
et supprimez la dernière partie. Vous pouvez utiliser une simple return str_replace( $query_part_below, '', $search );
.
AND (
(whirl_2_posts.post_title LIKE '%__SEARCH_STRING__%')
OR (whirl_2_posts.post_content LIKE '%__SEARCH_STRING__%')
)
Assurez-vous que vous avez correctement $wpdb->prepare()
avant de le remettre en place.