Truy vấn cho loại bài tùy chỉnh? [đóng cửa]


16

Tôi đã cài đặt plugin UI Loại bài tùy chỉnh . Sau khi kích hoạt plugin này, tôi đã tạo ra một loại bài đăng tùy chỉnh được gọi là portfolio. Bây giờ tôi muốn sử dụng điều này trên trang danh mục đầu tư. Làm cách nào để tìm nạp tất cả các bài đăng thuộc loại bài đăng tùy chỉnhportfolio ?

Câu trả lời:


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

trong đó hiển thị cả bài viết bình thường và bài viết bên trong portfolioloại

hoặc là

query_posts('post_type=portfolio');

chỉ portfolio.

Sử dụng như Truy vấn WP thông thường - đọc Codex: http://codex.wordpress.org/Function_Reference/query_posts#Usagehttp://codex.wordpress.org/Function_Reference/query_posts#Post_.26_Page_Parameter

<?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
Đây là một câu trả lời khá cũ - nhưng rõ ràng, không có cách nào bạn nên làm điều này. Nó gần như chắc chắn sẽ dẫn đến 404s và một loạt các vấn đề khác. Vui lòng xem câu trả lời của @ kaiser hoặc bài đăng này về lý do bạn không nên sử dụngquery_posts()
Stephen Harris

16

Câu trả lời muộn là câu trả lời chính sử dụng query_posts(), không bao giờ nên làm.

Sử dụng bộ lọc

Sử dụng pre_get_postsbộ lọc và chỉ đặt portfolioloại bài đăng cho truy vấn chính. Sử dụng Thẻ có điều kiện để xác định nơi bạn muốn có bộ lọc này.

Ví dụ nhanh

<?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;
}

Khước từ

Đoạn mã trên là một plugin, nhưng đơn giản là có thể bị nhồi trong functions.phptệp chủ đề của bạn ( không được khuyến nghị).


Tại sao không nên thêm nó vào chức năng? Chắc chắn, nếu quản trị viên trang web thay đổi chủ đề, họ sẽ cần phải giải quyết cách hiển thị danh mục đầu tư trên trang chủ với chủ đề mới này. Vì vậy, tôi sẽ nói rằng nó chỉ hợp lệ khi thêm cái này vào các hàm chứ không phải là một plugin. Hay tôi đang thiếu một cái gì đó?
Phill Healey

@PhillHealey Như bạn đã nói, dữ liệu sẽ vô hình và bạn sẽ phải sao chép và dán mã xung quanh. Các sửa đổi nặng, logic cho các truy vấn được phục vụ tốt nhất thông qua các plugin, trong khi hiển thị và kiểu dáng nên được giữ trong các chủ đề.
kaiser

Không phải nếu mã đó là cụ thể cho chủ đề.
Phill Healey

@PhillHealey Một loại bài đăng không bao giờ nên cụ thể cho một chủ đề.
kaiser

Ok, nếu bạn muốn có được một số tiêu chuẩn trên tuyệt đối thì tốt. Tuy nhiên, thật không đúng khi nói rằng không có mã cụ thể nào về thiết kế nên được đẩy ra một plugin. Có rất nhiều lần khi điều đó không thích hợp.
Phill Healey

4

Thêm mã này vào tệp chức năng chủ đề con của bạn (được khuyến nghị) để thêm các trang CPT duy nhất vào vòng lặp chính của bạn

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;

}

Nguồn http://codex.wordpress.org/Post_Types

Hoặc tạo một mẫu trang lưu trữ tùy chỉnh-portfolio.php sẽ chỉ hiển thị các trang CPT của bạn. Điều này chỉ cần được thực hiện nếu bạn chưa thêm trang lưu trữ bằng cài đặt plugin.

Ví dụ: 'has_archive' => đúng,

Bạn cũng có thể kiểm soát số lượng trang được hiển thị và thứ tự chúng được hiển thị trên trang lưu trữ bằng mã này:

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' );

    }

}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.