คุณแสดงที่เก็บถาวรของประเภทโพสต์ที่กำหนดเองตามปีและเดือนได้อย่างไร
คุณแสดงที่เก็บถาวรของประเภทโพสต์ที่กำหนดเองตามปีและเดือนได้อย่างไร
คำตอบ:
ใช่คุณสามารถ. สิ่งที่คุณต้องทำคือสร้างตัวกรองเพื่อ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>';
/%category%/%year%/%monthnum%/%postname%/
แต่ผมใช้ประเภทการโพสต์และเปลี่ยนโครงสร้างความคิดเห็นของฉันไป จากนั้นอาจเป็นไปได้โดยใช้ hook คล้ายกับด้านบนเพื่อแก้ไขลิงก์ที่เริ่มต้นด้วย/%category%/
แทนที่จะเป็นแค่วันที่
mysite.com/2013/04
แต่สิ่งนี้นำไปสู่ 404 ประเภทโพสต์ที่กำหนดเองมีอยู่ที่: mysite.com/cats
ซึ่งทำให้ฉันคิดว่าmysite.com/cats/2013/04
ควรจะเป็นลิงค์ที่ควรจะเป็น
คุณทำไม่ได้บรรทัดอย่างเป็นทางการจากนักพัฒนา Wordpress คือประเภทโพสต์ที่กำหนดเองไม่ได้ตั้งใจทำงานโพสต์ธรรมดาทั่วไปและถ้าคุณต้องการโพสต์จดหมายเหตุของวันที่ ฯลฯ คุณไม่ได้ทำสิ่งถูกต้อง และคุณควรใช้โพสต์รูปแบบ ฯลฯ
ประเภทโพสต์ที่กำหนดเองนั้นมีไว้สำหรับเว็บแอปพลิเคชั่น ฯลฯ ในขณะที่ทำอะไรบางอย่างเช่นการตั้งค่าประเภทโพสต์ที่กำหนดเองที่ทำหน้าที่เป็นบล็อกรองหรือขนานที่มีชื่อแตกต่างกันเช่นบล็อก vs ข่าวด้วยความสามารถเดียวกัน มีไว้สำหรับและจะหมายถึงปัญหาทางเทคนิคอื่น ๆ ที่เกิดขึ้นจากการใช้งาน
หากคุณยังคงยืนหยัดในเรื่องนี้และเพียงแค่ใช้ taxonomies แบบกำหนดเองและรูปแบบการโพสต์ไม่เพียงพอคุณสามารถเพิ่มกฎการเขียนซ้ำใน function.php และการเปลี่ยนเส้นทางการเก็บถาวรปี / เดือนใน URL ที่แน่นอนไปยังหน้าการเก็บถาวรการโพสต์ หน้าโพสต์ไฟล์เก็บถาวรหากคุณระบุตัวแปรในกฎการเขียนซ้ำและโหลดเทมเพลตที่แตกต่างกันตรวจสอบให้แน่ใจในกฎการเขียนซ้ำเพื่อตั้งค่าที่เหมาะสม
แก้ไข -> ในขณะที่คำตอบนี้ยังใช้ได้กับ <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
เพื่อให้คุณสามารถใช้อาร์กิวเมนต์ปกติที่ยอมรับได้ อย่างไรก็ตามเพียงเพิ่มความสามารถให้คุณสามารถเพิ่มอาร์กิวเมนต์ชื่อประเภทโพสต์ที่กำหนดเอง
ชื่อเสียงไม่เพียงพอที่จะเพิ่มสิ่งนี้ในคำตอบของ 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);
ไม่สามารถเพิ่มไปยังโพสต์ของ 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'));