web-dev-qa-db-ja.com

Notice:未定義のプロパティ:wpdb :: $ current_post何が問題なのですか?

私はWordPressサイトに取り組んでいて、アーカイブページとカテゴリページの2列に投稿を表示するために次のコードを使用します。

<div id="post-<?php the_ID(); ?>" <?php post_class( 0 === ++$GLOBALS['wpdb']->current_post % 2 ? 'grid col-340 fit' : 'grid col-340' ); ?>>

Debugを "true"に設定すると、次のようになります。

Notice:未定義のプロパティ:D:\ beta\www.beta.dev\wp-includes\wp-db.php内のwpdb :: $ current_post 684行

このコードの何が問題になる可能性がありますか?私はこの通知がWordPressのバージョン4以降で登場したことに気づきました

任意の助けは大歓迎です。ありがとう。

2
Knott

この部分には問題があります。

 ++$GLOBALS['wpdb']->current_post

wpdbクラスのcurrent_postプロパティはありません。ここでは、wpdbクラスとWP_Queryクラスを混同している可能性があります。

また、一般的にグローバルなcurrent_postWP_Queryプロパティを変更したくはありません。グローバルを混乱させれば確実に「噛む」かもしれません;-)

current_postWP_Queryプロパティはすでに$this->current_post++を使ってカウントしていることに注意してください。 next_post()の中で、それはthe_post()の中で呼ばれます。 ここ を参照してください。そのため、ループ内で手動で(++)増やす必要はありません。

これは、static変数の助けを借りて、post_classフィルタを使用した例です。

add_filter( 'post_class', function( $classes ) 
{
    static $instance = 0;

    if( in_the_loop() )
        $classes[] = ( 0 === $instance++ % 2 ) ? 'even' : 'odd';        

    return $classes;
} );

ここではメインクエリループ内のpostクラスをターゲットにしています。偶数/奇数クラスやその他の制限を自分のニーズに合わせて変更することを忘れないでください。

post_classフィルタを使用すると、テンプレート部分の再利用性が向上する可能性があります。

更新

@ toschoのone-liner answer の最初のバージョンを使用していて、グローバルなwpdbオブジェクトの(カウント用の)カスタムcurrent_postプロパティを作成しているようです。それから彼はwpse_post_counterのように接頭辞の付いたカスタムプロパティを使うことを提案しました。しかし、PHPの通知を避けるために初期化が必要なようです。

@kaiserは、グローバルなcurrent_post$wp_queryプロパティを使用する(おそらくグローバルな$wpdbではない)素晴らしい答えを投稿しました here

anonymous関数とglobal変数に関して、ここで promiseを与えたので なので、書き直すべきです:私の editを見てくださいここで - ここではuseキーワードを使用してグローバル$wp_queryオブジェクトを渡します。

6
birgire