Obtenez du contenu de publication en dehors de la boucle


Réponses:


39

Vous pouvez utiliser get_page()pour renvoyer l' $postobjet d'une page statique:

$page_id = 302;
$page_object = get_page( $page_id );
echo $page_object->post_content;

modifier

De même, vous pouvez utiliser get_post()pour renvoyer l' $postobjet d'un message:

$post_id = 302;
$post_object = get_post( $post_id );
echo $post_object->post_content;

Les shortcodes fonctionnent-ils toujours lorsque vous les utilisez?
Tim Baas

Je viens de découvrir que non. Utilisez d' setup_postdata( $post );abord, après cela, vous pouvez utiliserthe_content();
Tim Baas

4
Vous pourriez simplement courirapply_filters( 'the_content', $post_object->post_content );
Nathan Powell

6

pour obtenir le contenu du message en dehors de la boucle, vous pouvez écrire quelque chose comme ça

global $post;
$content = $post->post_content;

if ( !empty( $content ) ) :
    echo $content;
endif;

3

Si votre contenu comprend des shortcodes, vous devez utiliser:

$post_id = 22;        
$post_object = get_post( $post_id );        
echo do_shortcode( $post_object->post_content );


Cette page ne fournit pas de raison impérieuse d'éviter do_shortcodeautre chose que de dire: «Cela pourrait être lent» et «Vous pouvez simplement utiliser la fonction appelée par le code court». Ces raisons ne sont valables que pour les plus triviales pour les scénarios les plus simples. Il échoue lorsque le shortcode est généré ailleurs, ou s'il existe plusieurs shortcodes, ou des shortcodes mélangés à d'autres contenus et balises. Sans raison impérieuse, je ne suis pas d'accord avec la déclaration à éviter do_shortcode. Cela sent comme une optimisation prématurée .
Jeff

Et cela augmente également le couplage entre votre code et le code du shortcode d'origine. Si la méthode de sauvegarde du shortcode est renommée ou que la signature change, votre code se cassera.
Jeff

1

Pour être complet, en s'appuyant sur le commentaire de Tim ci-dessus et inspiré par l'article de Stephen Harris , la solution qui permet l'utilisation de the_content()est:

$post_id = 302;
global $post;
$post = get_post($post_id);
setup_postdata( $post );
the_content();
wp_reset_postdata( $post );

Et donc les filtres sont appliqués (des paragraphes seront insérés, etc.) et les shortcodes fonctionnent.


Cela a failli planter mon navigateur: / La suppression de l'esperluette aide, mais ce n'est toujours pas l'analyse des shortcodes.
Zade

0

Puisque vous connaissez votre ID de publication cible (302), vous pouvez trouver utile cette syntaxe abrégée que vous pouvez utiliser hors de la boucle (bien que ses performances soient à peu près les mêmes que dans toute autre méthode alternative :)

echo(get_post_field('post_content',302));

0

Vous pouvez utiliser la get_post_data()fonction pour sortir le post de la boucle. Placez ce code dans functions.php

function get_post_data($postId) {
    global $wpdb;
    return $wpdb->get_row("SELECT * FROM $wpdb->posts WHERE ID=$postId");
}

puis ajoutez cet extrait pour plus de contrôle sur le processus

<?php $data = get_post_data(302);
    echo $data->post_date;     // post date
    echo $data->post_title;    // post title
    echo $data->post_content;  // post content
    echo $data->comment_count; // comments number
?>

0

Vous pouvez utiliser, comme indiqué, la solution avec get_postet $post_object->post_content, mais n'oubliez pas d'ajouter une vérification avant d'utiliser cet objet de publication:

function get_post_content( $post_id = null ) {
    $post_object = get_post( $post_id );
    if ( ! $post_object ) { return ''; }
    //else

    return apply_filters('the_content', $post_object->post_content);
}

echo get_post_content( $other_post_id );


-2

utiliser wp_reset_postdata();cela fonctionnera .. (édité)

<?php 
$args = array(
        'post_type' => 'posttype',
        'p' => 'post_id'
       );
$the_query = new WP_Query( $args );
if( have_posts() ) : while ( $the_query->have_posts() ) : $the_query->the_post(); ?>
        <?php the_content(); ?>
    <?php endwhile; endif; 
wp_reset_postdata();
?>

posttype peut être "post", "page" ou votre type de publication personnalisé. Ici p = 302 est votre identifiant de publication. J'espère que cela fonctionnera.


2
N'utilisez jamais query_postssauf si vous avez besoin de casser les fonctionnalités de la page. Utilisez toujours WP_Queryou get_postspour des requêtes personnalisées :-)
Pieter Goosen

oui .. vous avez raison .. Il peut aussi bien Wp_Query .. même résultat trouvé ..
Jahirul Islam Mamun

Il y a aussi le pre_get_postsfiltre, et the_post. Tant de détails.
Nathan Powell

-3

vous pouvez mettre du contenu dans une catégorie X et utiliser query_post avant tout comme ceci:

    <?php query_posts('cat=X&showposts=1'); ?>
    <?php while (have_posts()) : the_post(); ?>
          <?= get_the_content(); ?>
    <?php endwhile; ?>
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.