Obter conteúdo da postagem de fora do loop

Respostas:

39

Você pode usar get_page()para retornar o $postobjeto de uma página estática:

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

Editar

Da mesma forma, você pode usar get_post()para retornar o $postobjeto de uma postagem:

$post_id = 302;
$post_object = get_post( $post_id );
echo $post_object->post_content;
Chris_O
fonte
Os códigos de acesso ainda funcionam ao usar isso?
Tim Baas
Acabei de descobrir que não. Use setup_postdata( $post );primeiro, depois disso, você pode usarthe_content();
Tim Baas 20/02
4
Você poderia apenas correrapply_filters( 'the_content', $post_object->post_content );
Nathan Powell
6

para obter o conteúdo da postagem fora do loop, você pode escrever algo como isto

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

if ( !empty( $content ) ) :
    echo $content;
endif;
Aamer Shahzad
fonte
3

Se o seu conteúdo incluir códigos de acesso, você deve usar:

$post_id = 22;        
$post_object = get_post( $post_id );        
echo do_shortcode( $post_object->post_content );
DSI_ClasH
fonte
Não faça shortcode kovshenin.com/2013/dont-do_shortcode
Brad Dalton
Essa página não fornece um motivo convincente para evitar, do_shortcodealém de dizer: "Pode ser lento" e "Você pode apenas usar a função que o código curto chama". Esses motivos são válidos apenas para os cenários mais triviais para os mais simples. Ele falha quando o código de acesso é gerado em outro lugar, ou se houver vários códigos de acesso ou códigos de acesso misturados com outro conteúdo e marcação. Sem uma razão convincente, eu discordaria da afirmação a evitar do_shortcode. Isso cheira a otimização prematura .
21417 Jeff
E também aumenta o acoplamento entre o seu código e o código do shortcode original. Se o método de suporte do shortcode for renomeado ou a assinatura mudar, seu código será interrompido.
21417 Jeff
1

Para completar, com base no comentário de Tim acima e inspirado no artigo de Stephen Harris , a solução que permite o uso the_content()é:

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

E, portanto, os filtros são aplicados (parágrafos serão inseridos etc.) e os códigos de acesso funcionam.

Jon
fonte
Isso quase travou meu navegador: / remover o e comercial ajuda, mas ainda não está analisando códigos de acesso.
Zade
0

Como você conhece seu ID de postagem de destino (302), você pode achar útil essa sintaxe abreviada que pode ser usada fora do loop (embora seu desempenho seja praticamente o mesmo que em qualquer outro método alternativo :)

echo(get_post_field('post_content',302));
E. Serrano
fonte
0

Você pode usar a get_post_data()função para postar fora do loop. Coloque este código em functions.php

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

e adicione este trecho para ter mais controle sobre o processo

<?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
?>
Zohair Baloch
fonte
0

Você pode usar, como dito, a solução com get_poste $post_object->post_content, mas não se esqueça de adicionar uma verificação antes de usar esse objeto de postagem:

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 );
Olga Farber
fonte
-1

Você pode simplesmente chamar get_the_content (postId)

<?php echo get_the_content($postId); ?>
NiemBlackPine
fonte
2
Na verdade, isso não é possível. Primeiro arg há pelo conteúdo quando há um mais link: codex.wordpress.org/Function_Reference/get_the_content
joshcanhelp
-2

usá- wp_reset_postdata();lo funcionará .. (editado)

<?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 pode ser "post", "page" ou seu tipo de postagem personalizado. Aqui p = 302 é o seu ID de postagem. Espero que funcione.

Jahirul Islam Mamun
fonte
2
Nunca use, a query_postsmenos que precise interromper as funcionalidades da página. Sempre use WP_Queryou get_postspara consultas personalizadas :-)
Pieter Goosen
sim .. você está certo .. Pode Wp_Query bem .. mesmo resultado encontrado ..
Jahirul Islam Mamun
Há também o pre_get_postsfiltro e the_post. Tantos detalhes.
19419 Nathan Powell
-3

você pode colocar o conteúdo em uma categoria X e usar query_post antes, desta forma:

    <?php query_posts('cat=X&showposts=1'); ?>
    <?php while (have_posts()) : the_post(); ?>
          <?= get_the_content(); ?>
    <?php endwhile; ?>
Zakaria Elhariri
fonte