J'ai créé un plugin MU qui n'affiche que les posts de certaines balises dans la boucle, comme ceci:
function custom_tags( $query ) {
$query->set( 'tag', array( 'custom', 'general' ) );
}
add_action( 'pre_get_posts', 'custom_tags' );
Cela fonctionne bien lorsque je supprime le tableau et que je ne vérifie que 1 balise, mais comment puis-je le faire fonctionner avec plus d'une balise comme celle que je tente de reproduire ci-dessus?
L'erreur que je reçois est:
Warning: strpos() expects parameter 1 to be string, array given in /srv/users/s/wp-includes/query.php on line 1966
Warning: preg_split() expects parameter 2 to be string, array given in /srv/users/s/wp-includes/query.php on line 1967
Code mis à jour:
$current = substr($_SERVER[HTTP_Host], 0, -4);
function custom_tags( $query ) {
$query->set( 'tag', 'general,{$current}' );
}
add_action( 'pre_get_posts', 'custom_tags' );
Comme Milo (et vos erreurs) le soulignent: vous passez un tableau où une chaîne est attendue. Selon Paramètre de balise WP_Query
Afficher les messages associés à certaines balises.
- tag ( string ) - utilise le slug de balise.
Pour résoudre ce problème, il vous suffit de passer une chaîne séparée par des virgules:
function custom_tags( $query ) {
$query->set( 'tag', 'custom,general' );
}
add_action( 'pre_get_posts', 'custom_tags' );
Créez un bon tax_query
, par exemple:
'tax_query' => array(
array(
'taxonomy' => 'people',
'field' => 'slug',
'terms' => 'bob',
),
),
Mais votre code "code de mise à jour" va échouer pour d'autres raisons également.
$current
est hors de portée.Les changements nus dont vous avez besoin sont les suivants:
function custom_tags( $query ) {
$current = substr($_SERVER[HTTP_Host], 0, -4);
$query->set( 'tag', "general,{$current}" );
}
add_action( 'pre_get_posts', 'custom_tags' );
Mais comme mentionné, je créerais un tax_query
approprié
function custom_tags( $query ) {
$current = substr($_SERVER[HTTP_Host], 0, -4);
$tax = array(
array(
'taxonomy' => 'tag',
'field' => 'slug',
'terms' => $current,
'operator' => 'IN' // This is default
),
);
$query->set( 'tag', "general,{$current}" );
}
add_action( 'pre_get_posts', 'custom_tags' );
L'opérateur peut être changé pour obtenir un comportement différent:
opérateur (chaîne) - Opérateur à tester. Les valeurs possibles sont 'IN', 'NOT IN', 'AND', 'EXISTS' et 'NOT EXISTS'. La valeur par défaut est 'IN'.
Et votre code va s'exécuter sur toutes les requêtes du site, ou presque. Cela va modifier beaucoup de choses , et va certainement casser des choses. Vous devez le limiter aux seuls endroits où vous en avez besoin. Je ne sais pas exactement où et quand cela est censé fonctionner, mais cela devrait être un début:
function custom_tags( $query ) {
if (is_admin()
|| $query->is_main_query()
) {
return;
}
$current = substr($_SERVER[HTTP_Host], 0, -4);
$tax = array(
array(
'taxonomy' => 'tag',
'field' => 'slug',
'terms' => $current,
'operator' => 'IN' // This is default
),
);
$query->set( 'tag', "general,{$current}" );
}
add_action( 'pre_get_posts', 'custom_tags' );