Запрос для пользовательского типа сообщения? [закрыто]

16

Я установил пользовательский интерфейс пользовательского типа . После активации этого плагина я создал пользовательский тип записи с именем portfolio. Теперь я хочу использовать это на странице портфолио в интерфейсе. Как получить все сообщения, которые имеют пользовательский тип сообщенияportfolio ?

Шала
источник

Ответы:

22
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;?>
Martin-Al
источник
6
Это довольно старый ответ - но, чтобы быть ясным, вам не следует так поступать. Это почти неизбежно приведет к 404-м и множеству других проблем. Пожалуйста, смотрите @ kaiser ответы или этот пост о том, почему вы не должны использоватьquery_posts()
Стивен Харрис
16

Поздний ответ в качестве основного ответа query_posts(), который никогда не должен быть сделано.

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

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

Быстрый пример

<?php
defined( 'ABSPATH' ) OR exit;
/* Plugin Name: (#6417) "Portfolio" post type in query */

add_filter( 'pre_get_posts', 'wpse_6417_portfolio_posts' );
function wpse_6417_portfolio_posts( $query )
{
    if (
        ! $query->is_main_query()
        // Here we can check for all Conditional Tags
        OR ! $query->is_archive() // For e.g.: Every archive will feature both post types
    )
        return $query;

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

    return $query;
}

отказ

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

кайзер
источник
почему не рекомендуется добавлять его в функции? Конечно, если администратор сайта изменит тему, он должен будет решить, как отобразить портфолио на главной странице с этой новой темой. Итак, я бы сказал, что это так же правильно добавить это в функции, а не плагин. Или я что-то упустил?
Фил Хили
@PhillHealey Как вы сказали, данные будут невидимы, и вам придется копировать и вставлять код вокруг. Тяжелые, логические модификации запросов лучше всего обслуживать с помощью плагинов, а отображение и стилирование следует сохранять в темах.
Кайзер
Нет, если этот код относится к теме.
Фил Хили
@PhillHealey Тип сообщения никогда не должен быть специфическим для темы.
Кайзер
Ладно, если ты хочешь поучаствовать в абсолюте, то ладно. Тем не менее, просто неправильно говорить, что ни один код, специфичный для дизайна, не должен быть добавлен в плагин. Есть много раз, когда это не подходит.
Фил Хили
4

Добавьте этот код в файл функций своих дочерних тем (рекомендуется), чтобы добавить отдельные страницы 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' );

    }

}
Брэд Далтон
источник