web-dev-qa-db-de.com

is_category () in pre_get_posts seltsamer Fehler

Ich habe eine Funktion, die die posts_per_page-Option abhängig von der angezeigten Kategorie festlegt.

Ich habe einen Fehler entdeckt, den ich nicht wirklich verstehen kann: Zuerst erhalte ich den Fehler wie folgt:

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

Daher erhalte ich dort eine Fehlermeldung, wenn WP_Debug auf true gesetzt ist und wenn ich auf eine nicht vorhandene Kategorie zugreife. Wenn ich also http://localhost/zz/category/uncategorized eingebe, gibt es kein Problem, aber wenn ich zum Beispiel http://localhost/zz/category/aaaaaaaa eingebe (Kategorie aaaaaaaa existiert nicht), wird die 404-Seite korrekt angezeigt, es werden jedoch folgende Fehler ausgegeben:

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

Was ist falsch?

5
Alvaro

Nach ein bisschen Nachforschungen ...

Wenn Sie eine Kategorie an is_category übergeben, wird get_queried_object zum Abrufen von Daten verwendet-- siehe Quelle . get_queried_objectgibt NULL für Kategorien zurück, die nicht existieren. Das können Sie demonstrieren mit:

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

Laden Sie ein gültiges und dann ein ungültiges Kategoriearchiv.

Die is_category-Methode prüft nicht, ob es ein gültiges Objekt gibt, bevor sie versucht, dieses Objekt zu verwenden, daher der Fehler. Ich würde das definitiv als Fehler betrachten.

Die einzige Möglichkeit, die ich sehe, besteht darin, zuerst die Existenz der Kategorie zu überprüfen:

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

Oder handhaben Sie die Logik selbst:

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

Kaum getestet. Möglicherweise fehlerhaft. Vorbehalt Emptor. Keine Rückerstattung.

8
s_ha_dum