web-dev-qa-db-ja.com

今後の投稿を表示する方法 - 変更されたクエリはまだ404をもたらします

私は非常に奇妙な問題を抱えています、そして私は立ち往生しています。単一のページに、publishとfutureのpost_statusを使って投稿を表示したいと思います。だから私は私のテーマで私のfunctions.phpにこのコードを追加しました:

function display_future_posts() {
    global $wp_query;
    if( !is_admin() && $wp_query->is_main_query() && $wp_query->is_single()) {
        $wp_query->set( 'post_status', array('future', 'publish', 'draft') );
    }
}
add_action('pre_get_posts', 'display_future_posts');

これでクエリは正常に変更されました。管理者としてログインしていないのに、404ページが表示されます。だから私はdbクエリをトレースしました。これがprint_r($ wpdb-> queries)を呼び出したときに見つけたものです。 :

[16] => Array
    (
        [0] => SELECT   wp_posts.* FROM wp_posts  WHERE 1=1  AND ( ( YEAR( post_date ) = 2014 AND MONTH( post_date ) = 9 ) ) AND wp_posts.post_name = 'my-life' AND wp_posts.post_type = 'post' AND (wp_posts.post_status = 'publish' OR wp_posts.post_status = 'future')  ORDER BY wp_posts.post_date DESC 
        [1] => 0.000303030014038
        [2] => require('wp-blog-header.php'), wp, WP->main, WP->query_posts, WP_Query->query, WP_Query->get_posts
    )

[17] => Array
    (
        [0] => SELECT post_id FROM wp_postmeta, wp_posts WHERE ID = post_id AND post_type = 'post' AND meta_key = '_wp_old_slug' AND meta_value = 'my-life' AND YEAR(post_date) = 2014 AND MONTH(post_date) = 9
        [1] => 0.000878095626831
        [2] => require('wp-blog-header.php'), require_once('wp-includes/template-loader.php'), do_action('template_redirect'), call_user_func_array, wp_old_slug_redirect
    )

[18] => Array
    (
        [0] => SELECT ID FROM wp_posts WHERE post_name LIKE 'my-life%' AND post_type IN ('post', 'page', 'attachment') AND YEAR(post_date) = 2014 AND MONTH(post_date) = 9 AND post_status = 'publish'
        [1] => 0.00031304359436
        [2] => require('wp-blog-header.php'), require_once('wp-includes/template-loader.php'), do_action('template_redirect'), call_user_func_array, redirect_canonical, redirect_guess_404_permalink
    )

だから私のクエリが実行されますが、その後wp-includes/query.phpの関数wp_old_slug_redirect()が呼び出され、そこで関数is_404()がtrueを返します。そのため、Wordpressは古いスラッグ(もちろん存在しません)を見つけようとして失敗し、その後404にリダイレクトします。

Print_r($ wp_query)を呼び出すと私のテーマのheader.phpでは、クエリは正常に変更されたようですが、奇妙なことに結果が返されません。少なくとも[posts]は空です。 MySQLサーバーで直接[request]を実行すると、探している結果とまったく同じ結果が得られます。

