Как получить записи по произвольному типу записей и отобразить пользовательские поля?

25 февр. 2014 г., 22:05:02
Просмотры: 23.8K
Голосов: 6

У меня есть произвольный тип записей для Рецептов, и внутри него я настроил Advanced Custom Fields (из плагина).

Внутри этого произвольного типа записей у меня несколько категорий. Два вопроса:

1.) Как получить все записи из пользовательской категории? Я понимаю, как отображать пользовательские поля, но не уверен, как вызвать все записи из пользовательской категории, чтобы затем отобразить их заголовок, изображение и ссылку.

2.) В сценарии с произвольным типом записей лучше настроить пользовательские категории или использовать обычные категории записей?

Я пробовал get_posts, затем пытался получить записи по пользовательской категории. Например:

<?php
$args = array(
     'posts_per_page' => 8,
     'orderby' => 'rand',
     'post_type' => 'recipes',
     'type' => 'side-dishes',
     'post_status' => 'publish'
);
$show_albums = get_posts( $args );
?>

Я не знаю точной реализации, так как post_type является пользовательским, и думаю, что мне нужно будет использовать foreach для использования the_field (из ACF)

=========================================================== Хорошо, после предложения ниже вот что у меня есть, подскажите, правильно ли я делаю?

Вот запрос - который, похоже, работает:

<?php

// The Query
$the_query = new WP_Query($args = array(
    'post_type' => 'recipes',
    'custom_cat' => 'side-dishes'
) );

// The Loop
if ( $the_query->have_posts() ) {
        echo '<ul>';
    while ( $the_query->have_posts() ) {
        $the_query->the_post();
        echo '<li>' . get_the_title() . '</li>';
    }
        echo '</ul>';
} else {
    // no posts found
}
/* Restore original Post Data */
wp_reset_postdata();?>

Я зарегистрировал таксономию, но что меня смущает: мой зарегистрированный post-type - это recipes, разве register_taxonomy не должен быть "recipes", а не 'custom_cat'?

register_taxonomy( 'custom_cat', 
        array('recipes'), /* если вы измените имя register_post_type( 'custom_type', тогда вам нужно изменить это */
        array('hierarchical' => true,     /* если true, работает как категории */
            'labels' => array(
                'name' => __( 'Категории рецептов', 'bonestheme' ), /* название пользовательской таксономии */
                'singular_name' => __( 'Категория рецепта', 'bonestheme' ), /* единственное название таксономии */
                'search_items' =>  __( 'Поиск категорий рецептов', 'bonestheme' ), /* заголовок поиска для таксономии */
                'all_items' => __( 'Все категории рецептов', 'bonestheme' ), /* заголовок для всех таксономий */
                'parent_item' => __( 'Родительская категория рецепта', 'bonestheme' ), /* родительский заголовок для таксономии */
                'parent_item_colon' => __( 'Родительская пользовательская категория:', 'bonestheme' ), /* родительский заголовок таксономии */
                'edit_item' => __( 'Редактировать пользовательскую категорию', 'bonestheme' ), /* заголовок редактирования пользовательской таксономии */
                'update_item' => __( 'Обновить пользовательскую категорию', 'bonestheme' ), /* заголовок обновления для таксономии */
                'add_new_item' => __( 'Добавить новую пользовательскую категорию', 'bonestheme' ), /* заголовок добавления нового для таксономии */
                'new_item_name' => __( 'Новое название пользовательской категории', 'bonestheme' ) /* название заголовка для таксономии */
            ),
            'show_admin_column' => true, 
            'show_ui' => true,
            'query_var' => true,
            'rewrite' => array( 'slug' => 'custom-slug' ),
        )
    );

вот зарегистрированный тип записи:

