รับกระสุนชนิดโพสต์ที่กำหนดเองสำหรับหน้าเก็บถาวร


15

ฉันจะค้นพบกระสุนชนิดโพสต์ที่กำหนดเองได้อย่างไรเมื่อฉันอยู่ในหน้าเก็บถาวร

ตัวอย่างเช่นถ้า/products/ยิงarchive-products.phpแม่แบบฉันจะได้รับบุ้งชนิดโพสต์ได้อย่างไร (ในทางปฏิบัติ)

ขอบคุณ

คำตอบ:


18

get_post_type()ที่จะได้รับการใช้งานประเภทโพสต์ในปัจจุบัน จากนั้นขอget_post_type_object()ข้อมูลทั้งหมดที่คุณต้องการตัวอย่างเช่นตัวบุ้ง:

$post_type = get_post_type();
if ( $post_type )
{
    $post_type_data = get_post_type_object( $post_type );
    $post_type_slug = $post_type_data->rewrite['slug'];
    echo $post_type_slug;
}

1
ฉันคิดว่า (ไม่ได้ทดสอบ) get_queried_object()จะได้รับข้อมูลเดียวกันโดยใช้เวลาน้อยลง
Rarst

@ บางทีอาจจะ แต่ฉันคิดว่ารหัสที่ฉันแนะนำนั้นง่ายต่อการเข้าใจ
fuxia

1
โซลูชันของ Toscho ผิดเนื่องจาก get_post_type ส่งคืนชนิดโพสต์ของหน้าปัจจุบันและเมื่อคุณเข้าสู่หน้าเก็บถาวรฟังก์ชันนี้จะคืนค่า "หน้า" กลับคืนมาด้วย ฉันกำลังแก้ไขปัญหาเดียวกัน: เมื่อฉันเข้าสู่หน้าเก็บถาวรของ 'หนังสือ' (4 ตัวอย่าง) ฉันต้องการสิ่งนี้: 'หนังสือ' เมื่อฉันได้รับฉันจะโพสต์
eMarine

1
น่าเสียดายที่ไม่ใช่เรื่องง่ายแม้ว่าคุณจะดีกว่าด้วย$posttype = get_query_var('post_type');... ฉันได้เพิ่มทางเลือกที่ครอบคลุม
majick

ฉันไม่คิดว่านี่เป็นคำตอบที่ครอบคลุมเรื่องราวทั้งหมด คุณควรตรวจสอบกฎการเขียนซ้ำการติดตั้งเนื่องจากตัวกรองจำนวนมาก (เช่นหน้าร้านค้าของ WooCommerce) กำลังทำการเปลี่ยนแปลง ใช้ mecanism ของ Worpdress แทนดูคำตอบของฉันที่ด้านล่าง
Jonas Lundman

6

ฉันใช้สิ่งนี้นอกเหนือจากลูปในเทมเพลต archive.php เพื่อรับโพสต์เก็บถาวรแบบกำหนดเองที่ฉันใช้

เป็นคำสั่งผสมของวิธีการที่ทั้งสองแนะนำ @toscho และ @Rarst:

$post_type = get_queried_object();
echo $post_type->rewrite['slug'];

อัปเดต: @majick ชี้ให้เห็นว่าสิ่งนี้ใช้ได้เฉพาะในกรณีที่คุณได้ตั้งค่าการเขียนกระสุนสำหรับ CPT ของคุณ Slug Rewrite เป็นทางเลือกเมื่อลงทะเบียน CPT และค่าเริ่มต้นเป็น post_type หากไม่ได้ตั้งค่าไว้


เมื่อฉันลองสิ่งนี้ฉันจะได้รับNotice: Undefined property: stdClass::$rewrite in ***\wp-content\themes\marks-remarks\archive.php on line 4
patrickzdb

งานนี้จะมีเพียงถ้ากระสุนเขียนที่กำหนดไว้สำหรับเป่าลงทะเบียนตามที่มันเป็นตัวเลือกและเริ่มต้นที่ post_type
majick

ขอบคุณที่ติดตาม @majick! ฉันได้อัปเดตโพสต์เพื่อแสดงข้อมูลของคุณแล้ว
Jerry

ปรากฎว่าเป็นส่วนหนึ่งของภูเขาน้ำแข็ง ... ตรวจสอบคำตอบใหม่ของฉันสำหรับส่วนใต้น้ำ :-)
majick

3

คำตอบทำให้สับสน และอาจจะเป็น Im เช่นกัน แต่คำถามหัวข้อคือ:

รับกระสุนชนิดโพสต์ที่กำหนดเองสำหรับหน้าเก็บถาวร

หากคุณหมายถึงหน้า Landing Page ของประเภทโพสต์และเมื่อis_post_type_archive()กลับtrueมาคุณต้องการกระสุนที่ตอบสนองต่อการดูไฟล์เก็บถาวรปัจจุบัน :

