Ottenere il contenuto di un post fuori dal loop
Esiste un modo per ottenere il contenuto di un altro post fuori dal loop? L'ID è 302 e ho bisogno di visualizzare il contenuto di quel post in un'altra pagina.

Puoi utilizzare get_page()
per restituire l'oggetto $post
di una pagina statica:
$page_id = 302;
$page_object = get_page( $page_id );
echo $page_object->post_content;
Modifica
Allo stesso modo, puoi usare get_post()
per restituire l'oggetto $post
di un articolo:
$post_id = 302;
$post_object = get_post( $post_id );
echo $post_object->post_content;

Ho appena scoperto che non funzionano. Usa prima setup_postdata( $post );
, dopo di che puoi usare the_content();

global $post
è disponibile solo all'interno del loop, che è il punto centrale della domanda

No, questa è disponibile anche al di fuori del loop. È una variabile globale e contiene i dati del post corrente. https://codex.wordpress.org/Global_Variables

Scusa, il mio commento non era abbastanza chiaro. Sì, è una variabile globale ma nota che si trova nella sezione intitolata "Inside the Loop variables", che dice "Mentre si è all'interno del loop, queste globali sono impostate, contenenti informazioni sul post corrente che viene elaborato."
Se il tuo codice viene eseguito su una pagina prima del loop, quale $post restituirà?
Inoltre, l'OP vuole ottenere il contenuto per un post, che NON è il post corrente, quindi non ha nemmeno senso in questo caso.

Non usare shortcode https://kovshenin.com/2013/dont-do_shortcode/

Quella pagina non fornisce una ragione convincente per evitare do_shortcode
a parte dire "Potrebbe essere lento" e "Puoi semplicemente usare la funzione che lo shortcode chiama." Queste ragioni sono valide solo per gli scenari più banali e semplici. Fallisce quando lo shortcode è generato altrove, o se ci sono più shortcode, o shortcode mescolati con altri contenuti e markup. Senza una ragione convincente, sarei in disaccordo con l'affermazione di evitare do_shortcode
. Sembra un caso di ottimizzazione prematura.

Per completezza, proseguendo il commento di Tim sopra e ispirato dall'articolo di Stephen Harris, la soluzione che permette di usare the_content()
è:
$post_id = 302;
global $post;
$post = get_post($post_id);
setup_postdata( $post );
the_content();
wp_reset_postdata( $post );
In questo modo i filtri vengono applicati (verranno inseriti i paragrafi ecc.) e gli shortcode funzioneranno.

Puoi utilizzare, come detto, la soluzione con get_post
e $post_object->post_content
, ma non dimenticare di aggiungere un controllo prima di utilizzare quell'oggetto post:
function get_post_content( $post_id = null ) {
$post_object = get_post( $post_id );
if ( ! $post_object ) { return ''; }
//altrimenti
return apply_filters('the_content', $post_object->post_content);
}
echo get_post_content( $other_post_id );

Dato che conosci l'ID del post di destinazione (302), potrebbe esserti utile questa sintassi abbreviata che puoi usare al di fuori del loop (anche se le sue prestazioni sono praticamente le stesse di qualsiasi altro metodo alternativo):
echo(get_post_field('post_content',302));

Puoi utilizzare la funzione get_post_data()
per ottenere i dati di un post al di fuori del loop. Inserisci questo codice nel file functions.php
function get_post_data($postId) {
global $wpdb;
return $wpdb->get_row("SELECT * FROM $wpdb->posts WHERE ID=$postId");
}
e poi aggiungi questo snippet per avere maggior controllo sul processo
<?php $data = get_post_data(302);
echo $data->post_date; // data del post
echo $data->post_title; // titolo del post
echo $data->post_content; // contenuto del post
echo $data->comment_count; // numero di commenti
?>

In realtà, non è possibile. Il primo argomento è per il contenuto quando c'è un link "leggi più": https://codex.wordpress.org/Function_Reference/get_the_content

usa wp_reset_postdata();
funzionerà.. (modificato)
<?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 può essere "post", "page" o il tuo custom post type. Qui p=302 è l'ID del tuo post.. Spero che funzioni.

Non usare mai query_posts
a meno che tu non abbia bisogno di interrompere le funzionalità della pagina. Usa sempre WP_Query
o get_posts
per query personalizzate :-)

sì.. hai ragione.. Si può usare anche WP_Query.. stesso risultato ottenuto..
