web-dev-qa-db-fra.com

is_category () dans pre_get_posts erreur étrange

J'ai une fonction qui définit l'option posts_per_page en fonction de la catégorie visualisée.

J'ai découvert une erreur que je n'arrive pas à comprendre. D'abord, voici comment j'obtiens l'erreur:

function custom_posts_per_page($query) {

    if ( !is_admin() && is_category(4)) {

    // Leaving this empty or with content

    }

}

add_filter( 'pre_get_posts', 'custom_posts_per_page' );

Donc, j'obtiens une erreur si WP_Debug est mis à true et que j'accède à une catégorie non-exixting. Donc, si j'entre http://localhost/zz/category/uncategorized, il n'y a pas de problème, mais si j'entre par exemple http://localhost/zz/category/aaaaaaaa (la catégorie aaaaaaaa n'existe pas), la page 404 est correctement entrée, mais les erreurs suivantes sont générées:

Notice:  Trying to get property of non-object in C:\xampp\htdocs\zz\wp-includes\query.php on line 3420
Notice:  Trying to get property of non-object in C:\xampp\htdocs\zz\wp-includes\query.php on line 3422
Notice:  Trying to get property of non-object in C:\xampp\htdocs\zz\wp-includes\query.php on line 3424

Qu'est-ce qui ne va pas?

5
Alvaro

Après un peu d'enquête ...

Si vous passez une catégorie à is_category, il utilise get_queried_object pour récupérer des données-- voir la source . get_queried_objectretourne NULL pour les catégories qui n'existent pas. Vous pouvez le démontrer avec:

function custom_posts_per_page($query) {
  var_dump(get_queried_object());
}
add_filter( 'pre_get_posts', 'custom_posts_per_page' );

Chargez une archive de catégorie valide, puis une archive invalide.

La méthode is_category ne vérifie pas si elle possède un objet valide avant d'essayer de l'utiliser, d'où l'erreur. Je considérerais certainement cela comme un bug.

La seule façon de voir les choses est de vérifier l'existence de la catégorie en premier:

function custom_posts_per_page($query) {

    if ( !is_admin() && term_exists(4,'category') && $query->is_category(4)) {

    // Leaving this empty or with content

    }

}

add_filter( 'pre_get_posts', 'custom_posts_per_page' );

Ou gérer la logique vous-même:

function custom_posts_per_page($query) {

    if ( !is_admin() && $query->is_category()) {
      $qobj = get_queried_object();
      if (!empty($qobj)
        && (isset($qobj->taxonomy) && 'category' == $qobj->taxonomy && 4 == $qobj->term_id)
      ) {
        var_dump($qobj);
      }
    // Leaving this empty or with content

    }

}

add_filter( 'pre_get_posts', 'custom_posts_per_page' );

À peine testé. Peut-être un buggy. Caveat emptor. Pas de remboursement.

8
s_ha_dum