Как получить идентификатор автора вне цикла

16

Я не могу получить идентификатор автора сообщения вне цикла, чтобы заставить get_the_author_meta работать. До сих пор я пробовал разные подходы:

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;

Мне нужен идентификатор автора, чтобы передать его:

$address = get_the_author_meta('user_email', $author_id);

Какие-либо предложения?

Марс Кастро
источник
проверить это , это сработало для меня.
Асаф Чертков

Ответы:

38

Самый простой и простой способ получить идентификатор автора сообщения вне цикла, если вы знаете идентификатор сообщения, - это использовать базовую функцию WordPress get_post_field().

$post_author_id = get_post_field( 'post_author', $post_id );

Если вы еще не знаете идентификатор публикации страницы, на которой вы находитесь, то, начиная с WP 3.1, проще всего использовать get_queried_object_id()функцию (ищите ее в списке методов), которая работает даже вне цикла.

$post_id = get_queried_object_id();

Если это не работает для вас, пожалуйста, дайте более подробное объяснение того, где вы пытаетесь запустить свой код, и мы посмотрим, сможем ли мы помочь в дальнейшем.

Макс Г.Дж. Панас
источник
9

Вот как получить и получить идентификатор автора вне цикла WordPress:

<?php
global $post;
$author_id=$post->post_author;
?>

Тогда это возможно для нас the_author_meta:

<?php
the_author_meta( 'user_nicename', $author_id );
?>
Александр Пославский
источник
Это прекрасно работает, если у вас есть доступ к идентификатору записи. Вы также можете использовать get_the_author_meta ('user_nicename', $ author_id), если вы не хотите выводить значение сразу
Andrew M
3

Зависит от того, где вы находитесь. Если вы находитесь на отдельной странице (например, показывает только один {{Вставить тип публикации здесь}}), вы можете использовать get_queried_object, чтобы получить объект публикации.

<?php
if (is_singular()) {
    $author_id = get_queried_object()->post_author;
    $address = get_the_author_meta('user_email', $author_id);
}

Если вы где-то еще, вы можете использовать глобальный $wp_queryобъект и проверить его $postsсвойство. Это должно работать и на отдельных страницах.

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

Вы также можете просто «фальстартить» цикл и перемотать его, чтобы получить идентификатор автора. Это не повлечет за собой никаких дополнительных обращений к базе данных или тому подобное. WordPress извлекает все сообщения одновременно (на момент написания). rewind_postsпросто сбрасывает текущий пост (глобальный $post) объект в начало массива. Недостатком является то, что это может привести к тому, что loop_startдействие сработает намного раньше, чем вы этого хотите - не так уж много, просто что-то, о чем нужно знать.

<?php
// make sure you're at the beginning.
rewind_posts();

// start the loop
the_post();

// get what you need
$address = get_the_author_meta('user_email');

// back to normal
rewind_posts();
chrisguitarguy
источник
2

Похоже, что это работает за пределами цикла, может быть, это поможет.

    $thelogin = get_query_var('author_name');
    $theauthor = get_userdatabylogin($thelogin);

Вы также можете вручную установить идентификатор сообщения и получить его следующим образом:

global $wp_query;
$thePostID = $wp_query->post->ID;
$postdata = get_post($thePostID, ARRAY_A);
$authorID = $postdata['post_author'];

Измените ID для публикации идентификатора вручную для доступа вне цикла.

Не очень хорошие решения, но, надеюсь, это поможет.

Райан Деннлер
источник
0

У меня возникла та же проблема, когда я пытался создать виджет, который отображал избранные сообщения с информацией об авторе.

Я использовал некоторые подсказки из @chrisguitarguy 2-го совета.

Мой код выглядел так:

<?php    

$count = 0;
$query_args = array(
      'posts_per_page' => 5,
     );
$com_query = new WP_Query( $query_args );

$feat_posts = $com_query->posts; // array, so we can access each post based on position

while ($com_query->have_posts()) {              
    $com_query->the_post();
        $author_name= get_the_author_meta('user_nicename',  $feat_posts[$count]->post_author);
        $count++;
}
Ричард Динь
источник
0

Чтобы получить и получить идентификатор автора вне цикла:

global $post;
$author_id = $post->post_author;

Тогда используйте

get_the_author_meta('field_name', $author_id)

помните, что если вы извлекаете идентификатор сообщения в цикле и обращаетесь к автору вне цикла, то он будет предоставлять только данные последнего сообщения в цикле

Маниш Чаубей
источник
0

Надеюсь, это поможет:

$args= array(
    'post_type' =>'any',
    'post_status' => 'publish',
    'order' => 'ASC',
    'posts_per_page' => '-1'
);
$posts = new WP_Query($args);
$posts = $posts->posts;   

foreach($posts as $post) { 
  switch ($post->post_type) {
     case 'page': 
           // get the author's id through the post or page
           $id = get_post_field( 'post_author', $post->ID);
           // the first parameter is the name of the author 
           // of the post or page and the second parameter 
           // is the id with which the function obtains the name of the author.
           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);
  }
}
Алехандро Хосе Веласкес Валле
источник
-2

Почему бы вам не использовать the_author_meta

<p>The email address for user id 25 is <?php the_author_meta('user_email',25); ?></p>

Это может быть использовано в цикле

Кулдип Дафтары
источник
Спасибо, но проблема в том, что я вне цикла и не могу это исправить. Когда вы находитесь вне цикла, необходимо указать второй аргумент ($ author_id).
Марс Кастро
Удар! Есть идеи? Это сводит меня с ума: - /
Марс Кастро
4
вне цикла - обратите внимание на вопрос.
Кристина Купер