web-dev-qa-db-fra.com

Pourquoi mes publications ne sont-elles pas affichées?

Je crée un thème pour mon site portfolio. Après un certain temps de recherche par essais et erreurs et presque toujours, je suis coincé.

Le contenu du site sera très minimal. J'ai donc décidé de créer un site Web d'une page. J'utilise get_pages($args); pour afficher chaque page de mon fichier front-page.php.

Cela fonctionne très bien. Maintenant, voici où je suis coincé ... J'aimerais utiliser une page pour afficher les articles de mon blog, qui seraient inclus dans mon flux d'une page et appelés dans mon WP_Query de la même manière que les autres pages.

Jusqu'à présent, j'ai essayé la méthode la plus documentée que je puisse trouver. qui consiste à changer la page utilisée pour afficher les messages dans Paramètres> Lecture.

Confirmer

J'ai une page d'accueil statique (front-page.php) pour laquelle un modèle de page a été déclaré dans une page appelée home. En me permettant de le définir dans les paramètres de lecture, j'ai créé une page appelée blog pour la même raison (le modèle est défini sur defualt).

enter image description here

Mes messages ne sont pas chargés dans la page de blog définie ici.

J'ai lu qu'une requête personnalisée pourrait interférer, mais j'ai vérifié cela et ce n'est pas le cas dans ma situation.

Mise à jour pour utiliser WP_Query plutôt get get_pages

front-page.php

    <?php

        $args = array (
            'post_type' => 'page',
            'order' => 'ASC',
            'orderby' => 'menu_order',
            'posts_per_page' => 5,
        );

        $query = new WP_Query( $args );

        if ( $query->have_posts() ) {
            while ( $query->have_posts() ) {
                $query->the_post(); ?>

                <a data-magellan-destination="<?php echo $post->post_name; ?>" name='<?php echo $post->post_name; ?>'></a>
                <div id="<?php echo $post->post_name; ?>" class="page-wrap full">
                    <h2><?php the_title() ?></h2>
                        <?php the_content() ?>
                </div>

            <?php }
        } else {
    }

        wp_reset_postdata();
    ?>

Est-ce que quelqu'un a déjà rencontré ce genre de situation? Ou suis-je manque quelque chose avec ma boucle qui empêcherait le chargement de la publication de blog. J'apprends php et WordPress et frappe ma limite d'expérience. Je pense que l’appel au contenu de la page du blog même empêche les informations postales de passer? Je ne suis pas sûr. Toute orientation serait appréciée.

Merci d'avance

2
JohnMcCarthy

Cela ne fonctionne pas comme vous le pensez car get_pages ne fait pas ce que vous pensez.

Premièrement, comprenez que toutes les pages, tout le contenu, dans WordPress, est vraiment un "post". Une "page" est juste un type spécial de publication.

Maintenant, dans un environnement normal, vous n’appelleriez rien "get_". C’est la raison pour laquelle vous êtes confus, car vous obtenez directement des choses et vous évitez ainsi tout ce que WordPress fait automatiquement pour vous. Lorsque vous appelez get_pages, ces pages sont directement récupérées. Il ne prend pas en compte le paramètre "page d'accueil statique", il fait simplement ce qui est dit et récupère le contenu de ces pages.

Voir, WordPress analyse automatiquement l'URL et détermine ce qui doit être affiché sur cette URL. Cela se produit selon le système de réécriture. Les règles de réécriture transforment une "jolie" URL en une série de paramètres pour le système WP_Query. Le système WP_Query extrait les articles à afficher et les enregistre dans une $ wp_query globale. Le système de gabarit détermine ensuite le gabarit à extraire du thème en fonction des diverses données de ce WP_Query global, puis le charge. Le modèle implémente The Loop, qui affiche les publications contenues dans la requête globale $ wp_query.

Pour résumer:

  • L'URL est traitée par les réécritures
  • Réécrit crée des paramètres de requête
  • Paramètres de requête utilisés pour déterminer les publications à obtenir
  • Le système de modèle examine la requête pour charger le modèle approprié
  • Le modèle approprié affiche les publications de la requête

Chaque étape se passe ici toute seule. Vous ne le contrôlez pas vraiment, c'est ce que WordPress fait au démarrage.

Le paramètre "Page d'accueil statique" modifie la troisième étape. La requête obtient la "page d'accueil". Il est alors décidé de récupérer les publications du blog ou d'obtenir une page statique. De même, lorsque vous lui indiquez d’obtenir une page spécifique, si cette page est configurée pour être le blog, la requête obtiendra les publications à afficher à la place. Tout le reste se passe normalement.

