Cum să obții ID-ul autorului în afara buclei WordPress
Nu pot obține ID-ul autorului postării în afara buclei pentru a face funcția get_the_author_meta să funcționeze. Până acum am încercat diferite abordări:
1.
$author_id=$post->post_author;
2.
global $post;
$author_id=$post->post_author;
3.
$post_tmp = get_post($post_id);
$author_id = $post_tmp->post_author;
4.
$author_id = $posts[0]->post_author;
Am nevoie de ID-ul autorului pentru a-l transmite către:
$address = get_the_author_meta('user_email', $author_id);
Aveți sugestii?
Cea mai simplă și directă modalitate de a obține ID-ul autorului unui post în afara loop-ului, dacă cunoști ID-ul postului, este să folosești funcția de bază din WordPress get_post_field()
.
$post_author_id = get_post_field( 'post_author', $post_id );
Dacă încă nu cunoști ID-ul postului paginii pe care te afli, atunci începând cu WP 3.1 cel mai simplu este să folosești funcția get_queried_object_id()
(caută-o în lista de Metode) care funcționează chiar și în afara loop-ului.
$post_id = get_queried_object_id();
Dacă aceste metode nu funcționează pentru tine, te rugăm să oferi o explicație mai detaliată despre locul în care încerci să rulezi codul și vom încerca să te ajutăm mai departe.

Depinde de unde te afli. Dacă ești pe o pagină singulară (de ex. care afișează un singur {{Insert Post Type Here}}), poți folosi get_queried_object
, care va prelua obiectul postării.
<?php
if (is_singular()) {
$author_id = get_queried_object()->post_author;
$address = get_the_author_meta('user_email', $author_id);
}
Dacă ești oriunde altundeva, poți folosi obiectul global $wp_query
și să verifici proprietatea sa $posts
. Acest lucru ar trebui să funcționeze și pe paginile singulare.
<?php
global $wp_query;
if (!empty($wp_query->posts)) {
$author_id = $wp_query->posts[0]->post_author;
$address = get_the_author_meta('user_email', $author_id);
}
De asemenea, poți pur și simplu să "pornesc fals" bucla și să o dai înapoi pentru a obține ID-ul autorului. Acest lucru nu va genera nicio solicitare suplimentară către baza de date sau altele asemenea. WordPress preia toate postările deodată (la momentul scrierii). rewind_posts
doar resetează postarea curentă (obiectul global $post
) la începutul tabloului. Dezavantajul este că acest lucru poate declanșa acțiunea loop_start
mult mai devreme decât ai nevoie - nu e o problemă mare, dar e bine să fii conștient de asta.
<?php
// asigură-te că ești la început.
rewind_posts();
// începe bucla
the_post();
// obține ce ai nevoie
$address = get_the_author_meta('user_email');
// înapoi la normal
rewind_posts();

Se pare că acest lucru funcționează în afara buclei, poate te va ajuta.
$thelogin = get_query_var('author_name');
$theauthor = get_userdatabylogin($thelogin);
De asemenea, poți seta manual ID-ul postului și să-l obții astfel:
global $wp_query;
$thePostID = $wp_query->post->ID;
$postdata = get_post($thePostID, ARRAY_A);
$authorID = $postdata['post_author'];
Schimbă ID-ul manual cu ID-ul postului pentru acces în afara buclei.
Nu sunt soluții perfecte, dar sper că te ajută.

Am avut aceeași problemă aici încercând să creez un widget care să afișeze postări recomandate cu informații despre autor.
Am folosit câteva indicii din al doilea sfat al lui @chrisguitarguy.
Codul meu arăta astfel:
<?php
$count = 0;
$query_args = array(
'posts_per_page' => 5,
);
$com_query = new WP_Query( $query_args );
$feat_posts = $com_query->posts; // array, deci putem accesa fiecare post în funcție de poziție
while ($com_query->have_posts()) {
$com_query->the_post();
$author_name= get_the_author_meta('user_nicename', $feat_posts[$count]->post_author);
$count++;
}

Sper că acest lucru va ajuta:
$args= array(
'post_type' =>'any', // orice tip de postare
'post_status' => 'publish', // doar postări publicate
'order' => 'ASC', // ordonare crescătoare
'posts_per_page' => '-1' // afișează toate postările
);
$posts = new WP_Query($args);
$posts = $posts->posts;
foreach($posts as $post) {
switch ($post->post_type) {
case 'page':
// obține ID-ul autorului prin postare sau pagină
$id = get_post_field( 'post_author', $post->ID);
// primul parametru este numele autorului
// al postării sau paginii, iar al doilea parametru
// este ID-ul cu care funcția obține numele autorului.
echo get_the_author_meta('display_name', $id);
break;
case 'post':
$id = get_post_field( 'post_author', $post->ID);
echo get_the_author_meta('display_name', $id);
}
}

Pentru a obține ID-ul autorului în afara loop-ului:
global $post;
$author_id = $post->post_author;
Apoi folosește
get_the_author_meta('nume_camp', $author_id)
Reține că dacă preiei ID-urile postărilor în loop și accesezi autorul în afara loop-ului, vei obține doar datele ultimei postări din loop.

De ce nu folosești the_author_meta
<p>Adresa de email pentru utilizatorul cu id-ul 25 este <?php the_author_meta('user_email',25); ?></p>
Aceasta poate fi folosită în interiorul loop-ului

Mulțumesc, dar problema este că sunt în afara buclei și nu pot rezolva asta. Când ești în afara buclei, al doilea argument ($author_id) trebuie furnizat.
