web-dev-qa-db-fra.com

Doit utiliser un plugin causant une erreur de requête

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' );
1
Joe Bobby

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' );
2
Howdy_McGee

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.

  1. $current est hors de portée.
  2. Et votre variable ne se développera pas entre guillemets simples

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' );
1
s_ha_dum