Obtener el contenido de una entrada desde fuera del bucle
¿Hay alguna manera de obtener el contenido de otra entrada desde fuera del bucle? El ID es 302 y necesito mostrar ese contenido en otra página.

Puedes usar get_page()
para devolver el objeto $post
de una página estática:
$page_id = 302;
$page_object = get_page( $page_id );
echo $page_object->post_content;
Editar
De manera similar, puedes usar get_post()
para devolver el objeto $post
de una entrada:
$post_id = 302;
$post_object = get_post( $post_id );
echo $post_object->post_content;

Acabo de descubrir que no. Usa setup_postdata( $post );
primero, después de eso, puedes usar the_content();

global $post
solo está disponible dentro del bucle (loop), que es el punto central de la pregunta

No, esto está disponible fuera del bucle. Es una variable global y contiene los datos de la publicación actual. https://codex.wordpress.org/Global_Variables

Disculpa, mi comentario no fue lo suficientemente claro. Sí, es una variable global, pero ten en cuenta que está en la sección titulada "Variables dentro del bucle (Inside the Loop variables)", que dice "Mientras está dentro del bucle, estas variables globales se establecen, conteniendo información sobre la publicación actual que se está procesando."
Si tu código se ejecuta en una página antes del bucle, ¿qué $post va a devolver?
Además, el OP quiere obtener el contenido para una publicación que NO es la publicación actual, así que ni siquiera tiene sentido en este caso.

No uses shortcode https://kovshenin.com/2013/dont-do_shortcode/

Esa página no proporciona una razón convincente para evitar do_shortcode
aparte de decir "Podría ser lento" y "Puedes simplemente usar la función que llama el shortcode". Esas razones solo son válidas para los escenarios más triviales y simples. Fallan cuando el shortcode se genera en otro lugar, o si hay múltiples shortcodes, o shortcodes mezclados con otro contenido y marcado. Sin una razón convincente, estaría en desacuerdo con la afirmación de evitar do_shortcode
. Esto huele a optimización prematura.

Para completar, basándonos en el comentario de Tim anteriormente y inspirado por el artículo de Stephen Harris, la solución que permite usar the_content()
es:
$post_id = 302;
global $post;
$post = get_post($post_id);
setup_postdata( $post );
the_content();
wp_reset_postdata( $post );
Y por lo tanto los filtros se aplican (se insertarán párrafos, etc.) y los shortcodes funcionarán.

Puedes usar, como se mencionó, la solución con get_post
y $post_object->post_content
, pero no olvides agregar una verificación antes de usar ese objeto de publicación:
function get_post_content( $post_id = null ) {
$post_object = get_post( $post_id );
if ( ! $post_object ) { return ''; }
// sino
return apply_filters('the_content', $post_object->post_content);
}
echo get_post_content( $other_post_id );

Si conoces el ID de la publicación objetivo (302), puede resultarte útil esta sintaxis abreviada que puedes utilizar fuera del bucle (aunque su rendimiento es prácticamente el mismo que en cualquier otro método alternativo):
echo(get_post_field('post_content',302));

Puedes usar la función get_post_data()
para obtener un post fuera del loop. Coloca este código en el archivo functions.php
function get_post_data($postId) {
global $wpdb;
return $wpdb->get_row("SELECT * FROM $wpdb->posts WHERE ID=$postId");
}
y luego añade este fragmento para tener más control sobre el proceso
<?php $data = get_post_data(302);
echo $data->post_date; // fecha del post
echo $data->post_title; // título del post
echo $data->post_content; // contenido del post
echo $data->comment_count; // número de comentarios
?>

En realidad, eso no es posible. El primer argumento ahí es para el contenido cuando hay un enlace "leer más": https://codex.wordpress.org/Function_Reference/get_the_content

usa wp_reset_postdata();
y 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 puede ser "post", "page" o tu tipo de entrada personalizado. Aquí p=302 es el ID de tu entrada.. Espero que funcione.

Nunca uses query_posts
a menos que necesites romper funcionalidades de la página. Siempre utiliza WP_Query
o get_posts
para consultas personalizadas :-)

sí.. tienes razón.. También se puede usar WP_Query.. se obtienen los mismos resultados..
