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

28 мая 2013 г., 23:28:01
Просмотры: 35.5K
Голосов: 12

Я пытаюсь получить все записи определенного произвольного типа записей, используя следующий код:

$auctions = get_posts(array('post_type' => 'auction'));
print_r($auctions);
echo '<select>';
foreach ($auctions as $auction) {
    echo '<option value="' . $auction->ID . '">' . $auction->post_title . '</option>';
}
echo '</select>';

Хотя функция print_r() показывает данные, цикл foreach, похоже, игнорирует их и ничего не выводит. Есть идеи?

Буду благодарен за любую помощь

Вывод print_r():

Array (
    [0] => WP_Post Object (
        [ID] => 36
        [post_author] => 1
        [post_date] =>    2013-05-19 10:58:45
        [post_date_gmt] => 2013-05-19 08:58:45
        [post_content] =>
        [post_title] => Мой заголовок
        [post_excerpt] =>
        [post_status] => publish
        [comment_status] => closed
        [ping_status] => closed
        [post_password] =>
        [post_name] => my-title
        [to_ping] =>
        [pinged] =>
        [post_modified] => 2013-05-24 09:55:53
        [post_modified_gmt] => 2013-05-24 07:55:53
        [post_content_filtered] =>
        [post_parent] => 0
        [guid] => http://domain.com/?post_type=auction&p=36
        [menu_order] => 0
        [post_type] => auction
        [post_mime_type] =>
        [comment_count] => 0
        [filter] => raw
    )   
) 
5
Комментарии

Что выводит print_r( $auctions );? (Добавьте это в ваш вопрос; в комментариях будет очень сложно прочитать.)

Pat J Pat J
28 мая 2013 г. 23:38:22

Данные print_r() добавлены

leemon leemon
28 мая 2013 г. 23:45:17

Отображается ли оператор <select>...</select> в сгенерированном HTML? Если вы посмотрите исходный код вашей страницы, выглядит ли он корректно?

Pat J Pat J
28 мая 2013 г. 23:51:38

Упс... опечатка, которую я допустил, помешала правильному выводу. В любом случае, спасибо!

leemon leemon
29 мая 2013 г. 00:05:59

@user1991185, была ли эта опечатка причиной проблемы, и вопрос решён?

Rarst Rarst
29 мая 2013 г. 00:49:51
Все ответы на вопрос 4
2
14

Вы можете использовать wp_query() для реализации этого функционала

$args = array(
        'post_type' => 'auction',
        'posts_per_page' => -1
    );
$query = new WP_Query($args);
if ($query->have_posts()): 
    echo '<select>';
    while ($query->have_posts()): $query->the_post();
            echo '<option value="' . get_the_ID() . '">' . get_the_title() . '</option>';
    endwhile;
    echo '</select>';
    wp_reset_postdata();
endif;

Документация по WP_Query https://codex.wordpress.org/Class_Reference/WP_Query

7 июн. 2019 г. 20:22:54
Комментарии

пожалуйста, обновите код с wp_reset_postdata(). Там ошибка.

Ashish Yadav Ashish Yadav
2 мар. 2020 г. 10:09:05

Получил ошибку, потому что в строке 4 отсутствует точка с запятой (после массива $args). Возможно, стоит это исправить.

Arrowcatch Arrowcatch
22 июн. 2020 г. 09:07:00
4

Возможно, потому что get_posts возвращает объект, вам нужно установить данные записи согласно Codex get_posts. Замените строку 4 на:

foreach($auctions as $auction) : setup_postdata($auction) { 
28 мая 2013 г. 23:58:27
Комментарии

get_posts() возвращает массив http://codex.wordpress.org/Template_Tags/get_posts#Return_Value, а setup_postdata используется для возможности применения тегов шаблона, таких как the_ID()

Andrew Bartel Andrew Bartel
29 мая 2013 г. 00:02:19

Ах, да, я вижу это ниже на странице. Спасибо @AndrewBartel

stellarcowboy stellarcowboy
29 мая 2013 г. 00:05:14

Обратите внимание, что в таких циклах обычно используется as $post для установки глобальной переменной $post, либо это нужно делать дополнительно. setup_postdata() этого не делает.

Rarst Rarst
29 мая 2013 г. 00:52:31

Отличная находка, @Rarst.. полезно это знать.

stellarcowboy stellarcowboy
29 мая 2013 г. 01:04:06
0

Попробуйте без get_posts(). У меня сейчас есть похожая функция, которая работает так:

$args = array( 'post_type' => 'customPostName', 'post_status' => 'publish');
$pages = get_pages($args);
foreach ( $pages as $page ) {
    // Делаем что-то
    }

Редактирование: Вообще-то я не уверен, почему это не работает, так как в кодексе четко сказано использовать echo $post->ID; с get_posts. http://codex.wordpress.org/Function_Reference/get_posts#Access_all_post_data

Есть ли для вас разница в этом варианте?

    foreach ($auctions as $auction) {
        $option = '<option value="';
        $option .= $auction->ID;
        $option .= '">';
        $option .= $auction->post_title;
        $option .= '</option>';

        echo $option;
28 мая 2013 г. 23:59:26
0
        'post_type' => 'auction',
        'posts_per_page' => -1,
        'post_status' => 'publish',
    );
$query = new WP_Query($args);
if ($query->have_posts() ) : 
    echo '<select>';
    while ( $query->have_posts() ) : $query->the_post();
            echo '<option value="' . get_the_ID() . '">' . get_the_title() . '</option>';
    endwhile;
    echo '</select>';
    wp_reset_postdata();
endif;

@gregory был по сути прав, но допустил несколько опечаток... В массиве не хватало закрывающей ; и в конце reset_postdata(); должно быть wp_reset_postdata();. Теперь этот код должен работать корректно... У меня он работает отлично, без каких-либо проблем! Надеюсь, это поможет!

17 дек. 2019 г. 19:31:18