En effectuant vous-même les get_pages, vous ignorez tout ici et vous vous contentez de demander de récupérer ces pages et de les afficher, point à la ligne. Rien d'autre dans le système n'aura d'incidence sur cela, car vous avez tout contourné.

Si vous souhaitez tout afficher sur une seule page, vous devez obtenir exactement ce que vous souhaitez afficher, puis l'afficher. En bref, "Page d'accueil statique" ne fait pas en sorte que les pages aient un contenu différent, il modifie simplement le contenu choisi par la requête à afficher sur ces pages particulières. Si vous souhaitez obtenir les publications, vous devez appeler get_posts sous une forme ou utiliser un WP_Query personnalisé, ou modifier la requête principale, ou autre chose. La fonction get_pages () ne peut pas vraiment récupérer les articles de blog. C'est possible, mais ça ne sert à rien puisque get_posts () le fait plutôt.

6
Otto

Avant de commencer, je vous recommande de lire: Création d’une page de garde statique

OK, lorsque vous sélectionnez une page de garde statique, l’un des modèles suivants est utilisé pour afficher la page de garde

  • front-page.php

  • page.php

  • tout autre modèle de page personnalisé

C'est la partie que vous avez déjà en train de travailler d'après ce que je peux comprendre de votre question

Maintenant, la page du blog. Wordpress considère la page définie comme une page de blog comme votre page d'accueil et je pense que c'est ici que vous êtes bloqué. Wordpress recherche automatiquement un modèle appelé home.php. Si ce modèle est introuvable, Wordpress utilisera index.php. Votre blog.php est simplement ignoré. Comme index.php et home.php sont uniquement configurés pour le type de message post, rien ne s'affiche lorsque vous visitez la page de votre blog.

Avant de l'exécuter, vous devez modifier la requête principale pour inclure page en tant que type de publication dans votre page de blog à l'aide de pre_get_posts . Ne créez pas de requête personnalisée pour apporter des modifications à la page d'accueil ou à une page d'archive, car elles posent problème, notamment en matière de pagination. Vous pouvez simplement ajouter ce qui suit à votre functions.php. Notez que la vérification is_home() est utilisée pour modifier uniquement la requête principale sur la page d'accueil, à savoir la page de votre blog.

function include_page_in_home( $query ) {
    if ( $query->is_home() && $query->is_main_query() ) {
        $query->set( 'post_type', array( 'post', 'page' ) ); // Remove post if you only need page
    }
}
add_action( 'pre_get_posts', 'include_page_in_home' );

Pour plus de paramètres que vous pouvez extraire WP_Query , car les deux utilisent les mêmes paramètres. Assurez-vous simplement que vous utilisez la boucle par défaut dans home.php ou index.php.

Juste pour info, utilisez ce qui suit dans votre functions.php lors du développement, n’utilisez pas it dans un site de production. Ceci imprimera le modèle actuel utilisé dans la section d'en-tête de la page si vous ne savez pas quel modèle est utilisé par une page spécifique.

add_action('wp_head', 'show_template');
function show_template() {
    global $template;
    print_r($template);
}

Juste pour prolonger la réponse de @Otto, vous pouvez utiliser ce qui suit dans votre page de garde.php pour afficher vos pages. Ceci est juste une version copiée du codex que vous pouvez modifier au besoin

<?php

// The Query
$the_query = new WP_Query( 'posts_per_page=-1&post_type=page' );

// The Loop
if ( $the_query->have_posts() ) {
    echo '<ul>';
    while ( $the_query->have_posts() ) {
        $the_query->the_post();
        echo '<li>' . get_the_title() . '</li>';
    }
    echo '</ul>';
} else {
    // no posts found
}
/* Restore original Post Data */
wp_reset_postdata();

Ressources supplémentaires

EDIT

Si vous avez besoin d'afficher les trois derniers posts de votre blog sur votre page de garde.php, vous pouvez simplement le faire avec une requête personnalisée, quelque chose comme ceci

<?php

// The Query
$the_query = new WP_Query( 'posts_per_page=3&order=DESC' );

// The Loop
if ( $the_query->have_posts() ) {
    echo '<ul>';
    while ( $the_query->have_posts() ) {
        $the_query->the_post();
        echo '<li>' . get_the_title() . '</li>';
    }
    echo '</ul>';
} else {
    // no posts found
}
/* Restore original Post Data */
wp_reset_postdata();
2
Pieter Goosen