3

いくつかの背景:

  • アーカイブテンプレートのデフォルトのメインクエリを置き換えて、キー「日付」に対するメタ値が特定の値の間にあるカスタム投稿タイプ(「日」)のサブセットを返そうとしています
  • 'days'カスタム投稿タイプには'dates'のカスタム変数フィールドがあり、エポック形式('U')で保存された、その投稿に関連付けられた各日付の標準wp_postmetaテーブルに個々のデータベース行を格納します。
  • SQLクエリが正しく機能していると確信しています。返される投稿IDは、照会された日付範囲のいずれの場合も正しいように見えます。

関数ファイルで次のクエリを実行しています。

   function modify_queries( $query ) { 
        global $wpdb;
        if ( $query->is_post_type_archive('days') && $query->is_main_query() ) {
            // Get Days with a date within the archive range
            $year = substr($query->query_vars['m'],0,4);
            $month = substr($query->query_vars['m'],4,2);
            $day = substr($query->query_vars['m'],6,2);

            if (is_year()) {
                $startDate = date('U', mktime(0, 0, 0, 1, 1, $year));
                $endDate = date('U', mktime(0, 0, 0, 12, 31, $year));
            }
            if (is_month()) {
                $startDate = date('U', mktime(0, 0, 0, $month, 1, $year));
                $endDate = date('U', mktime(0, 0, 0, $month, cal_days_in_month(CAL_GREGORIAN, $month, $year), $year));
            }
            if (is_day()) {
                $startDate = date('U', mktime(0, 0, 0, $month, $day, $year));
                $endDate = date('U', mktime(0, 0, 0, $month, $day, $year));
            }

            $request  = "SELECT ID FROM $wpdb->posts, $wpdb->postmeta";
            $request .= " WHERE $wpdb->posts.ID = $wpdb->postmeta.post_id";
            $request .= " AND post_status='publish' AND post_type='days'";
            $request .= " AND $wpdb->postmeta.meta_key = 'dates' AND $wpdb->postmeta.meta_value >= $startDate AND $wpdb->postmeta.meta_value <= $endDate LIMIT 0 , 30";
            $postsList = $wpdb->get_results($request,ARRAY_N);
            if ($postsList) {


                foreach ($postsList as $thePost) {
                    $thePostList[] = $thePost[0];
                }
                $query->set( 'post__in', $thePostList);
                $query->set( 'post_type', 'days');

                return;
            } else {
                return false;
            }

}
add_action( 'pre_get_posts', 'modify_queries',1 );

私の理解では、これはクエリの出力を取得し、通常のクエリをSQLクエリから返されたIDを使用するクエリに置き換えるだけですが、最近の5日間の投稿を返すだけです。

現在、archive.phpファイルは純粋に次のもので構成されているため、干渉を排除できます。

<?
while ( have_posts() ) : the_post();
global $post;
the_title();
endwhile;
?>  

最近公開された5つの「日」の投稿を取得しましたが、pre_get_postsフィルターが通過するはずのIDを無視しているようです。

問題の一部が「p」ではなく「post_id」をメインクエリに設定することに関連しているという卑劣な疑いがありますが、後者ではまったく結果が得られないようです。

私は探し回っていますが、query_postsの代わりとしてどれほど有用で有益であるかを除いて、pre_get_postsに関する多くのドキュメントを見つけることができません。

ライブデバッグ出力:http://dev.daysoftheyear.com/days/2012/10

4

2 に答える 2

3

pre_get_postフィルタに関するドキュメントは、http://codex.wordpress.org/Plugin_API/Action_Reference/pre_get_postsにあります。

問題は、実際には、取得するpost_idsをどのように設定しているかにあるように見えます。上記のリンクを参照すると$query、フィルターに渡されるオブジェクトに設定できるさまざまな値を確認できますpost_idが、それらの1つではないため、設定すると「機能」し、「を設定すると「動作しません」p。後者は単一の投稿ID用であるため、100が必要な場合は、を使用します$query->set('p', 100)。投稿IDが配列内にある結果を返したい場合は、を使用します$query->set('post__in', array(100, 120))。SQLコードはIDを返すだけなので、オブジェクトを返すのではなく、配列を直接取得できます。タイトルとprint_r行のエコーはデバッグしているだけだと思います。

// get results as a numeric array
$post_ids = $wpdb->get_results($request, ARRAY_N);
// pass post id array to $query
$query->set( 'post__in', $post_ids );

に既存の競合するパラメータが設定されている場合も、結果が得られない可能性があります$query。これらの値をチェックしてvar_dump($query->query_vars)、競合する可能性のあるものを空の文字列に設定できます-あなたの場合$query->set( 'm', '' );

于 2012-10-20T23:29:20.663 に答える
0

私はそれを釘付けにしたと思います。'm' に空白の値を指定して、日付ベースのクエリであると認識されないようにしました。ありがとう!:)

于 2012-10-21T11:20:33.760 に答える