Nhận sên loại bài tùy chỉnh cho một trang lưu trữ


14

Làm cách nào để khám phá loại sên bài tùy chỉnh khi tôi ở trên trang lưu trữ?

Ví dụ, nếu /products/bắn archive-products.phpmẫu, làm thế nào (thực tế) làm thế nào để tôi có được loại sên bài?

Cảm ơn

Câu trả lời:


18

Để có được loại bài viết hiện tại sử dụng get_post_type(). Sau đó yêu cầu get_post_type_object()tất cả dữ liệu bạn cần, ví dụ như sên:

$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
Tôi nghĩ rằng (chưa được thử nghiệm) get_queried_object()sẽ có được thông tin tương tự trong ít di chuyển hơn.
Hết

@Rarst Có thể, nhưng tôi nghĩ mã tôi đề xuất dễ hiểu hơn.
fuxia

1
Các giải pháp của Toscho là sai, vì get_post_type trả về loại bài đăng của trang hiện tại và khi bạn vào trang lưu trữ, chức năng này sẽ trả về "trang". Tôi đang cố gắng giải quyết tương tự: Khi tôi vào trang lưu trữ của 'sách' (4 ví dụ), tôi muốn điều này: 'sách'. Khi tôi nhận được nó tôi sẽ đăng nó.
eMarine

1
tiếc là nó không đơn giản, mặc dù bạn sẽ tốt hơn chỉ với $posttype = get_query_var('post_type');... Tôi đã thêm một giải pháp thay thế toàn diện.
Majick

Tôi không nghĩ Đây là câu trả lời bao gồm toàn bộ câu chuyện. Bạn nên kiểm tra quy tắc viết lại cài đặt vì nhiều bộ lọc (như trang cửa hàng thương mại điện tử) đang thực hiện thay đổi. Thay vào đó , hãy sử dụng mecanism của Worpdress , xem câu trả lời của tôi ở đâu đó bên dưới.
Jonas Lundman

6

Tôi đang sử dụng điều này bên ngoài vòng lặp trên mẫu archive.php để có được kho lưu trữ bài đăng tùy chỉnh mà tôi đang sử dụng.

Đây là sự kết hợp của các phương thức mà cả @toscho và @Rarst khuyên dùng:

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

Cập nhật: @majick chỉ ra rằng điều này chỉ hoạt động nếu bạn đã đặt sên viết lại cho CPT của mình. Viết lại sên là tùy chọn khi đăng ký CPT và mặc định là post_type nếu không được đặt.


Khi tôi thử cái này tôi đã nhận đượcNotice: Undefined property: stdClass::$rewrite in ***\wp-content\themes\marks-remarks\archive.php on line 4
patrickzdb

điều này sẽ chỉ hoạt động nếu sên viết lại được đặt cho CPT đã đăng ký, vì nó là tùy chọn và mặc định cho post_type
majick

Cảm ơn vì đã bắt được @majick! Tôi đã cập nhật bài viết để phản ánh thông tin của bạn.
Jerry

Hóa ra đó là phần nổi của tảng băng trôi ... hãy kiểm tra câu trả lời mới của tôi cho phần dưới nước :-)
Majick

3

Các câu trả lời nhận được khó hiểu. Và có lẽ tôi cũng vậy nhưng câu hỏi tiêu đề là:

Nhận sên loại bài tùy chỉnh cho một trang lưu trữ

Nếu bạn có nghĩa là trang đích lưu trữ loại bài đăng và khi is_post_type_archive()trở về true, bạn muốn con sên đó tương ứng với kho lưu trữ xem hiện tại :