/* returns /products/ */

$responding_name = str_replace(get_home_url(), '', get_post_type_archive_link(get_query_var('post_type')));

/* continue to get 'products' without slug slashes */
$responding_name = str_replace('/', '', $responding_name);

- สิ้นสุดการตอบคำถาม -

คำอธิบาย:

คุณไม่สามารถพึ่งพากระสุนที่ลงทะเบียนไว้ได้ Wordpress ไม่ได้เป็นอย่างใดอย่างหนึ่ง ตัวอย่างเช่นเมื่อเรียกget_post_type_archive_link()ชื่อถูกตรวจสอบเขียนกฎปัจจุบันของคุณติดตั้ง

เมื่อใดก็ตามที่คุณอยู่ภายในหรือนอกวงเก็บปัจจุบันหรือโพสต์เดียวกลับget_post_type_archive_link()กลไก (เปิดใช้งาน Permalinks)

การพิจารณา:

เป็นที่กล่าวถึงที่นี่, ประเภทโพสต์ (s) ในการค้นหาปัจจุบันarrayสามารถเป็น คุณสามารถเพิ่มความตั้งใจได้ด้วยการกรองประเภทโพสต์ที่คุณค้นหาตัวอย่าง:

$post_type = get_query_var('post_type'); 
if(is_array($post_type)) $post_type = reset($post_type);

หรือ

if(isset($post_types[0])) $post_type = $post_types[0];

มุมมองอื่น:

ตัวอย่าง Woocommerce ลงทะเบียนกับวัตถุประเภทโพสต์ 'ผลิตภัณฑ์' แต่ในความเป็นจริงใช้ชื่อกฎที่เขียนใหม่ (ร้านค้า):

/* returns shop */
$responding_name = str_replace('/', '', str_replace(get_home_url(), '', get_post_type_archive_link('product')));

ทำเครื่องหมายฉันใช้$responding_nameเนื่องจากวัตถุประสงค์อาจแตกต่างกันไป ไม่มีไฟล์เก็บถาวรโพสต์เป็นเพียง url


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

1

เสื้อควรจะตั้งข้อสังเกตว่าถ้าhas_archiveมีการตั้งค่าให้เป็นจริงในขณะที่การลงทะเบียนที่กำหนดเองประเภทโพสต์ชนิดที่เก็บโพสต์จะถูกเขียนใหม่ภายในเพื่อ/cptslug/ ?post_type=cptslugดังนั้นนี่ก็หมายความว่าis_post_type_archive()จะกลับมาเป็นจริง

น่าเสียดายที่กระสุนทับเขียนที่ลงทะเบียนแตกต่างจากชนิดโพสต์คุณจะไม่ได้รับจริงpost_typeๆ เช่น. หากประเภทโพสต์ของคุณเป็นmyplugin_carsและบุ้งเขียนใหม่ของคุณเป็นcarsและคุณจำเป็นต้องได้รับmyplugin_carsแม้นี้ (เพื่อป้องกันข้อผิดพลาดหากวัตถุที่สืบค้นในปัจจุบันไม่ได้เป็นประเภทโพสต์ที่กำหนดเอง) จะยังคงล้มเหลว:

$queryobject = get_queried_object();
if (has_property('rewrite',$queryobject)) {
    if (isset($queryobject->rewrite['slug'])) {
         $posttype = $queryobject->rewrite['slug'];
     }
 }

แต่เนื่องจากis_post_type_archiveเป็นความจริงจึงเชื่อถือได้มากขึ้น:

if (is_post_type_archive()) {
    $posttype = get_query_var('post_type');
    // which is basically the same as:
    // global $wp_query;
    // $posttype = $wp_query->query_vars['post_type'];
} 
else ($posttype = 'post';}

แต่ไม่เป็นไรมีอีกมาก ... กลายเป็นว่ามีการทดสอบนิดหน่อยว่าจริง ๆ แล้วมันไม่ง่ายเลยถ้าคุณอยู่ในหน้าจัดเก็บภาษีอนุกรมวิธานที่มีโพสต์หลายประเภทในอนุกรมวิธาน .. ? หรือกำหนดแท็กโพสต์ให้กับประเภทโพสต์ที่กำหนดเองอื่น ๆ หรืออยู่ในหน้าเก็บถาวรของผู้แต่ง? หน้าวันที่เก็บถาวร? ... หรือแม้กระทั่งมีความซับซ้อนtax_queryหรือmeta_queryเพื่อWP_Query?

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