WP_Query Object
(
    [query] => Array
        (
            [page] => 
            [year] => 2014
            [monthnum] => 09
            [name] => my-life
        )

    [query_vars] => Array
        (
            [page] => 0
            [year] => 2014
            [monthnum] => 9
            [name] => my-life
            [error] => 
            [m] => 
            [p] => 0
            [post_parent] => 
            [subpost] => 
            [subpost_id] => 
            [attachment] => 
            [attachment_id] => 0
            [static] => 
            [pagename] => 
            [page_id] => 0
            [second] => 
            [minute] => 
            [hour] => 
            [day] => 0
            [w] => 0
            [category_name] => 
            [tag] => 
            [cat] => 
            [tag_id] => 
            [author] => 
            [author_name] => 
            [feed] => 
            [tb] => 
            [paged] => 0
            [comments_popup] => 
            [meta_key] => 
            [meta_value] => 
            [preview] => 
            [s] => 
            [sentence] => 
            [fields] => 
            [menu_order] => 
            [category__in] => Array
                (
                )

            [category__not_in] => Array
                (
                )

            [category__and] => Array
                (
                )

            [post__in] => Array
                (
                )

            [post__not_in] => Array
                (
                )

            [tag__in] => Array
                (
                )

            [tag__not_in] => Array
                (
                )

            [tag__and] => Array
                (
                )

            [tag_slug__in] => Array
                (
                )

            [tag_slug__and] => Array
                (
                )

            [post_parent__in] => Array
                (
                )

            [post_parent__not_in] => Array
                (
                )

            [author__in] => Array
                (
                )

            [author__not_in] => Array
                (
                )

            [meta_query] => Array
                (
                )

            [post_status] => Array
                (
                    [0] => future
                    [1] => publish
                )

            [ignore_sticky_posts] => 
            [suppress_filters] => 
            [cache_results] => 1
            [update_post_term_cache] => 1
            [update_post_meta_cache] => 1
            [post_type] => 
            [posts_per_page] => 7
            [nopaging] => 
            [comments_per_page] => 50
            [no_found_rows] => 
            [order] => DESC
        )

    [tax_query] => 
    [meta_query] => WP_Meta_Query Object
        (
            [queries] => Array
                (
                )

            [relation] => 
        )

    [date_query] => 
    [request] => SELECT   wp_posts.* FROM wp_posts  WHERE 1=1  AND ( ( YEAR( post_date ) = 2014 AND MONTH( post_date ) = 9 ) ) AND wp_posts.post_name = 'my-life' AND wp_posts.post_type = 'post' AND (wp_posts.post_status = 'publish' OR wp_posts.post_status = 'future')  ORDER BY wp_posts.post_date DESC 
    [posts] => Array
        (
        )

    [post_count] => 0
    [current_post] => -1
    [in_the_loop] => 
    [comment_count] => 0
    [current_comment] => -1
    [found_posts] => 1
    [max_num_pages] => 0
    [max_num_comment_pages] => 0
    [is_single] => 
    [is_preview] => 
    [is_page] => 
    [is_archive] => 
    [is_date] => 
    [is_year] => 
    [is_month] => 
    [is_day] => 
    [is_time] => 
    [is_author] => 
    [is_category] => 
    [is_tag] => 
    [is_tax] => 
    [is_search] => 
    [is_feed] => 
    [is_comment_feed] => 
    [is_trackback] => 
    [is_home] => 
    [is_404] => 1
    [is_comments_popup] => 
    [is_paged] => 
    [is_admin] => 
    [is_attachment] => 
    [is_singular] => 
    [is_robots] => 
    [is_posts_page] => 
    [is_post_type_archive] => 
    [query_vars_hash] => 7ce0208af83c782976286abc2d021484
    [query_vars_changed] => 1
    [thumbnails_cached] => 
    [stopwords:WP_Query:private] => 
)

私は機知に欠けています。何がおかしいのですか?何が足りないのですか。

私はこの質問があまり具体的ではないことを願っています、そしてそれがそこにいる他の誰かにとって役に立つことです。

ありがとうございます。オレ

2

あなたは質問地雷を踏んでいます。それを仮定するのは簡単です:

  1. あなたはクエリを変更することができます。
  2. パラメータは明確に定義されています。
  3. それで、パラメータを変えることによって、あなたは望ましい結果を達成することができます。

実際にはたくさんのクエリパラメータがあり、それに触れると恐ろしい行き止まりになります。 WordPressは、公開されている投稿を検索して表示するように設計されています。それを回避しようとする試みはすべて深刻な悲しみを伴います。

あなたの特定のケースでは、これは生成されたSQLクエリがドラフト投稿のために似ているものです:

SELECT wp_posts.*
FROM wp_posts
WHERE 1=1 AND wp_posts.post_name = 'draft' 
    AND wp_posts.post_type = 'post' 
    AND ((
        wp_posts.post_status = 'publish' 
        OR wp_posts.post_status = 'future' 
        OR wp_posts.post_status = 'draft'
        ))
ORDER BY wp_posts.post_date DESC

完璧に見えますね。ただし、 "Draft"というタイトルの投稿にpost_nameフィールドが設定されていないことを除けば。

「投稿は常に投稿」という状況ではありません。 「投稿は微妙に異なり、Edgeのケースでいっぱいです」という状況です。

"future"投稿のようにもっと複雑な概念が必要なときはいつでもWP coreを信頼しないでください。それは心からの笑いを持ち、それからあなたの人生の次の3日間を台無しにするでしょう。

  1. カスタムフィールドデータとして複雑なデータを実装します。
  2. それに応じてそれを問い合わせてください。
1
Rarst

私はまだ十分にクールではないのでそれは私がコメントさせることはできません。

関数を作成する代わりに、ワードプレスのWP_Queryを使用してループを変更することを検討しましたか?

$new_query = WP_Query(
    'post-status' => array (
        'future',
        'publish',
        'draft',
    ),
);

if ( $new_query->have_posts() ) :
    while ($new_query->have_posts() ) : the_post(); ?>
        <h1><?php echo the_title(); ?></h1>
    <?php endwhile;
endif;

特定のページだけに配置する必要がある場合は、常にpage- [template name] .phpを作成してからcontent- [template-name] .phpを作成して呼び出すことができます。

あなたがここで完全に異なる何かをしているかどうか私に知らせてください、しかしあなたがただページ上に異なるポストステータスタイプを表示しようとしているならば、私はループを変更するでしょう。

0
Remy Sheppard