Obtener el ID de la página dentro del bucle

15 may 2014, 11:09:42
Vistas: 14.4K
Votos: 2

Tengo una plantilla de página que tiene un bucle para mostrar entradas del blog. Dentro del bucle, hay una función get_template_part('content', 'custom') para incluir la plantilla (content-custom.php) que muestra el contenido de la entrada del blog. ¿Es posible obtener el ID de la página actual dentro del archivo content-custom.php?

3
Comentarios

content-custom.php no es una página, básicamente es solo el bucle que se elimina de su lugar original y se agrega en una plantilla separada.

Pieter Goosen Pieter Goosen
15 may 2014 11:48:41

@PieterGoosen Sí, tienes razón. Pero quiero obtener el ID de una página que está incluyendo el archivo content-custom.php mediante el método get_template_part().

Sodbileg Gansukh Sodbileg Gansukh
15 may 2014 11:55:13

¿Por qué necesitas el ID de la página?

Pieter Goosen Pieter Goosen
15 may 2014 11:57:42
Todas las respuestas a la pregunta 4
10
10

Según esta respuesta podrías usar get_queried_object_id() que aún no está en el Codex, pero está relacionado con get_queried_object()

$page_id = get_queried_object_id();
15 may 2014 14:06:26
Comentarios

Realmente fuiste y buscaste lejos y cruzaste fronteras. +1 para la señorita vikinga :)

Pieter Goosen Pieter Goosen
15 may 2014 14:09:32

Gracias @PieterGoosen, pero no tuve que buscar mucho... fue el primer resultado que encontré en Google.

helgatheviking helgatheviking
15 may 2014 14:15:51

@helgatheviking Pero no funcionará, ya que modifica el objeto global $wp_query. ¿Estoy pasando algo por alto?

Krzysiek Dróżdż Krzysiek Dróżdż
15 may 2014 14:25:29

@KrzysiekDróżdż No creo que estés pasando nada por alto. No vi mención de eso en la pregunta y de todas formas parece una mala idea modificar el $wp_query global.

helgatheviking helgatheviking
15 may 2014 14:39:06

@helgatheviking Sí, es una mala idea, pero lo hace de todos modos :)

Krzysiek Dróżdż Krzysiek Dróżdż
15 may 2014 15:33:08

@KrzysiekDróżdż Todavía no veo dónde dice que hace esto? Pero, si un OP desea ignorar las sugerencias de no modificar variables globales, entonces el OP debe estar dispuesto a aceptar que algunas funciones del core pueden no funcionar como se espera.

helgatheviking helgatheviking
15 may 2014 15:39:59

@KrzysiekDróżdż No interpreto ese comentario como que esté modificando variables globales, solo que get_the_ID() no está devolviendo lo que busca. Supongo que no lo sabremos hasta que el OP vuelva para probar mi respuesta.

helgatheviking helgatheviking
15 may 2014 18:47:02

Si alguien tiene una solución para que funcione la paginación sin usar la consulta principal, por favor muéstreme. Sé que manipular la consulta principal no es lo ideal, pero no puedo hacer que funcione la paginación sin usarla.

Sodbileg Gansukh Sodbileg Gansukh
16 may 2014 17:55:00

@SodbilegGansukh Parece que ahora estás haciendo una nueva pregunta y deberías publicarla como tal. Y la próxima vez, explica qué estás haciendo con la consulta principal para que las personas puedan darte mejores consejos/respuestas. Todavía no sé qué estás haciendo con la consulta principal, así que no puedo comentar, pero creo que he respondido a la pregunta tal como se formuló originalmente.

helgatheviking helgatheviking
16 may 2014 19:04:29
Mostrar los 5 comentarios restantes
9

Puedes usar todas las etiquetas de plantilla dentro de este archivo, así que para obtener el ID, simplemente usa get_the_ID() (o the_ID() para mostrarlo).

get_the_ID() recuperará el ID numérico del post actual. No tiene parámetros y devuelve el ID del post actual.

the_ID() mostrará el ID numérico del post actual. Tampoco tiene parámetros.

Si quieres acceder al ID de la página que contiene tu bucle personalizado, podrías hacerlo así:

Solución 1 (forma simple pero no muy elegante con variable global)

En tu plantilla de página:

<?php
    global $parent_page_id;
    $parent_page_id = get_the_ID();
    $paged = ( get_query_var( 'paged' ) ) ? get_query_var( 'paged' ) : 1;
    $args = array( 'post_type' => 'post', 'paged' => $paged );
    $temp = $wp_query;
    $wp_query = null;
    $wp_query = new WP_Query( $args );
    $wp_query->query( $args );
?>

<?php if ( $wp_query->have_posts() ) : ?>
    <?php while ( $wp_query->have_posts() ) : $wp_query->the_post(); ?>
    <?php get_template_part( 'content', 'custom' ); ?>
<?php endwhile; ?>
<?php wp_reset_postdata(); ?>

<?php else : ?>
    <?php get_template_part( 'no-results', 'index' ); ?>
<?php endif; ?>

Y en tu plantilla de contenido de post:

...
global $parent_page_id; // ahora puedes usar la variable parent_page_template
...

Solución 2 (forma más elegante con consulta personalizada)

En tu plantilla de página:

<?php
    $paged = ( get_query_var( 'paged' ) ) ? get_query_var( 'paged' ) : 1;
    $args = array( 'post_type' => 'post', 'paged' => $paged );
    $my_custom_query = new WP_Query( $args );
?>

<?php if ( $my_custom_query->have_posts() ) : ?>
    <?php while ( $my_custom_query->have_posts() ) : $my_custom_query->the_post(); ?>
    <?php get_template_part( 'content', 'custom' ); ?>
