Obținerea ID-ului paginii în interiorul loop-ului

15 mai 2014, 11:09:42
Vizualizări: 14.4K
Voturi: 2

Am un șablon de pagină care conține un loop pentru afișarea articolelor de blog. În interiorul loop-ului, există funcția get_template_part('content', 'custom') pentru a include șablonul (content-custom.php) care afișează conținutul articolului de blog. Este posibil să obțin ID-ul paginii curente în fișierul content-custom.php?

3
Comentarii

content-custom.php nu este o pagină, este practic doar bucla care a fost eliminată din locația sa originală și adăugată într-un șablon separat.

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

@PieterGoosen Da, ai dreptate. Dar vreau să obțin ID-ul unei pagini care include fișierul content-custom.php prin metoda get_template_part().

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

De ce ai nevoie de ID-ul paginii

Pieter Goosen Pieter Goosen
15 mai 2014 11:57:42
Toate răspunsurile la întrebare 4
10
10

Conform acestui răspuns poți folosi get_queried_object_id() care încă nu este în Codex, dar este legat de get_queried_object()

$page_id = get_queried_object_id();
15 mai 2014 14:06:26
Comentarii

Chiar ai mers departe și ai căutat peste granițe. +1 pentru domnișoara viking :)

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

Mulțumesc @PieterGoosen, dar nu a trebuit să caut departe... a fost primul rezultat pe care l-am găsit pe Google.

helgatheviking helgatheviking
15 mai 2014 14:15:51

@helgatheviking Dar nu va funcționa, deoarece el modifică obiectul global $wp_query. Scapă ceva din vedere?

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

@KrzysiekDróżdż Nu cred că ai ratat ceva. Nu am văzut menționat acest lucru în întrebare și oricum pare o idee proastă să modifici globalul $wp_query.

helgatheviking helgatheviking
15 mai 2014 14:39:06

@helgatheviking Da, este o idee proastă, dar tot o face :)

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

@KrzysiekDróżdż Încă nu văd unde spune că face asta? Dar, dacă cineva dorește să ignore sugestiile de a nu modifica globalele, atunci trebuie să fie pregătit să accepte că unele funcții de bază pot să nu funcționeze cum era de așteptat.

helgatheviking helgatheviking
15 mai 2014 15:39:59

@KrzysiekDróżdż Nu interpretez acel comentariu ca și cum ar modifica variabile globale, ci doar că get_the_ID() nu returnează ceea ce caută el. Presupun că nu putem ști până când OP revine să testeze răspunsul meu.

helgatheviking helgatheviking
15 mai 2014 18:47:02

Dacă cineva are o soluție pentru paginare funcțională fără a folosi interogarea principală, vă rog să-mi arătați. Știu că a interveni în interogarea principală nu este recomandat, dar nu pot obține o paginare funcțională fără să o folosesc.

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

@SodbilegGansukh Se pare că acum pui o întrebare nouă și ar trebui să o postezi ca atare. Și data viitoare, explică ce faci cu interogarea principală, astfel încât oamenii să-ți poată oferi sfaturi/răspunsuri mai bune. Încă nu știu ce faci cu interogarea principală, așa că nu pot comenta, dar cred că am răspuns la întrebarea așa cum a fost pusă inițial.

helgatheviking helgatheviking
16 mai 2014 19:04:29
Arată celelalte 5 comentarii
9

Puteți folosi toate tag-urile de șablon în acest fișier, așa că pentru a obține ID-ul, pur și simplu folosiți get_the_ID() (sau the_ID() pentru a-l afișa).

get_the_ID() va prelua ID-ul numeric al postării curente. Nu are parametri și returnează ID-ul postării curente.

the_ID() va afișa ID-ul numeric al postării curente. De asemenea, nu are parametri.

Dacă doriți să accesați ID-ul paginii care conține bucla personalizată, puteți face asta în felul următor:

Soluția 1 (simplă, dar nu foarte elegantă, folosind variabila globală)

În șablonul paginii:

<?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; ?>

Și în șablonul de conținut al postării:

...
global $parent_page_id; // acum puteți folosi variabila parent_page_template
...

Soluția 2 (metodă mai elegantă cu interogare personalizată)

În șablonul paginii:

<?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; ?>

Și în șablonul de conținut al postării:

...
... $wp_query->queried_object_id; // va conține obiectul interogat în wp_query original
...
15 mai 2014 11:26:54
Comentarii

