Obținerea ID-ului paginii în interiorul loop-ului
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
?

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

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

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

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

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

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

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

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.

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

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

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

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?

Iată codul. link

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

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

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.

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

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.

Uite-l. link

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.

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

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

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ă
