web-dev-qa-db-fra.com

Comment afficher les publications futures - La requête modifiée génère toujours 404

J'ai un problème très étrange et je suis coincé. Je veux que la page unique affiche les messages avec le statut post_state de publication et future. J'ai donc ajouté ce code à mon functions.php dans mon thème:

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

Cela change avec succès la requête. Mais je vois toujours une page 404 quand je ne suis pas connecté en tant qu'administrateur. J'ai donc tracé les requêtes de la base de données. Voici ce que j'ai trouvé en appelant print_r ($ wpdb-> requêtes); :

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

Donc, ma requête est exécutée, mais la fonction wp_old_slug_redirect () de wp-includes/query.php est appelée et la fonction is_404 () renvoie true. Donc, Wordpress essaie de trouver un vieux slug (qui n'existe bien sûr pas), échoue puis redirige vers 404.

Quand j'appelle print_r ($ wp_query); dans le header.php de mon thème, il semble que la requête ait été modifiée avec succès, mais étrangement, il ne renvoie aucun résultat. Au moins [posts] est vide. Lorsque j'exécute [request] directement sur mon serveur MySQL, j'obtiens exactement le résultat recherché.

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

Je suis hors d'esprit. Qu'est-ce que je fais mal? Qu'est-ce que je rate.

J'espère que cette question n'est pas trop spécifique et qu'elle est utile pour quelqu'un d'autre.

Merci! Ole

2
Øle Bjarnstroem

Vous marchez sur une requête mine. Il est facile de supposer que:

  1. Vous pouvez changer la requête.
  2. Les paramètres sont bien définis.
  3. Donc, en modifiant les paramètres, vous pouvez obtenir les résultats souhaités.

En réalité, il y a beaucoup de paramètres de requête, ce qui conduit à de terribles impasses. WordPress est conçu pour interroger et afficher les publications publiques. Toute tentative de le contourner s'accompagne d'un chagrin grave.

Dans votre cas spécifique, voici à quoi ressemble la requête SQL générée (pour le brouillon):

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

Semble parfaitement saine, n'est-ce pas? Eh bien, sauf que l'article intitulé "Brouillon" n'a pas de champ post_name défini sur quoi que ce soit .

Ce n'est pas "post est toujours un post" situation. C'est "les messages vont être subtilement différents et plein de cas Edge".

Chaque fois que vous avez besoin d'un concept plus complexe, tel que "future" post, ne vous fiez pas à WP core pour le faire . Il aura un rire copieux, puis gâchera les trois prochains jours de votre vie.

  1. Implémentez des données complexes en tant que données de champ personnalisées.
  2. Interrogez-le en conséquence.
1
Rarst

Cela ne me laissera pas de commentaire car je ne suis pas encore assez cool.

Avez-vous envisagé d'utiliser WP_Query de wordpress pour modifier la boucle au lieu de créer une fonction?

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

Si vous souhaitez qu'il ne se trouve que sur une page spécifique, vous pouvez toujours créer page- [nom du modèle] .php, puis content- [nom-modèle] .php pour l'appeler.

Faites-moi savoir si vous recherchez quelque chose de complètement différent ici, mais si vous essayez simplement d'afficher un type de post-statut différent sur la page, je modifierai la boucle.

0
Remy Sheppard