Mulțumesc Krzysiek, dar vreau să obțin ID-ul paginii curente, nu ID-ul articolului de blog.

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

OK, deci ai o pagină care conține un loop de postări personalizate și în interiorul acelui loop vrei să accesezi ID-ul acelei pagini?

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

Da, exact...

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

Cum arată acea buclă personalizată?

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

Iată codul. link

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

Pur și simplu definește o variabilă în afara buclei personalizate pentru ID-ul postării curente pe care o poți refolosi mai târziu

passatgt passatgt
15 mai 2014 12:21:04

Dar nu pot accesa această variabilă în interiorul șablonului pe care îl includ (în acest caz, content-custom.php)

Sodbileg Gansukh Sodbileg Gansukh
15 mai 2014 12:28:15

Folosește un include obișnuit în loc de get_template_part: include(locate_template('content-custom.php')); În acest fel variabilele sunt transmise, astfel încât le poți reutiliza în șablonul tău.

passatgt passatgt
15 mai 2014 12:30:02

Ei bine, câteva obiceiuri proaste aici. 1. Nu folosi include obișnuit (este o practică foarte proastă care strică temele copil). 2. Nu modifica global wp_query pentru a face interogări personalizate. Folosește propria instanță de query (atunci vei putea accesa global wp_query în interiorul acelei bucle).

Krzysiek Dróżdż Krzysiek Dróżdż
15 mai 2014 13:45:59
Arată celelalte 4 comentarii
5

Pentru a obține ID-ul paginii poți folosi variabila globală post.


global $post;
echo "ID-ul paginii: ".$post->ID;

Codul de mai sus va returna ID-ul paginii curente, nu ID-ul postării.

15 mai 2014 11:43:38
Comentarii

Am făcut o căutare pe Google înainte să postez aici și am încercat deja asta. Acest lucru îmi oferă ID-ul actual al postării de blog, dar nu și ID-ul paginii din interiorul șablonului. Mulțumesc shahpranaf.

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

poți oferi un link pentru front end?

shahpranaf shahpranaf
15 mai 2014 11:48:33

Din păcate, nu pot. Este pe mașina mea locală.

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

NP. Poți să afișezi $post aici?

shahpranaf shahpranaf
15 mai 2014 11:57:10

Uite-l. link

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

Soluția 1: (Soluție necorespunzătoare)

$p = $GLOBALS['wp_the_query']->get_queried_object_id(); 
//$p va fi ID-ul paginii tale

Notă: Nu ar trebui să utilizezi niciodată obiectul global wp_the_query.

EDIT: dacă nu ai modificat obiectul global wp_query, adică: nu ai folosit query_posts() etc., atunci soluțiile lui helgatheviking vor funcționa: cod:

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

Soluția 2: Așa cum a sugerat passatgt în comentariu, poți stoca ID-ul paginii în afara buclei și să-l accesezi în interiorul buclei. Problema de scope pentru accesarea acestuia în fișierul template part poate fi rezolvată prin declararea lui ca global.

Cod:

//1. în fișierul template înainte de buclă 

global $myglobal_page_id;
$mygloba_page_id = get_the_ID();
//poți începe bucla aici
get_template_part('content', 'custom');

// 2. în fișierul template part 

global $myglobal_page_id; //în interiorul buclei sau altfel

//acesta va conține ID-ul paginii tale

Explicație#Soluția 1:

Odată ce ești în interiorul buclei, obiectul global post este setat la postul curent. prin urmare, când apelezi the_ID(), get_the_ID() (care folosește funcția get_post()), vei obține ID-ul postului curent, și nu al postului principal.

deci trebuie să accesezi obiectul principal wp_the_query (care este o copie a obiectului query principal utilizat pentru resetarea query-ului ref: wp_reset_query()), deoarece acesta conține query-ul tău original.

15 mai 2014 13:51:26
Comentarii

Hmm, nu cred că ar funcționa. El modifică variabila globală $wp_query în codul său.

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

va funcționa, vei accesa direct wp_the_query, este o copie a interogării principale stocată de WordPress.

MortalViews MortalViews
15 mai 2014 13:59:11

editez răspunsul meu cu mai multe opțiuni.

MortalViews MortalViews
15 mai 2014 13:59:30

Acesta nu este un răspuns corect. Te rugăm să editezi răspunsul tău și să adaugi o explicație despre ce face codul tău și cum funcționează

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

tocmai scriu.. :P

MortalViews MortalViews
15 mai 2014 14:00:37