$ post-ID no funciona

2

Tengo el siguiente código y mientras get_the_ID () funciona, $ post- > ID no funciona, ¿por qué?

    $the_query = new WP_Query( array(
        'post_type' => 'custompost',
    ) );

    while ( $the_query->have_posts() ) : $the_query->the_post();
        echo $post->ID;
    endwhile;
    
pregunta urok93 23.08.2012 - 17:07

2 respuestas

7

Tu bucle WP_Query está incompleto. No está comprobando si realmente se encontraron publicaciones antes del bucle, ni está presentando un mensaje para mostrar que no se encontraron, ni se está limpiando después. También estás usando la sintaxis "otra" que rompe la compatibilidad con llaves en los IDE, lo que hace que tu vida sea más difícil.

Intenta agregar global $post; como esto:

global $post;
$the_query = new WP_Query( array(
    'post_type' => 'custompost'
) );

if($the_query->have_posts()){
    while ( $the_query->have_posts() ) {
        $the_query->the_post();
        echo $post->ID;
    }
    wp_reset_postdata();
}else {
    echo 'no posts found';
}

Al escribir consultas es importante ser coherente y hacer las cosas bien. Así que recomiendo leer estas diapositivas de Andrew Nacin, un desarrollador de WordPress Core en Auttomatic:

enlace

Esto le dirá dónde es apropiado cada tipo de consulta, cómo deben usarse y por qué.

En el código anterior, agregué una declaración if para verificar si se devolvieron las publicaciones, y agregué wp_reset_postdata que le permitiría continuar usando la consulta principal limpiando después del ciclo personalizado.

    
respondido por el Tom J Nowell 23.08.2012 - 17:17
0

El truco, como lo identifica Tom Nowell, es agregar una referencia a global $post .

Cuando ejecuta the_query->the_post() , WordPress carga el primer resultado de la consulta en un objeto global $post . Así es como configura las cosas para todas las etiquetas de plantillas regulares:

  • the_title()
  • the_content()
  • the_excerpt ()
  • etc ...

Verá que no pasamos nada en a estas funciones. Simplemente los llamamos. Cada una de estas funciones hará referencia interna al objeto global $post para analizar, preparar e imprimir la salida deseada.

Dentro de su bucle, usted llama a the_post() muy bien para llenar los datos, pero no tiene una referencia para los datos en sí dentro del alcance de su bucle. Si quisiera evitar hacer referencia al objeto global $post , podría usar get_the_ID() .

Al igual que las otras etiquetas de plantilla a las que he hecho referencia anteriormente, get_the_ID() reúne datos del objeto global $post internamente, por lo que no tiene que hacerlo usted mismo.

Pero si do quiere hacerlo usted mismo, solo agregue una referencia global antes de intentar usar $post :

$the_query = new WP_Query( array(
    'post_type' => 'custompost',
) );

while ( $the_query->have_posts() ) : $the_query->the_post();
    global $post;  // Add this line and you're golden
    echo $post->ID;
endwhile;

¿Qué es wp_reset_postdata() ?

Si está creando múltiples bucles, (es decir, tiene un gran bucle de publicaciones, pero tiene un bucle secundario dentro de él), puede llamar a wp_reset_postdata() para restablecer las cosas.

Básicamente, the_post() configurará el objeto global $post para que tenga los datos de la consulta solicitada. the_query->the_post() sobrescribirá $post con datos de the_query . wp_reset_postdata() restablecerá $post a la consulta original.

Entonces, si estás usando bucles anidados o múltiples, wp_reset_postdata() es una forma de volver al bucle y al objeto $post que tenías disponible antes de llamar a tu secundario the_query->the_post() .

    
respondido por el EAMann 23.08.2012 - 17:53

Lea otras preguntas en las etiquetas