ประเภทโพสต์ที่กำหนดเองเก็บตามปีและเดือน?


17

คุณแสดงที่เก็บถาวรของประเภทโพสต์ที่กำหนดเองตามปีและเดือนได้อย่างไร


โซลูชันด้านล่างของฉันใช้งานได้หากคุณใช้ <WP 4.4 แต่เนื่องจากการเปิดตัว WP 4.4 จึงทำให้ wp_get_archives () FINALLY สนับสนุนประเภทโพสต์ที่กำหนดเอง: developer.wordpress.org/reference/functions/wp_get_archives
เทรเวอร์

คำตอบ:


17

ใช่คุณสามารถ. สิ่งที่คุณต้องทำคือสร้างตัวกรองเพื่อwp_get_archives();ให้ยอมรับpost_typeพารามิเตอร์:

function my_custom_post_type_archive_where($where,$args){  
    $post_type  = isset($args['post_type'])  ? $args['post_type']  : 'post';  
    $where = "WHERE post_type = '$post_type' AND post_status = 'publish'";
    return $where;  
}

จากนั้นเรียกสิ่งนี้:

add_filter( 'getarchives_where','my_custom_post_type_archive_where',10,2);

เมื่อใดก็ตามที่คุณต้องการแสดงไฟล์เก็บถาวรตามประเภทโพสต์ที่กำหนดเองเพียงแค่ส่ง post_type args:

$args = array(
    'post_type'    => 'your_custom_post_type',
    'type'         => 'monthly',
    'echo'         => 0
);
echo '<ul>'.wp_get_archives($args).'</ul>';

3
คุณลองใช้วิธีนี้หรือไม่? มันดึงรายการของเดือนได้อย่างถูกต้องด้วยโพสต์จาก CPT ของคุณและจำนวนโพสต์ แต่ลิงก์นั้นไร้ประโยชน์ การคลิกที่รายการเหล่านี้จะนำคุณไปสู่เดือนทั้งเว็บไซต์ไม่ใช่สำหรับ CPT
jerclarke

หลังจากการขุดบางส่วน (ดูคำตอบของ Tom Nowell ด้านล่าง) ฉันเลิกใช้คลังเก็บรายเดือนสำหรับประเภทโพสต์ที่กำหนดเอง /%category%/%year%/%monthnum%/%postname%/แต่ผมใช้ประเภทการโพสต์และเปลี่ยนโครงสร้างความคิดเห็นของฉันไป จากนั้นอาจเป็นไปได้โดยใช้ hook คล้ายกับด้านบนเพื่อแก้ไขลิงก์ที่เริ่มต้นด้วย/%category%/แทนที่จะเป็นแค่วันที่
Kevin C.

คำถามนี้ สิ่งนี้สร้าง URL เช่น: mysite.com/2013/04แต่สิ่งนี้นำไปสู่ ​​404 ประเภทโพสต์ที่กำหนดเองมีอยู่ที่: mysite.com/catsซึ่งทำให้ฉันคิดว่าmysite.com/cats/2013/04ควรจะเป็นลิงค์ที่ควรจะเป็น
gaoshan88

2
ยิ่งไปกว่านั้นในที่สุดก็มีปลั๊กอินสำหรับจัดการกับฟังก์ชั่นที่ขาดหายไปใน WordPress มันถูกสร้างขึ้นโดยผู้สนับสนุนหลักพยายามแก้ไขปัญหานี้ในแกนกลาง มีการจัดเตรียมปลั๊กอินเพื่อให้เราผ่านจนกว่าจะมีการแก้ไขปัญหาในแกนกลางอย่างถูกต้อง wordpress.org/plugins/archives-for-custom-post-types
เทรเวอร์

6

คุณทำไม่ได้บรรทัดอย่างเป็นทางการจากนักพัฒนา Wordpress คือประเภทโพสต์ที่กำหนดเองไม่ได้ตั้งใจทำงานโพสต์ธรรมดาทั่วไปและถ้าคุณต้องการโพสต์จดหมายเหตุของวันที่ ฯลฯ คุณไม่ได้ทำสิ่งถูกต้อง และคุณควรใช้โพสต์รูปแบบ ฯลฯ

