Ottenere l'ID della pagina all'interno del loop

15 mag 2014, 11:09:42
Visualizzazioni: 14.4K
Voti: 2

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?

3
Commenti

content-custom.php non è una pagina, è sostanzialmente solo il loop che viene rimosso dalla sua posizione originale e inserito in un template separato.

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

@PieterGoosen Sì, hai ragione. Ma voglio ottenere l'ID di una pagina che include il file content-custom.php tramite il metodo get_template_part().

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

Perché hai bisogno dell'ID della pagina

Pieter Goosen Pieter Goosen
15 mag 2014 11:57:42
Tutte le risposte alla domanda 4
10
10

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();
15 mag 2014 14:06:26
Commenti

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

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

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

helgatheviking helgatheviking
15 mag 2014 14:15:51

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

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

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

helgatheviking helgatheviking
15 mag 2014 14:39:06

@helgatheviking Sì, è una cattiva idea, ma lo fa comunque :)

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

@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 helgatheviking
15 mag 2014 15:39:59

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

helgatheviking helgatheviking
15 mag 2014 18:47:02

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.

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

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

helgatheviking helgatheviking
16 mag 2014 19:04:29
Mostra i restanti 5 commenti
9

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
...
15 mag 2014 11:26:54
Commenti

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

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

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?

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

Sì, esattamente...

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

Come si presenta quel loop personalizzato?

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

Ecco il codice. link

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

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

passatgt passatgt
15 mag 2014 12:21:04

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

Sodbileg Gansukh Sodbileg Gansukh
15 mag 2014 12:28:15

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.

passatgt passatgt
15 mag 2014 12:30:02

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

Krzysiek Dróżdż Krzysiek Dróżdż
15 mag 2014 13:45:59
Mostra i restanti 4 commenti
5

Per ottenere l'ID della pagina puoi utilizzare il global post.


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

Il codice sopra recupererà l'ID della pagina corrente, non l'ID del post.

15 mag 2014 11:43:38
Commenti

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.

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

puoi fornire un link front end?

shahpranaf shahpranaf
15 mag 2014 11:48:33

Sfortunatamente non posso. È sulla mia macchina locale.

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

NP. Puoi fare printr $post qui?

shahpranaf shahpranaf
15 mag 2014 11:57:10

Eccolo. link

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

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.

15 mag 2014 13:51:26
Commenti

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

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

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

MortalViews MortalViews
15 mag 2014 13:59:11

sto modificando la mia risposta con più opzioni.

MortalViews MortalViews
15 mag 2014 13:59:30

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

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

sto scrivendo.. :P

MortalViews MortalViews
15 mag 2014 14:00:37