web-dev-qa-db-ja.com

pre_get_postsのis_category()が奇妙なエラー

閲覧したカテゴリに応じてposts_per_pageオプションを設定する機能があります。

私は本当に理解できないエラーを発見しました。最初にこれが私がエラーを得る方法です:

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

そのため、WP_Debugがtrueになっていて、存在しないカテゴリにアクセスしたときには、エラーが発生します。 http://localhost/zz/category/uncategorizedと入力しても問題ありませんが、例えばhttp://localhost/zz/category/aaaaaaaa(カテゴリaaaaaaaaは存在しません)と入力すると、404ページに正しく移動しますが、次のエラーがスローされます。

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

なにが問題ですか?

5
Alvaro

ちょっと調べた後….

カテゴリをis_categoryに渡すと、データを取得するためにget_queried_objectを使用します - ソースを参照してくださいget_queried_objectは存在しないカテゴリに対してNULL を返します。あなたはそれを実証することができます:

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

有効なカテゴリアーカイブをロードしてから、無効なアーカイブをロードしてください。

is_categoryメソッドは、そのオブジェクトを使用しようとする前に、それが有効なオブジェクトを持っているかどうかをチェックしません。そのため、エラーになります。私は間違いなくそれをバグと考えるでしょう。

私がこれを回避する唯一の方法は、まずカテゴリの存在を確認することです。

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

またはロジックを自分で処理します。

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

ほとんどテストされていません。おそらくバグがあります。買い手責任負担。返金なし。

8
s_ha_dum