ประเภทโพสต์ที่กำหนดเองนั้นมีไว้สำหรับเว็บแอปพลิเคชั่น ฯลฯ ในขณะที่ทำอะไรบางอย่างเช่นการตั้งค่าประเภทโพสต์ที่กำหนดเองที่ทำหน้าที่เป็นบล็อกรองหรือขนานที่มีชื่อแตกต่างกันเช่นบล็อก vs ข่าวด้วยความสามารถเดียวกัน มีไว้สำหรับและจะหมายถึงปัญหาทางเทคนิคอื่น ๆ ที่เกิดขึ้นจากการใช้งาน

หากคุณยังคงยืนหยัดในเรื่องนี้และเพียงแค่ใช้ taxonomies แบบกำหนดเองและรูปแบบการโพสต์ไม่เพียงพอคุณสามารถเพิ่มกฎการเขียนซ้ำใน function.php และการเปลี่ยนเส้นทางการเก็บถาวรปี / เดือนใน URL ที่แน่นอนไปยังหน้าการเก็บถาวรการโพสต์ หน้าโพสต์ไฟล์เก็บถาวรหากคุณระบุตัวแปรในกฎการเขียนซ้ำและโหลดเทมเพลตที่แตกต่างกันตรวจสอบให้แน่ใจในกฎการเขียนซ้ำเพื่อตั้งค่าที่เหมาะสม


มันดูค่อนข้างแปลกที่พวกเขาจะไปไกลถึงฟังก์ชั่นนี้เท่านั้น คุณสามารถให้ตัวอย่างของการโพสต์ที่กำหนดเองได้อย่างไร
Dan Lee

ควรใช้โพสต์ที่กำหนดเองสำหรับสิ่งใดก็ตามที่ไม่ครอบคลุมโดยขอบเขตของหน้าและโพสต์บล็อก (หรือโพสต์บล็อกที่มีชื่อแตกต่างกัน แต่ทำงานเหมือนกันเช่นบทความ / ข่าว / ไดอารี่ / ฯลฯ ) ตัวอย่างของการใช้โพสต์ : กิจกรรมเมนูสถานที่ฟอร์มฟอร์มบันทึก ฯลฯ
Tom J Nowell

โพสต์ที่กำหนดเองนั้นเป็นวิธีในการผลิตเว็บแอพไม่ใช่วิธีการทำซ้ำเมนูโพสต์ในแบ็กเอนด์เพื่อการแก้ไขที่ง่ายขึ้น (และการใช้งานดังกล่าวจะทำให้ wordpress ทำงานช้าลงมากและเป็นงานมากกว่าที่คุณคิด)
Tom J Nowell

1
UUUUUgh นี่คือคำตอบที่ถูกต้องสำหรับคำถามที่น่าเศร้า ฉันไม่อยากจะเชื่อเลยว่าคำอธิบายข้างต้นมาจาก "เราไม่ควรมี URL วันที่สำหรับ CPT" แต่มันก็เกือบจะแน่นอน "วันที่ URL สำหรับ CPT นั้นซับซ้อนเกินไป" ซึ่งทำให้การตัดสินใจที่แท้จริงไม่นำไปใช้จริง มีบางกรณีที่ผู้คนต้องการเก็บถาวรวันที่สำหรับประเภทโพสต์ที่กำหนดเองคุณไม่สามารถทำให้ความปรารถนาที่ชัดเจนหายไปโดยชี้ให้เห็นรูปแบบโพสต์
jerclarke

1
ฉันต้องไม่เห็นด้วยอย่างยิ่ง ประเภทโพสต์ที่กำหนดเองนั้นมีไว้สำหรับใช้ในสิ่งที่คุณต้องการใช้ไม่ว่าจะอยู่ที่ไหนใน Codex ที่บอกว่าเป็น "แอปบนเว็บ" นอกจากนี้คุณอาจต้องการส่วน "ข่าว" ที่มีอนุกรมวิธานของตนเองและคุณต้องการเก็บถาวรสำหรับสิ่งเหล่านั้น หรือแม้กระทั่งประเภท "เหตุการณ์" ที่แนะนำซึ่งฉันเห็นด้วยก็คือการใช้งานที่สมบูรณ์แบบสำหรับ CPT แต่อีกครั้งที่ผู้ใช้อาจต้องการเก็บถาวรตามวันที่ได้อย่างง่ายดาย
เทรเวอร์