function create_recipe() { 
    // создание (регистрация) пользовательского типа 
    register_post_type( 'recipes', /* (http://codex.wordpress.org/Function_Reference/register_post_type) */
        // давайте добавим все опции для этого типа записи
        array( 'labels' => array(
            'name' => __( 'Рецепты', 'bonestheme' ), /* Это заголовок группы */
            'singular_name' => __( 'Рецепт', 'bonestheme' ), /* Это индивидуальный тип */
            'all_items' => __( 'Все рецепты', 'bonestheme' ), /* пункт меню все элементы */
            'add_new' => __( 'Добавить новый рецепт', 'bonestheme' ), /* Пункт меню добавить новый */
            'add_new_item' => __( 'Добавить рецепт', 'bonestheme' ), /* Заголовок добавления нового */
            'edit' => __( 'Редактировать', 'bonestheme' ), /* Диалог редактирования */
            'edit_item' => __( 'Редактировать рецепт', 'bonestheme' ), /* Заголовок редактирования */
            'new_item' => __( 'Новый тип рецепта', 'bonestheme' ), /* Заголовок нового */
            'view_item' => __( 'Просмотр рецепта', 'bonestheme' ), /* Заголовок просмотра */
            'search_items' => __( 'Поиск рецептов', 'bonestheme' ), /* Заголовок поиска пользовательского типа */ 
            'not_found' =>  __( 'Ничего не найдено в базе данных.', 'bonestheme' ), /* Отображается, если записей еще нет */ 
            'not_found_in_trash' => __( 'В корзине ничего не найдено', 'bonestheme' ), /* Отображается, если в корзине ничего нет */
            'parent_item_colon' => ''
            ), /* конец массивов */
            'description' => __( 'Раздел рецептов для It\'s Just food', 'bonestheme' ), /* Описание пользовательского типа */
            'public' => true,
            'publicly_queryable' => true,
            'exclude_from_search' => false,
            'show_ui' => true,
            'query_var' => true,
            'menu_position' => 4, /* это порядок отображения в меню слева */ 
            'menu_icon' => get_stylesheet_directory_uri() . '/library/images/custom-post-icon.png', /* иконка для меню пользовательского типа записи */
            'rewrite'   => array( 'slug' => 'recipes', 'with_front' => false ), /* можно указать slug для URL */
            'has_archive' => 'recipes', /* можно переименовать slug здесь */
            'capability_type' => 'post',
            'hierarchical' => false,
            /* следующее важно, оно указывает, что включено в редакторе записей */
            'supports' => array( 'title', 'editor', 'author', 'thumbnail', 'excerpt', 'trackbacks', 'custom-fields', 'comments', 'revisions', 'sticky')
        ) /* конец опций */
    ); /* конец регистрации типа записи */
2
Комментарии

Что вы уже пробовали? Проводили ли вы какие-либо исследования? Пробовали ли использовать WP_Query?

Howdy_McGee Howdy_McGee
25 февр. 2014 г. 22:24:53

Да, вы правы, я дополню свой вопрос, добавив то, что пробовал.

user31344 user31344
25 февр. 2014 г. 22:28:52
Все ответы на вопрос 1
8

Возможно, вам будет интересно это почитать. Я не уверен, что именно вы хотите сделать, поэтому изложу это в простом формате.

Этот запрос выберет все записи типа recipes, где существует произвольное поле side-dishes. Затем вы можете перебрать их и отобразить так, как вам нужно.

$recipes = new WP_Query(
    array(
        'post_type' => 'recipes',
        'posts_per_page' => 8,
        'orderby' => 'rand',
        'post_status' => 'publish',
        'meta_query' => array(
            array(
                'key' => 'side-dishes'
                'compare' => 'EXISTS'
            )
        )
    )
);

Второй запрос выберет все записи таксономии my_taxonomy_name_here (замените на вашу таксономию). Он ищет категории с ярлыком my_category_slug_here (замените на ярлык вашей категории). Вы можете заменить 'slug' на 'ID' и выбирать по идентификатору, если хотите.

$recipes = new WP_Query(
    array(
        'post_type' => 'recipes',
        'posts_per_page' => 8,
        'orderby' => 'rand',
        'post_status' => 'publish',
        'tax_query' => array(
            array(
                'taxonomy' => 'my_taxonomy_name_here',
                'field' => 'slug',
                'terms' => 'my_category_slug_here'
            )
        )
    )
);

Затем вы можете перебрать записи в стандартном цикле:

<?php if($recipes->have_posts()) : ?>
    <?php while($recipes->have_posts()) : $recipes->the_post(); ?>
        <h1><?php the_title(); ?></h1>
        <?php the_content(); ?>
    <?php endwhile; ?>
<?php endif; wp_reset_query(); ?>

Документация по WP_Query

Документация по Meta_Query

Документация по Tax_Query

25 февр. 2014 г. 23:01:22
Комментарии

в шаблоне для этой страницы я уже вывожу записи с помощью <?php if (have_posts()) : while (have_posts()) : the_post(); ?> , будет ли wp_query излишним?

user31344 user31344
26 февр. 2014 г. 00:14:49

WP_Query - это стандартный способ отображения нескольких типов записей на одной странице. Цикл, который вы указали, является основным циклом для этого конкретного типа записи. Вы можете изменить основной цикл с помощью фильтра pre_get_posts, если хотите.

Howdy_McGee Howdy_McGee
26 февр. 2014 г. 00:23:18

хорошо, значит можно использовать два wp_query на одной странице, если они не мешают друг другу?

user31344 user31344
26 февр. 2014 г. 00:56:49

вот с чем я сейчас работаю: <?php

// Запрос $the_query = new WP_Query($args = array( 'post_type' => 'recipes', 'recipe' => 'side-dishes' ) );

// Цикл if ( $the_query->have_posts() ) { echo '

    '; while ( $the_query->have_posts() ) { $the_query->the_post(); echo '
  • ' . get_the_title() . '
  • '; } echo '
'; } else { // постов не найдено } /* Восстановление оригинальных данных поста */ wp_reset_postdata();?>

user31344 user31344
26 февр. 2014 г. 00:59:05

Вам не нужно передавать $args = array() в WP_Query, вы либо помещаете $args вне WP_Query, либо передаете массив напрямую внутрь WP_Query. Так я предполагаю, что ваша таксономия называется recipe, верно?

Howdy_McGee Howdy_McGee
26 февр. 2014 г. 16:37:14

она называется custom_cat, но вероятно должна называться recipe. Я изменил вышестоящий вопрос, включив текущее решение.

user31344 user31344
26 февр. 2014 г. 18:15:15

вот запрос - который, кажется, работает: -> Так есть какие-то проблемы или он сработал :D ?

Howdy_McGee Howdy_McGee
26 февр. 2014 г. 18:20:56

да, сработало, просто хотел проверить, есть ли какие-то проблемы с решением. Он может работать, но потом в будущем.. в любом случае, я очень ценю твоё время!

user31344 user31344
26 февр. 2014 г. 18:43:07
Показать остальные 3 комментариев