Получение списка пользовательских записей по автору

22 июл. 2013 г., 23:38:12
Просмотры: 20.7K
Голосов: 5

Я пытаюсь создать страницу, где пользователь может просматривать все записи пользовательского типа после того, как он кликнет на автора на предыдущей странице, но у меня не получается найти ничего подходящего среди встроенных PHP функций WordPress.

Существует ли простой способ сделать такой запрос? Я не нашел много информации об этом в интернете.

2
Комментарии

Это один конкретный тип записи или вы имеете в виду "всё, что не является стандартным типом WordPress"?

Pat J Pat J
22 июл. 2013 г. 23:45:40

Это всего лишь один конкретный пользовательский тип записи.

m0ngr31 m0ngr31
22 июл. 2013 г. 23:48:33
Все ответы на вопрос 2
10

Что-то вроде этого должно работать:

// Предполагая, что у вас установлен $author_id
// и ваш тип записи называется 'your_post_type'
$args = array(
    'author' => $author_id,
    'post_type' => 'your_post_type',
);
$author_posts = new WP_Query( $args );
if( $author_posts->have_posts() ) {
    while( $author_posts->have_posts() ) { 
        $author_posts->the_post();
        // заголовок, содержимое и т.д.
        $author_posts->the_title();
        $author_posts->the_content();
        // у вас должен быть доступ ко всем тегам, которые обычно
        // можно использовать в Цикле (The Loop)
    }
    wp_reset_postdata();
}

Справочник

WP_Query класс

Использование файла шаблона автора

Вы можете сделать это внутри шаблона автора:

author.php -- этот файл должен находиться в директории вашей темы

<?php get_header(); ?>

<div id="content" class="narrowcolumn">

<!-- Это устанавливает переменную $curauth -->

<?php
    $curauth = (isset($_GET['author_name'])) ? 
        get_user_by('slug', $author_name) : 
        get_userdata(intval($author));
?>

<h2>О: <?php echo $curauth->nickname; ?></h2>
<dl>
    <dt>Веб-сайт</dt>
    <dd><a href="<?php echo $curauth->user_url; ?>"><?php echo $curauth->user_url; ?></a></dd>
    <dt>Профиль</dt>
    <dd><?php echo $curauth->user_description; ?></dd>
</dl>

<h2>Записи автора <?php echo $curauth->nickname; ?>:</h2>

<ul>
<!-- Цикл (The Loop) -->
<?php

// Предполагая, что ваш тип записи называется 'your_post_type'
$args = array(
    'author' => $curauth->ID,
    'post_type' => 'your_post_type',
);
$author_posts = new WP_Query( $args );
if( $author_posts->have_posts() ) {
    while( $author_posts->have_posts() ) {
        $author_posts->the_post();
        // заголовок, содержимое и т.д.
        the_title();
        the_content();
        // у вас должен быть доступ ко всем тегам, которые обычно
        // можно использовать в Цикле (The Loop)
    }
    wp_reset_postdata();
}
?>

<!-- Конец цикла -->

</ul>
</div>
<?php get_sidebar(); ?>
<?php get_footer(); ?>

Этот код шаблона author.php беззастенчиво позаимствован из Кодекса и, вероятно, должен рассматриваться как отправная точка, а не конечный продукт.

22 июл. 2013 г. 23:59:38
Комментарии

Знаю, что получу за это критику... но я пытаюсь сделать это с помощью плагина "Allow PHP in Post and Pages", и кажется, что у него проблемы с оператором if. Я не могу понять почему, но он просто перестает что-либо делать, как только доходит до этого момента.

m0ngr31 m0ngr31
23 июл. 2013 г. 00:26:36

Код, который я опубликовал, предназначен для добавления в файл functions.php или плагин. У меня нет опыта работы с плагином Allow PHP in Posts and Pages(?).

Pat J Pat J
23 июл. 2013 г. 00:34:36

Как мне добавить его в functions.php? Я не очень силен в PHP. Полагаю, мне нужно поместить его в функцию, но я не уверен, как работать с add_action или как вызывать это со страницы.

m0ngr31 m0ngr31
23 июл. 2013 г. 00:48:56

Я обновил свой ответ.

Pat J Pat J
23 июл. 2013 г. 01:55:07

Привет, отвечаю с опозданием, но я попробовал ваш способ для постов пользователя в CPT (events), однако столкнулся с ошибкой 500 на странице пользователя, у которого есть посты — страницы пользователей без постов (т.е. пустой запрос) работают нормально. Не могли бы вы взглянуть? Вот моя паста с шаблоном автора (не обращайте внимания на кастомные поля :) ): http://pastebin.com/NLNSYC0c. Заранее спасибо!

physalis physalis
19 сент. 2014 г. 15:27:32

Обновление: Я разобрался, несмотря на ограниченные знания PHP. Оказалось, нужно заменить $author_posts->the_title(); на стандартный get_the_title() и т.д., и всё работает идеально (см. http://pastebin.com/1FHFGFQs). Спасибо, что направили меня в нужное русло (возможно, вы могли бы обновить ваше решение выше).

physalis physalis
19 сент. 2014 г. 15:51:20

Я обновил код. Если get_the_title() работает, тогда the_title() и the_content() тоже должны работать. (Оказывается, я делаю нечто очень похожее на сайте, который настраивал некоторое время назад.)

Pat J Pat J
19 сент. 2014 г. 16:08:14

Первая часть работает отлично. Просто использовал get_the_author_meta('ID'); чтобы установить $author_id.

Jordan Jordan
23 дек. 2016 г. 21:30:53

Вы забыли закрывающую скобку в while-выражении:

while( $author_posts->have_posts()) {

Jason Glisson Jason Glisson
11 июл. 2020 г. 06:44:22

Так и сделал. Хорошее замечание. Теперь я это исправил.

Pat J Pat J
11 июл. 2020 г. 23:46:44
Показать остальные 5 комментариев
2

Используйте хук pre_get_posts для добавления вашего пользовательского типа записи в шаблон author.php

В файле functions.php добавьте следующий код. Это добавит ваш пользовательский тип записи в основной запрос, чтобы он отображался на странице автора

function wpse107459_add_cpt_author( $query ) {
    if ( !is_admin() && $query->is_author() && $query->is_main_query() ) {
        $query->set( 'post_type', array('post', 'YOUR_CUSTOM_POST_TYPE' ) );
    }
}
add_action( 'pre_get_posts', 'wpse107459_add_cpt_author' );

С этим изменением вам не нужно вносить никаких правок в файлы шаблонов :-)

19 сент. 2014 г. 16:18:20
Комментарии

Привет @PieterGoosen Это почти идеально подходит для моих нужд, но я хотел бы отображать только CPT. В строке $query->set я мог бы просто удалить 'post', но это вызовет проблемы на главном блоге. Вы не подскажете, как мне настроить код так, чтобы он применялся только к пользовательским типам записей? В псевдокоде это выглядело бы так: if (post-type('cpt-name') { // выполнить код }, но я не могу найти решение.

pjk_ok pjk_ok
11 янв. 2018 г. 22:53:54

Спасибо за это. Только что решил свою проблему после 10 других попыток разными методами.

Abdul Sadik Yalcin Abdul Sadik Yalcin
7 нояб. 2018 г. 17:54:40