Как получить записи по произвольному типу записей и отобразить пользовательские поля?
У меня есть произвольный тип записей для Рецептов, и внутри него я настроил 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')
) /* конец опций */
); /* конец регистрации типа записи */

Возможно, вам будет интересно это почитать. Я не уверен, что именно вы хотите сделать, поэтому изложу это в простом формате.
Этот запрос выберет все записи типа 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(); ?>

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

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

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

вот с чем я сейчас работаю: <?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 '

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

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

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