get_queried_object () trả về null khi lưu trữ ngày đăng


7

get_queried_object()trả nullvề lưu trữ ngày đăng (loại trang is_date()) và trang chỉ mục blog chính (loại trang is_home()). Đây là cố ý, hay chỉ là một giám sát?

Tôi đã viết một trình bao bọc xung quanh get_queried_object () để lấy tiêu đề của trang hiện tại, bất kể đó là loại trang nào, để sử dụng trong một chủ đề. Tôi nhanh chóng nhận ra rằng thay vì sử dụng, get_query_object()tôi chỉ nên sao chép các bit quan trọng từ đó wp_title(), nhưng trước đó tôi đã gặp một vấn đề thú vị.

Dường như get_queried_object()và hàm gốc của nó WP_Query->get_queried_object()trả về nullmột vài loại danh sách, bao gồm đầu ra danh sách bài đăng chính theo index.php (loại trang is_home()) và lưu trữ bài đăng theo ngày (loại trang is_date()).

Tôi đã kiểm tra điều này bằng cách ném đoạn mã sau vào một số tệp mẫu ở một số vị trí, luôn luôn sau get_header()và trước the_post():

<pre><code><?php
    $queried_object = get_queried_object();
    var_dump( $queried_object );
?></code></pre>

Điều này hoạt động hoàn hảo trên kho lưu trữ danh mục, lưu trữ thẻ, lưu trữ phân loại tùy chỉnh và lưu trữ loại bài tùy chỉnh. get_queried_object()trả về đối tượng truy vấn, có thể được sử dụng để trích xuất tiêu đề trang và thông tin hữu ích khác.

Tuy nhiên, nó không thành công trong archive.php đối với lưu trữ ngày đăng bài chuẩn và index.php cho chế độ xem danh sách trang chủ của bài đăng bình thường.

Đi sâu vào nguồnWP_Query->get_queried_object() tiết lộ một cái gì đó không đáng ngạc nhiên: không có kiểm tra loại is_home()trang hoặc loại trang is_date(), vì vậy trên các loại trang đó $this->queried_object = null;không được cập nhật và chức năng trả về null.

Vì vậy, câu hỏi của tôi là, chức năng dự định này (ví dụ: bạn không nên sử dụng get_queried_object () trên các trang đó), giới hạn kỹ thuật (không có đối tượng có ý nghĩa để quay lại trên các trang đó) hay chỉ đơn giản là giám sát thực hiện?

Thậm chí có tương đương với đối tượng loại bài đăng tùy chỉnh cho loại bài đăng "bài đăng blog" tích hợp để hiển thị không?


2
Điểm tuyệt vời +. WordPress có thể làm một cái gì đó để tạo một đối tượng cho kho lưu trữ ngày đó và trang đầu italic_ (lưu ý: nó sẽ trả về một đối tượng nếu trang blog được đặt thành trang wordpress, không phải trang đầu) _italic . Nhưng cuối cùng, không có ý nghĩa sử dụng get_queried_object.
Shazzad

1
Tôi không biết làm thế nào để trả lời câu hỏi này, thực sự, nhưng có, get_queried_objectrất không nhất quán và trả lại một số đối tượng khác nhau cũng như đôi khi trở lại null. Mặc dù nó rất hữu ích, nhưng nó có thể gây khó chịu khi sử dụng.
s_ha_dum

Câu trả lời:


4

Vì vậy, câu hỏi của tôi là, chức năng dự định này (ví dụ: bạn không nên sử dụng get_queried_object () trên các trang đó), giới hạn kỹ thuật (không có đối tượng có ý nghĩa để quay lại trên các trang đó) hay chỉ đơn giản là giám sát thực hiện?

get_queried_object () là để có được thuật ngữ, tác giả, bài đăng đơn, loại bài đăng tùy chỉnh duy nhất hoặc đối tượng trang được truy vấn. Vâng, đây là cố ý và chức năng này được thiết kế để làm gì.

Nếu bạn đang lưu trữ ngày, trang chủ hoặc tìm kiếm, không có đối tượng nào được truy vấn.

Biên tập:

Dựa trên nhận xét đầu tiên bên dưới, OP cần lấy đối tượng post_type. Đối tượng post_type khác với queried_object. Nếu bạn cần lấy đối tượng post_type trên trang lưu trữ, bạn có thể lấy nó từ truy vấn.

global $wp_query;

$post_type_object = get_post_type_object( $wp_query->query_vars['post_type'] );

2
Điều này gây khó chịu; nếu có một cái gì đó có ý nghĩa để trả về cho các trang lưu trữ loại bài đăng tùy chỉnh (đối tượng loại bài đăng tùy chỉnh), tại sao không nên trả lại một cái gì đó tương tự cho các trang lưu trữ loại bài đăng tiêu chuẩn? Tôi cho rằng điều này có thể được giải thích bởi lịch sử của WP như là một công cụ viết blog tập trung hơn, nhưng có lý do chính đáng nào để các loại bài đăng tích hợp nên xử lý loại đặc biệt này và không nên được cung cấp chức năng để xử lý giống như các loại tùy chỉnh ? Tôi nghĩ sẽ hữu ích hơn nếu các loại tùy chỉnh có thể dễ dàng trộn lẫn hơn với các loại dựng sẵn.
Dakota

Có nhiều cách khác để có được những gì bạn muốn. get_queried_object chỉ được áp dụng nếu yêu cầu là một danh mục, tác giả, permalink hoặc Trang. Giữ thông tin về danh mục, tác giả, bài đăng hoặc Trang được yêu cầu. Các truy vấn giữ mọi thứ khác.
Chris_O

Sau đó, sự nhầm lẫn của tôi là chức năng của get_queried_object()các trang lưu trữ loại bài đăng tùy chỉnh nhưng không phải trên các trang lưu trữ bài đăng tiêu chuẩn. Nếu get_queried_object()trả về đối tượng loại bài đăng trên các trang lưu trữ và chỉ mục loại bài đăng tùy chỉnh, thì tôi sẽ nghĩ nó chỉ hợp lý khi trả về đối tượng loại bài đăng trên trang lưu trữ và chỉ mục bài đăng tiêu chuẩn. Tôi sẽ chấp nhận tình huống nếu nó đơn giản như thế vì lý do lịch sử và việc xử lý đặc biệt các loại bài đăng tích hợp là để tương thích ngược, nhưng tôi muốn giải thích.
Dakota

Tôi nghĩ rằng có những thông tin đầy ý nghĩa sẽ rất tuyệt vời: năm nào / tháng / ngày được truy vấn, số bài đăng / max_num_pages
Thomas Fellinger

cũng lưu ý rằng trên các trang lưu trữ của tác giả get_queried_object()trả về một WP_UserĐối tượng trong khi lưu trữ dựa trên thuật ngữ, nó trả về một WP_TermĐối tượng - vì vậy trước tiên người ta cần vệ sinh các trả về get_queried_object()để sử dụng trong một mẫu lưu trữ chung - và một WP_DateĐối tượng bị thiếu. vì trong các chủ đề mặc định achive.php, tiêu đề ngày sử dụng get_the_date()và sử dụng get_post()nó chỉ đại diện cho ngày của bài đăng đầu tiên được hiển thị và nó chỉ hoạt động một cách hợp lý nhưng nó không thể hiện chính xác truy vấn và dựa trên mọi thứ khác hoạt động như mong đợi.
Thomas Fellinger
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.