À l’aide du hook pre_get_posts, j’essaie d’autoriser les utilisateurs à affiner leur recherche en la limitant aux publications avec certaines (plusieurs) balises appliquées.
Ceci est mon crochet et fonction:
add_filter('pre_get_posts', array($this, 'pre_get_posts'), 0);
function pre_get_posts( $query ) {
if ( !is_admin() && $query->is_search ) {
$query->set( 'post_type', array( 'post', 'resource', 'initiative') );
if (isset($_GET['tags'])) {
$tax_query = array(
array(
'taxonomy' => 'post_tag',
'field' => 'slug',
'terms' => $_GET['tags'],
'operator' => 'AND',
)
);
$tax_query = new WP_Tax_Query($tax_query);
$query->set('tax_query', $tax_query);
}
}
return $query;
}
Comme vous pouvez le constater, je développe également la recherche pour inclure deux types de publication personnalisés. Dans les résultats d'une recherche, les types d'articles personnalisés sont ajoutés correctement et je peux les voir dans la requête générée. Je sais donc que le hook et la fonction sont appelés correctement. La partie post_tag de la requête n'est toutefois pas ajoutée.
L'élément query_vars
de l'objet WP_Query contient correctement (je pense) le tax_query
, mais l'objet WP_Query contient son propre tax_query
qui est vide et le code SQL de la request
ne le possède pas non plus. Voici un var_dump (légèrement simplifié) de l'objet WP_Query:
WP_Query Object (
[query_vars] => Array
(
[s] => ecosystem
[post_type] => Array
(
[0] => post
[1] => resource
[2] => initiative
)
[tax_query] => WP_Tax_Query Object
(
[queries] => Array
(
[0] => Array
(
[taxonomy] => post_tag
[terms] => Array
(
[0] => culture-change
[1] => peace
)
[include_children] => 1
[field] => slug
[operator] => AND
)
)
[relation] => AND
)
[search_terms_count] => 1
[search_terms] => Array
(
[0] => ecosystem
)
[search_orderby_title] => Array
(
[0] => jcgy_posts.post_title LIKE '%ecosystem%'
)
[order] => DESC
)
[tax_query] => WP_Tax_Query Object
(
[queries] => Array
(
)
[relation] => AND
)
[query] => Array
(
[s] => ecosystem
)
[request] => SELECT SQL_CALC_FOUND_ROWS DISTINCT jcgy_posts.* FROM jcgy_posts LEFT JOIN jcgy_postmeta as jcgy_postmeta on jcgy_posts.ID = jcgy_postmeta.post_id AND jcgy_postmeta.meta_key = '_EventStartDate' WHERE 1=1 AND (((jcgy_posts.post_title LIKE '%ecosystem%') OR (jcgy_posts.post_content LIKE '%ecosystem%'))) AND jcgy_posts.post_type IN ('post', 'resource', 'initiative') AND (jcgy_posts.post_status = 'publish' OR jcgy_posts.post_author = 1 AND jcgy_posts.post_status = 'private') ORDER BY jcgy_posts.post_title LIKE '%ecosystem%' DESC, post_date DESC LIMIT 0, 10
Toutes les recherches que j'ai effectuées me disent que j'ai bien structuré mon ajout à la requête, mais que quelque chose ne fonctionne clairement pas. Je m'arrache les cheveux. Des idées?
J'ai fait fonctionner la chose, bien que je ne sois pas tout à fait sûr de savoir comment.
J'ai apporté deux modifications: Suppression de l'étape "convertir un tableau en objet Tax_Query" (que je n'ai mise que parce que l'utilisation d'un tableau ne fonctionnait pas auparavant). Ajout d'une affectation directe du tableau à l'objet $ query (plutôt que d'utiliser simplement l'ensemble. () méthode).
Ma dernière fonction (de travail) est:
function pre_get_posts( $query ) {
if ( !is_admin() && $query->is_search ) {
if (isset($_GET['post_types'])) {
$query->set( 'post_type', $_GET['post_types']);
} else {
$query->set( 'post_type', array( 'post', 'resource', 'initiative') );
}
if (isset($_GET['tags'])) {
$tax_query = array(
array(
'taxonomy' => 'post_tag',
'field' => 'slug',
'terms' => $_GET['tags'],
'operator' => 'AND',
)
);
$query->set('tax_query', $tax_query); // do I need both of these lines?
$query->tax_query = $tax_query; // let's leave them both in for safety
}
}
return $query;
}