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.php
mẫ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
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.php
mẫ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:
Để 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;
}
$posttype = get_query_var('post_type');
... Tôi đã thêm một giải pháp thay thế toàn diện.
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.
Notice: Undefined property: stdClass::$rewrite in ***\wp-content\themes\marks-remarks\archive.php on line 4
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.
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_cars
và sên viết lại của bạn cars
và bạn cần phải nhận myplugin_cars
ngay 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_archive
sự 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_query
hay meta_query
cho 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 post
và thêm thumbtype-post
thuộc tính lớp vào hình ảnh thu nhỏ bài đăng của bạn ...
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
$queried_object->query_var['post_type'];
làm việc này ...
?post_type=post
tôi nhận được trống rỗng. so sánh vớiget_query_var('post_type');
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');
get_queried_object()
sẽ có được thông tin tương tự trong ít di chuyển hơn.