Запрос для пользовательского типа записей?

6 янв. 2011 г., 12:14:22
Просмотры: 174K
Голосов: 18

Я установил плагин Custom Post Type UI. После активации этого плагина я создал пользовательский тип записей под названием portfolio. Теперь я хочу использовать его на странице портфолио во фронтенде. Как мне получить все записи пользовательского типа portfolio?

0
Все ответы на вопрос 3
1
24
query_posts( array( 'post_type' => array('post', 'portfolio') ) );

который показывает как обычные записи, так и записи типа portfolio

или

query_posts('post_type=portfolio');

только для типа portfolio.

Используйте как обычный WP Query - читайте в Кодексе: http://codex.wordpress.org/Function_Reference/query_posts#Usage и http://codex.wordpress.org/Function_Reference/query_posts#Post_.26_Page_Parameters

<?php 
    query_posts(array( 
        'post_type' => 'portfolio',
        'showposts' => 10 
    ) );  
?>
<?php while (have_posts()) : the_post(); ?>
        <h2><a href="<?php the_permalink() ?>"><?php the_title(); ?></a></h2>
        <p><?php echo get_the_excerpt(); ?></p>
<?php endwhile;?>
6 янв. 2011 г. 12:33:02
Комментарии

Это довольно старый ответ, но для ясности: это не тот способ, которым следует поступать. Это почти неизбежно приведёт к ошибкам 404 и множеству других проблем. Пожалуйста, ознакомьтесь с ответами @kaiser или этой статьёй о том, почему не стоит использовать query_posts()

Stephen Harris Stephen Harris
28 мая 2013 г. 16:24:26
5
18

Поздний ответ, так как основной ответ использует query_posts(), что никогда не следует делать.

Используйте фильтр

Используйте фильтр pre_get_posts и просто установите тип записи portfolio для основного запроса. Используйте Условные теги для определения, где вы хотите применить этот фильтр.

Краткий пример

<?php
defined( 'ABSPATH' ) OR exit;
/* Plugin Name: (#6417) Тип записи "Portfolio" в запросе */

add_filter( 'pre_get_posts', 'wpse_6417_portfolio_posts' );
function wpse_6417_portfolio_posts( $query )
{
    if (
        ! $query->is_main_query()
        // Здесь мы можем проверить все Условные теги
        OR ! $query->is_archive() // Например: Все архивы будут содержать оба типа записей
    )
        return $query;

    $query->set( 'post_type', array( 'post', 'portfolio' ) );

    return $query;
}

Отказ от ответственности

Приведённый выше код является плагином, но может быть просто помещён в файл functions.php вашей темы (что не рекомендуется).

27 мая 2013 г. 16:42:29
Комментарии

Почему не рекомендуется добавлять это в functions.php? Конечно, если администратор сайта сменит тему, ему всё равно нужно будет решить, как отображать портфолио на главной странице с новой темой. Так что, я бы сказал, что добавление этого в functions.php так же оправдано, как и в плагин. Или я что-то упускаю?

Phill Healey Phill Healey
29 нояб. 2016 г. 22:21:32

@PhillHealey Как вы сказали, данные будут невидимыми, и вам придётся копировать и вставлять код. Серьёзные изменения логики запросов лучше реализовывать через плагины, а отображение и стилизацию стоит оставлять в темах.

kaiser kaiser
29 нояб. 2016 г. 22:45:33

Если этот код специфичен для темы, то нет.

Phill Healey Phill Healey
3 дек. 2016 г. 23:27:00

@PhillHealey Тип записи никогда не должен быть привязан к конкретной теме.

kaiser kaiser
4 дек. 2016 г. 20:33:06

Хорошо, если хотите поспорить об абсолютных утверждениях, то ладно. Однако неправильно говорить, что весь код, не связанный с дизайном, должен выноситься в плагин. Есть множество случаев, когда это нецелесообразно.

Phill Healey Phill Healey
5 дек. 2016 г. 20:23:49
0

Добавьте этот код в функции вашей дочерней темы (рекомендуется), чтобы включить страницы вашего пользовательского типа записи (CPT) в основной цикл

add_action( 'pre_get_posts', 'add_custom_post_types_to_loop' );

function add_custom_post_types_to_loop( $query ) {

if ( is_home() && $query->is_main_query() )

$query->set( 'post_type', array( 'post', 'portfolio' ) );

return $query;

}

Источник http://codex.wordpress.org/Post_Types

Или создайте пользовательский шаблон страницы archive-portfolio.php, который будет отображать только страницы вашего CPT. Это нужно делать только если вы не добавили архивную страницу через настройки плагина.

Пример: 'has_archive' => true,

Вы также можете контролировать количество отображаемых страниц и порядок их отображения на архивной странице с помощью этого кода:

add_action( 'pre_get_posts', 'cpt_items' );

function cpt_items( $query ) {

if( $query->is_main_query() && !is_admin() && is_post_type_archive( 'portfolio' ) ) {

$query->set( 'posts_per_page', '8' );

$query->set( 'order', 'ASC' );

    }

}
11 дек. 2013 г. 02:02:08