Ottenere l'ID della pagina all'interno del loop
Ho un template di pagina che contiene un loop per mostrare gli articoli del blog. All'interno del loop, c'è la funzione get_template_part('content', 'custom')
per includere il template (content-custom.php) che mostra il contenuto del blog. È possibile ottenere l'ID della pagina corrente all'interno del file content-custom.php
?

Per questa risposta potresti usare get_queried_object_id()
che non è ancora presente nel Codex, ma è correlato a get_queried_object()
$page_id = get_queried_object_id();

Hai veramente scavato a fondo e oltre i confini. +1 per miss viking :)

Grazie @PieterGoosen, ma non ho dovuto scavare molto... era il primo risultato che ho trovato su Google.

@helgatheviking Ma non funzionerà, visto che modifica l'oggetto globale $wp_query
. Mi sto perdendo qualcosa?

@KrzysiekDróżdż Non credo tu stia tralasciando nulla. Non ho visto menzionare questo nella domanda e comunque sembra una cattiva idea modificare la query globale $wp_query
.

@KrzysiekDróżdż Ancora non vedo dove dice che lo fa? Ma, se un OP desidera ignorare i suggerimenti di non modificare le variabili globali, allora l'OP deve essere disposto ad accettare che alcune funzioni del core potrebbero non funzionare come previsto.

@helgatheviking Nel commento: http://wordpress.stackexchange.com/questions/144471/getting-page-id-inside-loop/144484?noredirect=1#comment207844_144472

@KrzysiekDróżdż Non interpreto quel commento come se stesse modificando variabili globali, solo che get_the_ID()
non restituisce ciò che sta cercando. Immagino che non potremo saperlo finché l'OP non tornerà a testare la mia risposta.

Se qualcuno ha una soluzione per una paginazione funzionante senza usare la query principale, per favore mostratemela. So che pasticciare con la query principale non è bello, ma non riesco a far funzionare la paginazione senza usarla.

@SodbilegGansukh Sembra che tu stia facendo una nuova domanda e dovresti pubblicarla come tale. E la prossima volta, spiega cosa stai facendo con la query principale in modo che le persone possano darti consigli/risposte migliori. Ancora non so cosa stai facendo alla query principale quindi non posso commentare, ma credo di aver risposto alla domanda come originariamente posta.

Puoi utilizzare tutti i tag del template all'interno di questo file, quindi per ottenere l'ID, usa semplicemente get_the_ID()
(o the_ID()
per visualizzarlo).
get_the_ID()
recupererà l'ID numerico del post corrente. Non richiede parametri e restituisce l'ID del post attuale.
the_ID()
visualizzerà l'ID numerico del post corrente. Anche questa funzione non richiede parametri.
Se vuoi accedere all'ID della pagina che contiene il tuo loop personalizzato, puoi farlo in questo modo:
Soluzione 1 (semplice, ma non molto elegante con variabile globale)
Nel tuo template di pagina:
<?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; ?>
E nel tuo template del contenuto del post:
...
global $parent_page_id; // ora puoi utilizzare la variabile parent_page_template
...
Soluzione 2 (metodo più elegante con query personalizzata)
Nel tuo template di pagina:
<?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; ?>
E nel tuo template del contenuto del post:
...
... $wp_query->queried_object_id; // conterrà l'oggetto interrogato nella wp_query originale
...

Grazie Krzysiek, ma voglio ottenere l'ID della pagina corrente, non l'ID del post del blog.

OK, quindi hai una pagina che contiene un loop di post personalizzati e all'interno di quel loop vuoi accedere all'ID di quella pagina?

Ecco il codice. link

Basta definire una variabile al di fuori del tuo loop personalizzato per l'ID del post corrente che potrai riutilizzare successivamente

Ma non riesco ad accedere a questa variabile all'interno del template che sto includendo (in questo caso, content-custom.php)

Usa un include normale invece di get_template_part: include(locate_template('content-custom.php')); In questo modo le variabili vengono passate, quindi puoi riutilizzarle nel tuo template.

Beh, ci sono alcune cattive abitudini qui. 1. Non usare include normale (è una pessima pratica che rompe i child theme). 2. Non modificare la wp_query
globale per fare query personalizzate. Usa la tua istanza di query (così potrai accedere alla wp_query globale all'interno di quel loop).

Ho fatto alcune ricerche su Google prima di postare qui, e l'ho già provato. Questo mi restituisce l'ID del post del blog corrente, ma non l'ID della pagina all'interno del template. Grazie shahpranaf.

Eccolo. link

Soluzione 1: (Soluzione Scorretta)
$p = $GLOBALS['wp_the_query']->get_queried_object_id();
//$p conterrà l'ID della tua pagina
Nota: Non dovresti mai utilizzare l'oggetto globale wp_the_query.
MODIFICA: se non hai alterato l'oggetto globale wp_query, ad esempio: non hai usato query_posts() ecc., allora le soluzioni di helgatheviking funzioneranno: codice:
get_queried_object_id();
oppure
$GLOBAL['wp_query']->get_queried_object_id();
Soluzione 2: Come suggerito da passatgt nel commento, puoi memorizzare l'ID della pagina fuori dal loop e accedervi all'interno del loop. Il problema di scope per accedervi nel file del template part può essere risolto dichiarandolo globale.
Codice:
//1. nel file del template prima del loop
global $myglobal_page_id;
$mygloba_page_id = get_the_ID();
//qui puoi iniziare il loop
get_template_part('content', 'custom');
// 2. nel file del template part
global $myglobal_page_id; //all'interno del loop o altrove
//questo conterrà il tuo page_id
Spiegazione#Soluzione 1:
Una volta all'interno del loop, l'oggetto globale post è impostato sul post corrente. quindi quando chiami the_ID(), get_the_ID() (che utilizza la funzione get_post()), otterrai l'ID del post corrente, e non del post principale.
quindi devi accedere all'oggetto wp_the_query principale (che è una copia dell'oggetto query principale utilizzato per resettare la query rif: wp_reset_query()), poiché contiene la tua query originale.

Mmh, non penso che funzionerebbe. Lui modifica la variabile globale $wp_query
nel suo codice.

funzionerà, accederai direttamente a wp_the_query, è una copia della query principale memorizzata da WordPress.

Questa non è una risposta corretta. Per favore modifica la tua risposta e aggiungi una spiegazione su cosa fa il tuo codice e come funziona
