Obtener el ID de la página dentro del bucle
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
?

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();

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

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

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

@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 Sí, es una mala idea, pero lo hace de todos modos :)

@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 En el comentario: http://wordpress.stackexchange.com/questions/144471/getting-page-id-inside-loop/144484?noredirect=1#comment207844_144472

@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.

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.

@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.

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
...

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

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?

Aquí está el código. enlace

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

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

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.

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).

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.

Aquí está. enlace

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.

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

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

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