5

แก้ไข -> ในขณะที่คำตอบนี้ยังใช้ได้กับ <WP4.4 เนื่องจาก 4.4 รองรับประเภทโพสต์ที่กำหนดเองรวมอยู่ในนี้แล้วwp_get_archives()


ในที่สุดก็มีทางออกที่ง่ายรวดเร็วและง่ายสำหรับคลังเก็บแบบกำหนดวันที่ของประเภทโพสต์ที่กำหนดเองใน WordPress! นี่เป็นปัญหาที่ยาวนานที่บันทึกไว้ที่นี่ใน WP Core Trac

ยังไม่ได้รับการแก้ไข แต่หนึ่งในผู้ให้ข้อมูลของ Trac ได้โพสต์ปลั๊กอินอย่างง่ายใน GitHubที่จะช่วยให้คุณมีวันที่เก็บถาวรตาม CPTs

หลังจากติดตั้งปลั๊กอินนี้หรือเพิ่มรหัสสำหรับฟังก์ชั่นของคุณด้วยตนเองคุณสามารถใช้ไฟล์เก็บถาวรสำหรับ CPT เช่น:

<?php wp_get_archives_cpt( 'post_type=custom_post_type' ); ?>

หมายเหตุฟังก์ชั่นใหม่นี้ใช้wp_get_archives_cptงานได้เหมือนมาตรฐานwp_get_archivesเพื่อให้คุณสามารถใช้อาร์กิวเมนต์ปกติที่ยอมรับได้ อย่างไรก็ตามเพียงเพิ่มความสามารถให้คุณสามารถเพิ่มอาร์กิวเมนต์ชื่อประเภทโพสต์ที่กำหนดเอง


2

ชื่อเสียงไม่เพียงพอที่จะเพิ่มสิ่งนี้ในคำตอบของ taiken ขออภัย

อย่างไรก็ตามต้องการที่จะเพิ่มว่าคำตอบของเขาใช้งานได้สำหรับฉันอย่างไรก็ตามลิงก์อยู่ในรูปแบบ 'localhost / date / 2010' ในขณะที่ฉันต้องการรูปแบบ 'localhost / postslug / 2010' ฉันสามารถแก้ไขได้โดยใช้สตริงแทนที่บนเอาต์พุตของ wp_get_archives

ดังนั้นขึ้นอยู่กับวิธีตั้งค่าลิงก์ของคุณรหัสนี้จะแก้ไขปัญหา 404 และเปลี่ยนเส้นทางลิงก์ไปยังโครงสร้างลิงก์โพสต์ประเภทกำหนดเอง:

$yearly_archive = wp_get_archives(array( 'type' => 'yearly', 'post_type' => '<your post type name>', 'echo' => '0') );
$blog_url = get_bloginfo('url');
echo str_replace(($blog_url . '/date'), ($blog_url . '<your post type slug>'),$yearly_archive);

1

ไม่สามารถเพิ่มไปยังโพสต์ของ takien ดังนั้นนี่คือสิ่งที่ฉันต้องทำ:

functions.php

add_action('init', 'my_year_archive_rewrites');  
function my_year_archive_rewrites() {   
    add_rewrite_rule('resource/news/([0-9]{4})/page/?([0-9]{1,})/?', 'index.php?post_type=news&year=$matches[1]&paged=$matches[2]', 'top');
    add_rewrite_rule('resource/news/([0-9]{4})/?', 'index.php?post_type=news&year=$matches[1]', 'top');
}

add_filter('getarchives_where', 'my_custom_post_type_archive_where', 10, 2);
function my_custom_post_type_archive_where($where,$args){  
    $post_type = isset($args['post_type']) ? $args['post_type'] : 'post';  
    return "WHERE post_type = '$post_type' AND post_status = 'publish'";
}

add_filter('year_link', 'my_year_link');
function my_year_link($link) {
    global $wp_rewrite;

    if(true) { // however you determine what archive you want
        $link = str_replace($wp_rewrite->front, '/resource/news/', $link);
    }

    return $link;
}

กำลังโทร wp_get_archives ()

wp_get_archives(array('post_type'=>'news', 'type'=>'yearly'));

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