<?php endwhile; ?>
<?php wp_reset_postdata(); ?>

<?php else : ?>
    <?php get_template_part( 'no-results', 'index' ); ?>
<?php endif; ?>

Y en tu plantilla de contenido de post:

...
... $wp_query->queried_object_id; // contendrá el objeto consultado en la wp_query original
...
15 may 2014 11:26:54
Comentarios

Gracias Krzysiek, pero quiero obtener el ID de la página actual, no el ID de la entrada del blog.

Sodbileg Gansukh Sodbileg Gansukh
15 may 2014 11:36:12

OK, entonces tienes una página que contiene un bucle de entradas personalizadas y dentro de ese bucle quieres acceder al ID de esa página?

Krzysiek Dróżdż Krzysiek Dróżdż
15 may 2014 12:09:29

Sí, exactamente...

Sodbileg Gansukh Sodbileg Gansukh
15 may 2014 12:10:36

¿Cómo se ve ese bucle personalizado?

Krzysiek Dróżdż Krzysiek Dróżdż
15 may 2014 12:12:18

Aquí está el código. enlace

Sodbileg Gansukh Sodbileg Gansukh
15 may 2014 12:19:30

Simplemente define una variable fuera de tu bucle personalizado para el ID de tu publicación actual que puedas reutilizar más tarde

passatgt passatgt
15 may 2014 12:21:04

Pero no puedo acceder a esta variable dentro de la plantilla que estoy incluyendo (en este caso, content-custom.php)

Sodbileg Gansukh Sodbileg Gansukh
15 may 2014 12:28:15

Usa un include regular en lugar de get_template_part: include(locate_template('content-custom.php')); De esta manera las variables se pasan, por lo que puedes reutilizarlas en tu plantilla.

passatgt passatgt
15 may 2014 12:30:02

Bueno, algunos malos hábitos aquí. 1. No uses include regular (es una muy mala práctica que rompe los temas hijos). 2. No modifiques el wp_query global para hacer consultas personalizadas. Usa tu propia instancia de query (entonces podrás acceder al wp_query global dentro de ese loop).

Krzysiek Dróżdż Krzysiek Dróżdż
15 may 2014 13:45:59
Mostrar los 4 comentarios restantes
5

Para obtener el ID de la página puedes usar el post global.


global $post;
echo "pageid: ".$post->ID;

El código anterior recuperará el ID de la página actual, no el ID del post.

15 may 2014 11:43:38
Comentarios

Hice una búsqueda en Google antes de publicar aquí, y ya lo intenté. Esto me está dando el ID de la publicación actual, pero no el ID de la página dentro de la plantilla. Gracias shahpranaf.

Sodbileg Gansukh Sodbileg Gansukh
15 may 2014 11:46:08

¿Puedes proporcionar un enlace del front end?

shahpranaf shahpranaf
15 may 2014 11:48:33

Desafortunadamente no puedo. Está en mi máquina local.

Sodbileg Gansukh Sodbileg Gansukh
15 may 2014 11:50:01

NP. ¿puedes hacer printr $post aquí?

shahpranaf shahpranaf
15 may 2014 11:57:10

Aquí está. enlace

Sodbileg Gansukh Sodbileg Gansukh
15 may 2014 12:01:12
5

Solución 1: (Mala solución)

$p = $GLOBALS['wp_the_query']->get_queried_object_id(); 
//$p será el ID de tu página

Nota: Nunca deberías usar el objeto global wp_the_query.

EDITADO: si no has manipulado el objeto global wp_query, es decir, no has usado query_posts() etc., entonces las soluciones de helgatheviking funcionarán: código:

 get_queried_object_id(); 
o 
$GLOBAL['wp_query']->get_queried_object_id();

Solución 2: Como passatgt sugirió en el comentario, puedes almacenar el ID de la página fuera del bucle y acceder a él dentro del bucle. El problema de alcance para acceder en el archivo de plantilla parcial se puede resolver declarándolo como global.

Código:

//1. En el archivo de plantilla antes del bucle 

global $myglobal_page_id;
$mygloba_page_id = get_the_ID();
//puedes iniciar el bucle aquí
get_template_part('content', 'custom');

// 2. En el archivo de plantilla parcial 

global $myglobal_page_id; //dentro del bucle o en otro lugar

//esto tendrá tu page_id

Explicación#Solución 1:

Una vez dentro del bucle, el objeto global post se establece en tu publicación actual. por lo tanto, cuando llames a the_ID(), get_the_ID() (que usa la función get_post()), obtendrás el ID de la publicación actual, y no el de la publicación principal.

Así que necesitas acceder al objeto principal wp_the_query (que es una copia del objeto de consulta principal usado para reiniciar la consulta ref: wp_reset_query()), ya que contiene tu consulta original.

15 may 2014 13:51:26
Comentarios

Mmm, no creo que funcione. Él modifica la variable global $wp_query en su código.

Krzysiek Dróżdż Krzysiek Dróżdż
15 may 2014 13:58:23

funcionará, estarás accediendo directamente a wp_the_query, es una copia de la consulta principal almacenada por WordPress.

MortalViews MortalViews
15 may 2014 13:59:11

estoy editando mi respuesta con más opciones.

MortalViews MortalViews
15 may 2014 13:59:30

Esta no es una respuesta adecuada. Por favor edita tu respuesta y agrega una explicación de lo que hace tu código y cómo funciona

Pieter Goosen Pieter Goosen
15 may 2014 13:59:50

estoy escribiéndolo.. :P

MortalViews MortalViews
15 may 2014 14:00:37