Как получить ID автора вне цикла WordPress
Я не могу получить ID автора записи вне цикла, чтобы заставить работать 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;
Мне нужен ID автора, чтобы передать его в:
$address = get_the_author_meta('user_email', $author_id);
Есть предложения?
Самый простой и прямой способ получить ID автора записи вне цикла, если вам известен ID записи, - это использовать основную функцию WordPress get_post_field()
.
$post_author_id = get_post_field( 'post_author', $post_id );
Если вы еще не знаете ID записи текущей страницы, то начиная с версии WP 3.1 проще всего использовать функцию get_queried_object_id()
(ищите в списке методов), которая работает даже вне цикла.
$post_id = get_queried_object_id();
Если эти методы не работают в вашем случае, пожалуйста, предоставьте более подробное описание места, где вы пытаетесь выполнить код, и мы постараемся помочь вам дальше.

Зависит от того, где вы находитесь. Если вы на отдельной странице (например, отображается только один {{Insert Post Type Here}}), вы можете использовать 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);
}
Вы также можете просто "фальстартовать" цикл и перемотать его, чтобы получить ID автора. Это не приведёт к дополнительным запросам к базе данных или чему-то подобному. WordPress получает все записи сразу (на момент написания). rewind_posts
просто сбрасывает текущую запись (глобальный объект $post
) в начало массива. Недостаток в том, что это может вызвать срабатывание действия loop_start
гораздо раньше, чем вы хотите — не критично, но стоит иметь в виду.
<?php
// убедитесь, что вы в начале.
rewind_posts();
// начинаем цикл
the_post();
// получаем то, что нужно
$address = get_the_author_meta('user_email');
// возвращаемся к нормальному состоянию
rewind_posts();

Похоже, это работает вне цикла, возможно, это поможет.
$thelogin = get_query_var('author_name');
$theauthor = get_userdatabylogin($thelogin);
Вы также можете вручную установить ID записи и получить данные таким образом:
global $wp_query;
$thePostID = $wp_query->post->ID;
$postdata = get_post($thePostID, ARRAY_A);
$authorID = $postdata['post_author'];
Замените ID вручную на ID записи для доступа вне цикла.
Не самые лучшие решения, но, надеюсь, они помогут.

У меня была такая же проблема при попытке создать виджет, который отображал бы избранные записи с информацией об авторе.
Я использовал некоторые подсказки из второго совета @chrisguitarguy.
Мой код выглядел следующим образом:
<?php
$count = 0;
$query_args = array(
'posts_per_page' => 5,
);
$com_query = new WP_Query( $query_args );
$feat_posts = $com_query->posts; // массив, поэтому мы можем получить доступ к каждой записи по позиции
while ($com_query->have_posts()) {
$com_query->the_post();
$author_name= get_the_author_meta('user_nicename', $feat_posts[$count]->post_author);
$count++;
}

Надеюсь, это поможет:
$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':
// получаем ID автора через запись или страницу
$id = get_post_field( 'post_author', $post->ID);
// первый параметр - имя автора записи или страницы,
// второй параметр - ID, по которому функция получает имя автора.
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);
}
}

Как получить ID автора вне цикла (loop):
global $post;
$author_id = $post->post_author;
Затем используйте:
get_the_author_meta('field_name', $author_id)
Важно помнить: если вы получаете ID записей в цикле, а доступ к автору осуществляете вне цикла, то будут возвращены данные только последней записи в цикле.

Почему бы не использовать the_author_meta
<p>Email пользователя с ID 25: <?php the_author_meta('user_email',25); ?></p>
Может использоваться внутри цикла

Спасибо, но проблема в том, что я вне цикла и не могу это исправить. Когда вы находитесь вне цикла, необходимо указать второй аргумент ($author_id).