function get_current_post_types($object=null) {

    // if a numeric value passed, assume it is a post ID
    if ( ($object) && (is_numeric($object)) ) {$object = get_post($object);}
    // if an object is passed, assume to be a post object
    if ( ($object) && (is_object($object)) ) {return get_post_type($object);}

    // standard single post type checks
    if (is_404()) {return '';}
    // update: removed this check, handled by is_singular
    // if (is_single()) {return 'post';}
    if (is_page()) {return 'page';}
    if (is_attachment()) {return 'attachment';}
    if (is_singular()) {return get_post_type();}

    // if a custom query object was not passed, use $wp_query global
    if ( (!$object) || (!is_object($object)) ) {
        global $wp_query; $object = $wp_query;
    }
    if (!is_object($object)) {return '';} // should not fail

    // if the post_type query var has been explicitly set
    // (or implicitly set on the cpt via a has_archive redirect)
    // ie. this is true for is_post_type_archive at least
    // $vqueriedposttype = get_query_var('post_type'); // $wp_query only
    if (property_exists($object,'query_vars')) {
        $posttype = $object->query_vars['post_type'];
        if ($posttype) {return $posttype;}
    }

    // handle all other cases by looping posts in query object
    $posttypes = array();
    if (method_exists($object,'found_posts')) {
        if ($object->found_posts > 0) {
            $queriedposts = $object->posts;
            foreach ($queriedposts as $queriedpost) {
                $posttype = $queriedpost->post_type;
                if (!in_array($posttype,$posttypes)) {$posttypes[] = $posttype;}
            }
            if (count($posttypes == 1)) {return $posttypes[0];}
            else {return $posttypes;}
         }
     }
     return ''; // nothin to see here
}

สิ่งนี้จะเชื่อถือได้ (ฉันพูดอย่างนั้นหรือไม่) คืนอาร์เรย์ประเภทโพสต์หากมีมากกว่าหนึ่งรายการหรือสตริงที่มีประเภทโพสต์เดียวหากมีเพียงประเภทเดียว สิ่งที่คุณต้องทำคือ:

$posttypes = get_current_post_types();
// or pass a post ID 
$posttypes = get_current_post_types($postid);
// or pass a post object
$posttypes = get_current_post_types($post);
// or pass a custom query - that has been run
$posttypes = get_current_post_types($query);

ตัวอย่างการใช้งาน (เพื่อความสนุก):

add_filter('the_posts','myplugin_fading_thumbnails',10,2);
function myplugin_fading_thumbnails($posts,$query) {
    if (!is_archive()) {return $posts;}
    $cptslug = 'myplugin_slug'; $dosomethingcool = false;
    $posttypes = get_current_post_types($query);
    if ( (is_array($posttypes)) && (in_array($cptslug,$posttypes)) ) {$dosomethingcool = true;}
    elseif ($cptslug == $posttypes) {$dosomethingcool = true;}

    if ($dosomethingcool) {
        global $fadingthumbnails; $fadingthumbnails = $cptslug;
        if (!has_action('wp_footer','myplugin_cpt_script')) {
            add_action('wp_footer','myplugin_cpt_script');
        }
    }

    function myplugin_cpt_script() {
        global $fadingthumbnails;
        echo "<script>var thumbnailclass = 'img.thumbtype-".$fadingthumbnails."';
        function fadeoutthumbnails() {jQuery(thumbnailclass).fadeOut(3000,fadeinthumbnails);}
        function fadeinthumbnails() {jQuery(thumbnailclass).fadeIn(3000,fadeoutthumbnails);}
        jQuery(document).ready(function() {fadeoutthumbnails();});
        </script>";
    }

    return $posts;
 }

หากต้องการดูเอฟเฟกต์ให้เปลี่ยนประเภทโพสต์ที่กำหนดเองในรหัสเป็นpostและเพิ่มแอthumbtype-postททริบิวต์คลาสเป็นรูปภาพขนาดย่อของโพสต์ ...


0

คุณสามารถใช้รหัสนี้:

$queried_object = get_queried_object();
$posttype_slug = $queried_object->query_var;
echo $posttype_slug;

ใช้ $ posttype_slug var สิ่งที่คุณต้องการ


จะต้องมี$queried_object->query_var['post_type'];สำหรับการทำงาน ...
majick

ไม่ $ $ queried_object-> query_var มีสตริงประเภทโพสต์เท่านั้น ไม่ใช่วัตถุหรืออาเรย์ ดูรูปนี้: prntscr.com/bd58e1
Guy Ytzhak

ตกลง แต่ถ้าวัตถุที่สอบถามเป็นวัตถุประเภทโพสต์ที่กำหนดเองแน่นอนคุณจะได้รับวัตถุที่เกี่ยวข้องที่แตกต่างกันและทำให้ค่าว่างสำหรับหน้าการเก็บถาวรหมวดหมู่ / แท็ก / แท็ก / ผู้เขียน แม้ว่า?post_type=postฉันจะว่างเปล่า เปรียบเทียบกับget_query_var('post_type');
majick


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