WordPress lấy nội dung trang bằng slug

Điều này thú vị, với nhiều năm kinh nghiệm làm việc với WordPress, tôi chưa bao giờ xử lý loại vấn đề này. Tôi đã tìm kiếm trong codex và nhận thấy get_page_by_path là giải pháp lý tưởng thay vì trực tiếp tạo truy vấn tới cơ sở dữ liệu

Để 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


    Events


    Events

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ố 8

Nế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 ứng

Mặc định.

get_page_by_path('parent-page/sub-page');
5

get_page_by_path('parent-page/sub-page');
6 chuỗi . mảng Không bắt buộc

Loại bài đăng hoặc mảng các loại bài đăng. Mặc định

get_page_by_path('parent-page/sub-page');
7

Mặc định.

get_page_by_path('parent-page/sub-page');
7


WP_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-world
4


UsesUsesDescriptionwp_cache_get_last_changed() wp-gồm/hàm. php

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. php

Lưu dữ liệu vào bộ đệm

esc_sql() wp-gồm/định dạng. php

Thoát dữ liệu để sử dụng trong truy vấn MySQL

wp_cache_get() wp-gộp/cache. php

Truy xuất nội dung bộ đệm từ bộ đệm theo khóa và nhóm

get_post() wp-gồm/bài đăng. php

Truy 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. php

Truy xuất toàn bộ tập kết quả SQL từ cơ sở dữ liệu (i. e. , nhiều hàng)


Được sử dụng bởiĐược sử dụng bởiByDescriptionget_post_embed_url() wp-includes/embed. php

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. php

Giả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. php

Có thể kích hoạt permalinks đẹp khi cài đặt

WP. parse_request() wp-includes/class-wp. php

Phân tích yêu cầu để tìm đúng truy vấn WordPress

WP_Query. is_page() wp-includes/class-wp-query. php

Là truy vấn cho một trang hiện có?

WP_Query. is_single() wp-includes/class-wp-query. php

Là truy vấn cho một bài viết hiện có?

WP_Query. get_posts() wp-includes/class-wp-query. php

Truy 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. php

Phâ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. php

Kiểm tra một URL và cố gắng xác định ID bài đăng mà nó đại diện


Nhật ký thay đổiPhiên bảnMô tả2. 1. 0Giới thiệu

  1. 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
    5

    Cá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à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
    		            )
    		        )
    		    ) );
    
    		} );
    3

    • `wp_basename()` là phiên bản thân thiện với i18n của `basename()`. — Bởi niềm vui —

    Đăng nhập để thêm phản hồi
  2. 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
    		            )
    		        )
    		    ) );
    
    		} );
    4

    Nế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
    		            )
    		        )
    		    ) );
    
    		} );
    5

    Sự 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.
    Tệp đính kèm có ID bài đăng thấp hơn sẽ được trả về trước.

    Đăng nhập để thêm phản hồi
  3. 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
    58

    Nếu bạn chỉ muốn

    /posts?filter[slug]=hello-world
    57, hãy chuyển nó qua tham số thứ ba

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