1

これは単純なはずですが、これを行うための正しい構文の良い例を突き止めることはできません。

meta_queries で投稿をフィルタリングしたいのですが、指定した meta_key で並べ替えます。

コードをそのまま実行すると、無限ループが発生します。問題のコードのみを含めました。他のコードは、query_post が実行される基本的なループ コードです。

また、すべての PHP 変数は正しく、問題はありません。

        $args2 = array(
            'meta_key' => '_count-views_all',
            //'meta_value' => $id,
            'orderby' => 'meta_value_num',
            'order' => $sortOrder,
            'posts_per_page' => 9,
            'paged' => $paged,
            'meta_query' => array(  
                        'relation' => 'OR',
                        array(
                            'key' => 'contributorid1',
                            'value' => $id,
                            'compare' => '='
                            ),

                        array(
                            'key' => 'contributorid2',
                            'value' => $id,
                            'compare' => '='
                            )
                        )
        );
        $posts = query_posts($args2); 
    }

これは、相互参照に問題なく完全に機能する別のクエリです。2つは同じページで実行されますが、if elseステートメントにネストされています

        $args1 = array(
            //'meta_key' => 'contributorid1',
            //'meta_value' => $id,
            'order' => $sortOrder,
            'orderby' => 'title',
            'posts_per_page' => 9,
            'paged' => $paged,
            'meta_query' => array(
                        'relation' => 'OR',
                        array(
                            'key' => 'contributorid1',
                            'value' => $id,
                            'compare' => '='
                            ),

                        array(
                            'key' => 'contributorid2',
                            'value' => $id,
                            'compare' => '='
                            )
                        )
        );
        $posts = query_posts($args1);
4

1 に答える 1

1

クエリは私には合理的に見えます。これが無限ループに陥る唯一の方法は、このクエリが post ループ内で実行される場合です。query_posts をそのまま使用すると、メインの投稿ループでポインターに使用されるグローバル $wp_query の状態が変更されます。

ループ内で query_posts にアクセスし続けると、グローバル $wp_query オブジェクトの状態が継続的に変更され、現在の投稿のポインターがその新しいクエリの最初の投稿にリセットされ、最終的に無限ループが作成されます。

このコードがループ内で使用されている場合は、代わりに次のようなものを使用することをお勧めします

$query = new WP_Query($args2);
if ($query->have_posts()) { ... etc; }

その中にグローバル投稿データを設定する必要がある場合は、その投稿をグローバル投稿情報として使用し終わったときに、wp_setup_postdataまたは$query->the_post()およびwp_reset_postdataまたはを適切に使用してください。wp_reset_query

于 2013-01-02T20:48:35.653 に答える