/* 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);

- KẾT THÚC TRẢ LỜI CÂU HỎI -

Giải trình:

Bạn không thể dựa vào sên đã đăng ký . Wordpress cũng không. Ví dụ: khi gọi get_post_type_archive_link()Wordpress đang kiểm tra các quy tắc viết lại hiện tại cho cài đặt của bạn .

Bất cứ nơi nào bạn đang có, bên trong hay bên ngoài vòng lặp, lưu trữ hiện hành hoặc bưu điện duy nhất, ngược lại các get_post_type_archive_link()cơ chế. (Đã bật Permalinks.)

Cân nhắc:

Như đã đề cập ở đây, loại bài đăng trong truy vấn hiện tại có thể là một array. Bạn có thể đi xa hơn với cường độ của mình với bộ lọc loại bài đăng bạn tìm, ví dụ:

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

hoặc là

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

Một góc nhìn khác:

Ví dụ về thương mại điện tử, được đăng ký với đối tượng loại bài đăng 'sản phẩm' nhưng trong thực tế sử dụng tên quy tắc viết lại (cửa hàng):

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

Đánh dấu, tôi đang sử dụng $responding_name, bởi vì các mục tiêu có thể khác nhau. Một kho lưu trữ bài viết không tồn tại, nó chỉ là một url.


Điều này làm cho nó rất rõ ràng cảm ơn bạn. Đã tìm kiếm giải pháp này. Nếu câu hỏi không tìm kiếm "chỉ tên loại bài đăng", thì đây sẽ là một câu trả lời bỏ qua.
Jonas Lundman

1

Cần lưu ý rằng nếu has_archiveđược đặt thành đúng trong khi đăng ký Loại bài đăng tùy chỉnh, kho lưu trữ loại bài đăng /cptslug/sẽ được viết lại nội bộ ?post_type=cptslug. Vì vậy, điều này cũng có nghĩa là is_post_type_archive()sẽ trở lại đúng.

Thật không may, nơi sên viết lại đã đăng ký khác với loại bài đăng, bạn không thực sự nhận được post_type. ví dụ. nếu loại bài đăng của bạn là myplugin_carsvà sên viết lại của bạn carsvà bạn cần phải nhận myplugin_carsngay cả điều này (để tránh lỗi nếu đối tượng truy vấn hiện tại không phải là loại bài đăng tùy chỉnh) vẫn sẽ thất bại:

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

Nhưng bởi vì is_post_type_archivesự thật là điều này đáng tin cậy hơn:

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

Nhưng chờ đợi, có nhiều ... hóa ra với một thử nghiệm nhỏ, nó thực sự không đơn giản ... nếu bạn đang ở trên một trang lưu trữ phân loại với nhiều loại bài đăng trong phân loại ..? Hoặc gán thẻ bài cho một loại bài tùy chỉnh khác với bài? Hoặc là trên một trang lưu trữ tác giả? Trang lưu trữ ngày? ... hoặc thậm chí có một phức tạp tax_queryhay meta_querycho WP_Query?

Câu trả lời đáng tin cậy duy nhất (không có kiểm tra cho mọi trường hợp lưu trữ có thể) là lặp các bài đăng thực tế trong truy vấn ... Đây là chức năng đầy đủ mà tôi đã đưa ra để làm việc trên cả trang lưu trữ và số ít và cho phép bạn tùy ý vượt qua đối tượng truy vấn tùy chỉnh (hoặc đăng đối tượng / ID bài đăng cho các bài đăng đơn lẻ):

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
}

Điều này sẽ đáng tin cậy (tôi đã nói vậy sao?) Trả về một mảng các loại bài đăng nếu có nhiều hơn một chuỗi hoặc một chuỗi với loại bài đăng duy nhất nếu chỉ có một loại. Tất cả bạn cần làm là:

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

Cách sử dụng ví dụ (chỉ để giải trí):

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

Để xem hiệu ứng, thay đổi loại bài đăng tùy chỉnh trong mã thành postvà thêm thumbtype-postthuộc tính lớp vào hình ảnh thu nhỏ bài đăng của bạn ...


0

Bạn có thể sử dụng mã này:

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

sử dụng $ posttype_slug var bất cứ điều gì bạn cần


nó cần để $queried_object->query_var['post_type'];làm việc này ...
Majick

Số $ queried_object-> query_var chỉ chứa chuỗi loại bài đăng. nó không phải là đối tượng hay mảng. nhìn vào hình ảnh này: prntscr.com/bd58e1
Guy Ytzhak

ok nhưng chỉ khi đối tượng được truy vấn chắc chắn là một đối tượng loại bài đăng tùy chỉnh, bạn sẽ nhận được một đối tượng tương ứng khác và do đó, giá trị trống cho các trang lưu trữ danh mục / thuế / thẻ / tác giả chẳng hạn. ngay cả đối với ?post_type=posttôi nhận được trống rỗng. so sánh vớiget_query_var('post_type');
Majick

0

Bạn có thể sử dụng mã này và mã này đang làm việc cho tôi,

 $ t_slug = get_query_var ('hạn');

-3
if( get_post_type( get_the_ID() ) == 'projects' )
{
  //enter code for this post type
}
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.