wake-up-neo.com

So zeigen Sie zukünftige Posts an: Eine geänderte Abfrage ergibt weiterhin 404

Ich habe ein sehr seltsames Problem und stecke fest. Ich möchte, dass auf der einzelnen Seite Posts mit dem post_status "Publish" und "Future" angezeigt werden. Also habe ich diesen Code zu meiner functions.php in meinem Theme hinzugefügt:

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

Dadurch wird die Abfrage erfolgreich geändert. Aber ich sehe immer noch eine 404-Seite, wenn ich nicht als Administrator angemeldet bin. Also habe ich die Datenbankabfragen verfolgt. Folgendes habe ich beim Aufruf von print_r gefunden ($ wpdb-> Abfragen); :

[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
    )

Also wird meine Abfrage ausgeführt, aber dann wird die Funktion wp_old_slug_redirect () in wp-includes/query.php aufgerufen und dort gibt die Funktion is_404 () true zurück. Also versucht Wordpress, einen alten Slug zu finden (der natürlich nicht existiert), schlägt fehl und leitet dann zu 404 weiter.

Wenn ich print_r ($ wp_query) aufrufe; In der header.php meines Themas scheint die Abfrage erfolgreich geändert worden zu sein, aber seltsamerweise werden keine Ergebnisse zurückgegeben. Mindestens [posts] ist leer. Wenn ich [request] direkt auf meinem MySQL-Server ausführe, erhalte ich genau das Ergebnis, das ich suche.

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] => 
)

Ich bin verrückt. Was mache ich falsch? Was vermisse ich.

Ich hoffe, diese Frage ist nicht zu spezifisch und hilfreich für andere da draußen.

Vielen Dank! Ole

2

Sie treten auf eine Abfragemine. Es ist leicht anzunehmen, dass:

  1. Sie können die Abfrage ändern.
  2. Parameter sind gut definiert.
  3. Durch Ändern von Parametern können Sie also die gewünschten Ergebnisse erzielen.

In Wirklichkeit gibt es viele Abfrageparameter, die zu schrecklichen Sackgassen führen. WordPress wurde entwickelt, um öffentliche Beiträge abzufragen und anzuzeigen. Jeder Versuch, es zu umgehen, geht mit ernstem Kummer einher.

In Ihrem speziellen Fall sieht die generierte SQL-Abfrage wie folgt aus (für Entwurfspost):

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

Sieht vollkommen gesund aus, nicht wahr? Nun, außer dass in dem Beitrag mit dem Titel "Entwurf" das Feld post_name auf nichts gesetzt ist .

Es ist nicht die Situation "Post ist immer eine Post". Die Situation "Posts werden subtil anders und voller Edge-Fälle".

Wann immer Sie ein komplexeres Konzept benötigen, z. B. einen "zukünftigen" Beitrag, vertrauen Sie nicht auf WP core, um dies zu tun . Es wird ein herzliches Lachen haben und dann die nächsten drei Tage deines Lebens ruinieren.

  1. Implementieren Sie komplexe Daten als benutzerdefinierte Felddaten.
  2. Fragen Sie es entsprechend ab.
1
Rarst

Ich werde es nicht kommentieren lassen, weil ich noch nicht cool genug bin.

Haben Sie darüber nachgedacht, die WP_Query von WordPress zu verwenden, um die Schleife zu ändern, anstatt eine Funktion zu erstellen?

$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;

Wenn Sie möchten, dass es sich nur auf einer bestimmten Seite befindet, können Sie immer page- [Vorlagenname] .php und dann content- [Vorlagenname] .php erstellen, um es aufzurufen.

Lassen Sie mich wissen, ob Sie hier etwas völlig anderes anstreben, aber wenn Sie nur versuchen, einen anderen Post-Status-Typ auf der Seite anzuzeigen, würde ich die Schleife ändern.

0
Remy Sheppard