Để lấy nội dung trang từ API WP dựa trên sên, chúng tôi có thể sử dụng yêu cầu này
/pages?filter[slug]=sample-page
điều tương tự sẽ xảy ra với bài viết
/posts?filter[slug]=hello-world
nhưng làm cách nào để lấy nội dung chỉ dựa trên slug và không xác định loại nội dung [trang, bài đăng. ] giống như wordpress 'gốc' đang làm?
Chà, để làm được điều đó, chúng ta có thể sử dụng hàm WP get_page_by_path[] được lõi WP sử dụng để phân phát nội dung được yêu cầu khi sử dụng liên kết cố định SEO.
Cách tốt nhất để sử dụng nó là đăng ký tuyến API mới sẽ chấp nhận slug và gửi lại nội dung kèm theo nhận xét.
Vì vậy, trước tiên hãy đăng ký một tuyến đường, bên trong các chức năng. tệp php thêm mã này.
add_action[ 'rest_api_init', function [] { register_rest_route[ 'my-theme/', 'get-by-slug', array[ 'methods' => 'GET', 'callback' => 'my_theme_get_content_by_slug', 'args' => array[ 'slug' => array [ 'required' => false ] ] ] ]; } ];
và tiếp theo, hãy tạo chức năng gọi lại cho URL thuần
function my_theme_get_content_by_slug[ WP_REST_Request $request ] { // get slug from request $slug = $request['slug']; // get content by slug $return['content'] = get_page_by_path[ $slug, ARRAY_A ]; // add comments to our content $return['content']['comments'] = get_comments[ array[ 'ID' => $return['content']['ID'] ] ]; $response = new WP_REST_Response[ $return ]; return $response; }
CẬP NHẬT 24-10-2017.
Có lẽ cách tốt hơn nữa là sử dụng WP_Query.
$query = new WP_Query[ array[ 'post_type' => 'any','name'=>'slug' ] ];
Thông tin thêm có thể được tìm thấy ở đây
Tôi đã từng viết các hàm tùy chỉnh để trả về các liên kết cố định này từ tên trang hoặc sên cho đến khi tôi phát hiện ra rằng bạn có thể chuyển
function my_theme_get_content_by_slug[ WP_REST_Request $request ] { // get slug from request $slug = $request['slug']; // get content by slug $return['content'] = get_page_by_path[ $slug, ARRAY_A ]; // add comments to our content $return['content']['comments'] = get_comments[ array[ 'ID' => $return['content']['ID'] ] ]; $response = new WP_REST_Response[ $return ]; return $response; }3 một hàm sẽ trả về ID
Dưới đây là một số ví dụ về việc nhận permalinks theo tên trang hoặc sên trong WordPress
Nhận WordPress Permalink theo tên trang
Events
Nhận WordPress Permalink bằng Slug trang
Events
Nhận WordPress Permalink Cha/Con
Nếu bạn có một hệ thống phân cấp trang, bạn sẽ phải chuyển toàn bộ sên bao gồm cả trang gốc cho hàm
function my_theme_get_content_by_slug[ WP_REST_Request $request ] { // get slug from request $slug = $request['slug']; // get content by slug $return['content'] = get_page_by_path[ $slug, ARRAY_A ]; // add comments to our content $return['content']['comments'] = get_comments[ array[ 'ID' => $return['content']['ID'] ] ]; $response = new WP_REST_Response[ $return ]; return $response; }4
Ví dụ. Để có được permalink sử dụng phương thức với trang con, bạn cần chuyển toàn bộ slug. Trong trường hợp này, chúng tôi có một trang con có tên là "Các bên" với trang mẹ có tên là "Sự kiện"
Có một số cách để lấy slug của trang hiện tại hoặc bài đăng trong WordPress. Đơn giản nhất, slug của bài đăng hoặc trang có thể được truy xuất bằng cách truy cập thuộc tính post_name của đối tượng bài đăng toàn cầu. Phương thức đầu tiên hiển thị bên dưới truy cập thuộc tính post_name đó trong biến $post trong khi tùy chọn thứ hai bên dưới sử dụng phương thức get_post_field
Cả hai phương pháp bên dưới đều sử dụng biến $post toàn cầu, nhưng nếu bạn chỉ có quyền truy cập vào id bài đăng của trang hiện tại, thì tùy chọn thứ hai cung cấp một phương pháp thay thế sử dụng post_id để lấy sên
lựa chọn 1. Truy cập thuộc tính post_name của Biến bài đăng toàn cầu
Truy cập thuộc tính post_name của đối tượng bài đăng toàn cầu
global $post;
$page_slug = $post->post_name;
Đối với thông tin của bạn, trong WordPress, các trang là một loại bài đăng, đó là lý do tại sao biến $post cung cấp cho bạn thông tin về trang. Ngoài ra, đối tượng bài đăng toàn cầu chứa dữ liệu được liên kết với trang hoặc bài đăng hiện tại đang được truy cập. Biến toàn cầu này có sẵn bên trong vòng lặp của WordPress. Vòng lặp WordPress là “mã PHP được WordPress sử dụng để hiển thị các bài đăng” trên mỗi https. // codex. báo chí. org/The_Loop.
Lựa chọn 2. Sử dụng phương thức get_post_field
Bạn cũng có thể sử dụng chức năng get_post_field để lấy trang hiện tại hoặc đăng slug. NẾU bạn đang ở trong vòng lặp, đoạn mã này giống như sau
________số 8Nếu bạn ở bên ngoài vòng lặp đăng bài, bạn sẽ cần đối số thứ hai cho hàm get_post_field. Đối với đối số thứ hai đó, bạn có thể sử dụng giá trị $post_id. Xem mã dưới đây làm ví dụ
Loại trả về bắt buộc. Một trong các ĐỐI TƯỢNG, ARRAY_A hoặc ARRAY_N, tương ứng với đối tượng WP_Post, mảng kết hợp hoặc mảng số tương ứngMặc định.
get_page_by_path['parent-page/sub-page'];
5get_page_by_path['parent-page/sub-page'];
6 chuỗi . mảng Không bắt buộcLoại bài đăng hoặc mảng các loại bài đăng. Mặc định
7get_page_by_path['parent-page/sub-page'];
Mặc định.
get_page_by_path['parent-page/sub-page'];
7WP_Post. mảng. null WP_Post [hoặc mảng] nếu thành công hoặc null nếu thất bại.
Tập tin.
get_page_by_path['parent-page/sub-page'];
9. Xem tất cả tài liệu tham khảo/posts?filter[slug]=hello-world4
Nhận ngày thay đổi cuối cùng cho nhóm bộ đệm được chỉ định
wp_cache_set[] wp-gồm/cache. phpLưu dữ liệu vào bộ đệm
esc_sql[] wp-gồm/định dạng. phpThoát dữ liệu để sử dụng trong truy vấn MySQL
wp_cache_get[] wp-gộp/cache. phpTruy xuất nội dung bộ đệm từ bộ đệm theo khóa và nhóm
get_post[] wp-gồm/bài đăng. phpTruy xuất dữ liệu bài đăng được cung cấp ID bài đăng hoặc đối tượng bài đăng
wpdb. get_results[] wp-includes/class-wpdb. phpTruy xuất toàn bộ tập kết quả SQL từ cơ sở dữ liệu [i. e. , nhiều hàng]
Truy xuất URL để nhúng một bài đăng cụ thể vào iframe
wp_resolve_numeric_slug_conflicts[] wp-gồm/viết lại. phpGiải quyết các sên số va chạm với permalinks ngày
wp_install_maybe_enable_pretty_permalinks[] wp-admin/gồm/nâng cấp. phpCó thể kích hoạt permalinks đẹp khi cài đặt
Phân tích yêu cầu để tìm đúng truy vấn WordPress
WP_Query. is_page[] wp-includes/class-wp-query. phpLà truy vấn cho một trang hiện có?
WP_Query. is_single[] wp-includes/class-wp-query. phpLà truy vấn cho một bài viết hiện có?
WP_Query. get_posts[] wp-includes/class-wp-query. phpTruy xuất một mảng các bài đăng dựa trên các biến truy vấn
WP_Query. parse_query[] wp-includes/class-wp-query. phpPhân tích cú pháp chuỗi truy vấn và đặt kiểu truy vấn boolean
url_to_postid[] wp-gộp/viết lại. phpKiểm tra một URL và cố gắng xác định ID bài đăng mà nó đại diện
Bạn phải đăng nhập để bình chọn về mức độ hữu ích của ghi chú nàyKết quả bình chọn cho ghi chú này. 4Bạn phải đăng nhập để bình chọn về mức độ hữu ích của ghi chú này
Đóng góp bởi Codex —
Đường dẫn trang
Điều này tương đương với truy vấn/posts?filter[slug]=hello-world
50, như trong./posts?filter[slug]=hello-world
51.Mã cho phần trên có thể được viết là [giả sử
/posts?filter[slug]=hello-world
52 thực sự là đường dẫn đến một trang]get_page_by_path['parent-page/sub-page'];
Đối với các loại bài đăng tùy chỉnh không phân cấp, bạn chỉ cần sử dụng sên song song với tham số
/posts?filter[slug]=hello-world
53/posts?filter[slug]=hello-world
5Các hàm
/posts?filter[slug]=hello-world
54 và/posts?filter[slug]=hello-world
55 rất tiện lợi để lấy phần cuối của URL cho việc nàyadd_action[ 'rest_api_init', function [] { register_rest_route[ 'my-theme/', 'get-by-slug', array[ 'methods' => 'GET', 'callback' => 'my_theme_get_content_by_slug', 'args' => array[ 'slug' => array [ 'required' => false ] ] ] ]; } ];
3 Đăng nhập để thêm phản hồi`wp_basename[]` là phiên bản thân thiện với i18n của `basename[]`. — Bởi niềm vui —
Bạn phải đăng nhập để bình chọn về mức độ hữu ích của ghi chú nàyKết quả bình chọn cho ghi chú này. 1Bạn phải đăng nhập để bình chọn về mức độ hữu ích của ghi chú này
Đóng góp bởi Michael Bragg —
Theo , đúng là chức năng kiểm tra loại bài đăng được cung cấp [Trang theo mặc định] và Tệp đính kèm theo mặc định
Hàm này sẽ thêm loại bài đăng Tệp đính kèm vào bất kỳ trường hợp nào loại bài đăng được chuyển dưới dạng chuỗi. Do đoạn mã sau
add_action[ 'rest_api_init', function [] { register_rest_route[ 'my-theme/', 'get-by-slug', array[ 'methods' => 'GET', 'callback' => 'my_theme_get_content_by_slug', 'args' => array[ 'slug' => array [ 'required' => false ] ] ] ]; } ];
4Nếu bạn thực sự chỉ muốn trả lại đường dẫn mục từ loại bài đăng được cung cấp.
Nó cần được truyền dưới dạng một mảng như thế này.add_action[ 'rest_api_init', function [] { register_rest_route[ 'my-theme/', 'get-by-slug', array[ 'methods' => 'GET', 'callback' => 'my_theme_get_content_by_slug', 'args' => array[ 'slug' => array [ 'required' => false ] ] ] ]; } ];
5Sự cố này được phát hiện khi tệp đính kèm được lưu trữ trong cơ sở dữ liệu có cùng đường dẫn với trang mà chúng tôi muốn truy xuất.
Đăng nhập để thêm phản hồi
Tệp đính kèm có ID bài đăng thấp hơn sẽ được trả về trước.Bạn phải đăng nhập để bình chọn về mức độ hữu ích của ghi chú nàyKết quả bình chọn cho ghi chú này. -3Bạn phải đăng nhập để bình chọn về mức độ hữu ích của ghi chú này
Đóng góp bởi scottb79 —
Nếu bạn không chỉ định một
/posts?filter[slug]=hello-world
56 thì nó sẽ tìm kiếm cả/posts?filter[slug]=hello-world
57 và/posts?filter[slug]=hello-world
58Nếu bạn chỉ muốn
/posts?filter[slug]=hello-world
57, hãy chuyển nó qua tham số thứ bafunction my_theme_get_content_by_slug[ WP_REST_Request $request ] { // get slug from request $slug = $request['slug']; // get content by slug $return['content'] = get_page_by_path[ $slug, ARRAY_A ]; // add comments to our content $return['content']['comments'] = get_comments[ array[ 'ID' => $return['content']['ID'] ] ]; $response = new WP_REST_Response[ $return ]; return $response; }
0Để đạt được điều này, tham số thứ ba sẽ cần được truyền dưới dạng một mảng.
add_action[ 'rest_api_init', function [] { register_rest_route[ 'my-theme/', 'get-by-slug', array[ 'methods' => 'GET', 'callback' => 'my_theme_get_content_by_slug', 'args' => array[ 'slug' => array [ 'required' => false ] ] ] ]; } ];
30 — Bởi markcallen —Các tham số và giá trị mặc định của chức năng sẽ đề xuất khác nhưng bạn đúng. theo mặc định, nó cũng sẽ tìm kiếm trong các tệp đính kèm. Mặc dù mã vẫn sẽ thêm loại bài đăng 'tệp đính kèm' nếu bạn chuyển một chuỗi cho tham số $post_type. Cách duy nhất để tránh nó là chuyển một mảng chỉ chứa 'trang'.
add_action[ 'rest_api_init', function [] { register_rest_route[ 'my-theme/', 'get-by-slug', array[ 'methods' => 'GET', 'callback' => 'my_theme_get_content_by_slug', 'args' => array[ 'slug' => array [ 'required' => false ] ] ] ]; } ];
31 Đây cũng là một truy vấn khá chậm, đặc biệt nếu bạn có nhiều hình ảnh trong trang web, do đó, thực sự nên thực hiện chỉ bắt buộc 'trang' post_type. — Bằng piccart —