ค้นหาประเภทโพสต์ที่กำหนดเอง? [ปิด]


16

ฉันติดตั้งปลั๊กอิน Custom Post Type UIแล้ว portfolioหลังจากการเปิดใช้งานปลั๊กอินนี้ฉันได้สร้างประเภทโพสต์ที่กำหนดเองที่เรียกว่า ตอนนี้ฉันต้องการใช้สิ่งนี้ในหน้าผลงานในส่วนหน้า ฉันจะดึงข้อมูลโพสต์ทั้งหมดที่เป็นประเภทโพสต์ที่กำหนดเองได้portfolioอย่างไร

คำตอบ:


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

ซึ่งจะแสดงทั้งโพสต์ปกติและโพสต์ภายในportfolioประเภท

หรือ

query_posts('post_type=portfolio');

portfolioเพียง

ใช้ตามปกติ WP Query - อ่าน 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()
Stephen Harris

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ไฟล์ของธีมของคุณ (ซึ่งไม่แนะนำ)


ทำไมถึงไม่แนะนำให้เพิ่มเข้าไปในฟังก์ชั่น? แน่นอนถ้าผู้ดูแลไซต์เปลี่ยนธีมพวกเขาจะต้องระบุวิธีแสดงพอร์ตโฟลิโอในโฮมเพจด้วยธีมใหม่นี้ต่อไป ดังนั้นฉันจะบอกว่ามันเป็นเพียงที่ถูกต้องในการเพิ่มสิ่งนี้ในฟังก์ชั่นมากกว่าปลั๊กอิน หรือฉันกำลังพลาดอะไรอยู่?
Phill Healey

@PhillHealey อย่างที่คุณพูดข้อมูลจะมองไม่เห็นและคุณจะต้องคัดลอกและวางรหัสรอบ ๆ การแก้ไขตรรกะอย่างหนักเพื่อการสืบค้นจะได้รับบริการที่ดีที่สุดผ่านทางปลั๊กอินในขณะที่การแสดงและการจัดแต่งทรงผมควรเก็บไว้ในธีม
ไกเซอร์

ไม่ใช่ถ้ารหัสนั้นเฉพาะเจาะจงกับธีม
Phill Healey

@PhillHealey ประเภทโพสต์ไม่ควรเจาะจงกับธีม
ไกเซอร์

ตกลงถ้าคุณต้องการที่จะได้รับ tit-for-tat เหนือสัมบูรณ์แล้วก็ดี อย่างไรก็ตามมันก็ไม่ถูกต้องที่จะบอกว่าไม่มีรหัสเฉพาะการออกแบบควรถูกผลักออกไปยังปลั๊กอิน มีหลายครั้งที่มันไม่เหมาะสม
Phill Healey

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' => จริง

นอกจากนี้คุณยังสามารถควบคุมจำนวนหน้าที่จะแสดงและลำดับการแสดงบนหน้าเก็บถาวรโดยใช้รหัสนี้:

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

    }

}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.