Запит на тип користувальницької пошти? [зачинено]


16

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

Відповіді:


22
query_posts( array( 'post_type' => array('post', 'portfolio') ) );

який показує як звичайні повідомлення, так і повідомлення всередині portfolioтипу

або

query_posts('post_type=portfolio');

тільки для portfolio.

Використовувати як звичайний WP-запит - читайте Codex: 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
Це досить стара відповідь - але щоб бути зрозумілим, не так, як ви повинні це робити. Це майже неминуче призведе до 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' );

    }

}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.