Truy vấn WordPress một bài đăng theo slug


85

Hiện tại khi tôi muốn hiển thị một bài đăng đơn lẻ mà không sử dụng vòng lặp, tôi sử dụng điều này:

<?php
$post_id = 54;
$queried_post = get_post($post_id);
echo $queried_post->post_title; ?>

Vấn đề là khi tôi di chuyển trang web, id thường thay đổi. Có cách nào để truy vấn bài đăng này bằng slug không?


3
Tại sao các ID sẽ thay đổi khi di chuyển trang web? Trừ khi bạn đang di chuyển trang web bằng cách sử dụng tính năng nhập / xuất của WP (tính năng này không đáng tin cậy lắm và tôi khuyên bạn nên tránh). Nếu bạn chỉ đơn giản là di chuyển cơ sở dữ liệu sẽ không có gì thay đổi.
Ennui

Câu trả lời:


119

Từ Codex WordPress:

<?php
$the_slug = 'my_slug';
$args = array(
  'name'        => $the_slug,
  'post_type'   => 'post',
  'post_status' => 'publish',
  'numberposts' => 1
);
$my_posts = get_posts($args);
if( $my_posts ) :
  echo 'ID on the first post found ' . $my_posts[0]->ID;
endif;
?>

WordPress Codex Nhận bài viết


1
Điều này hiển thị ID - $ my_posts [0] -> ID; - nhưng làm cách nào để hiển thị nội dung các trang? Tôi đã thử mọi thứ và không có gì hoạt động!
James Wilson

1
@JamesWilson bắt đầu sử dụng kint. echo $my_posts[0]->post_content
Toskan

Điều này dường như trở nhiều, và do đó mơ hồ, kết quả nếu một số sên là khá tương tự (ví dụ như 'làm việc' vs 'làm việc')
Simon H

2
Không chắc tại sao nhưng tôi phải đổi 'name' thành 'post_name' để truy vấn này hoạt động với tôi
Mike

Điều này hoạt động để có được hình ảnh nổi bật $ feat_image = wp_get_attachment_url (get_post_thumbnail_id ($ my_posts [0] -> ID));
Omar

68

Làm thế nào về?

<?php
   $queried_post = get_page_by_path('my_slug',OBJECT,'post');
?>

9
Chú ý đến trang trẻ em hoặc bưu điện tùy theo cấp bậc loại: my-slugnên trở thành my-parent-slug/my-slug: codex.wordpress.org/Function_Reference/...
Erenor Paz

2
trải nghiệm của tôi kể từ khi đọc bài đăng này hỗ trợ @Erenor Paz - nó thực sự có thể đẹp và đơn giản nhưng nó trở nên phức tạp khi bạn phụ thuộc vào tính nhất quán của slug - có thể thay đổi đơn giản bằng cách thay đổi bài đăng chính ... thở dài - có lẽ chúng ta có thể thuyết phục các nhà phát triển WordPress cho phép ký tự đại diện trong đường dẫn, ví dụ: get_page_by_path ('* / my_slug');
aequalsb

Không đáng tin cậy lắm
Amin

7

một phương pháp ít tốn kém hơn và có thể tái sử dụng

function get_post_id_by_name( $post_name, $post_type = 'post' )
{
    $post_ids = get_posts(array
    (
        'post_name'   => $post_name,
        'post_type'   => $post_type,
        'numberposts' => 1,
        'fields' => 'ids'
    ));

    return array_shift( $post_ids );
}

6

Vì api wordpress đã thay đổi, bạn không thể sử dụng get_posts với param 'post_name'. Tôi đã sửa đổi hàm Maartens một chút:

function get_post_id_by_slug( $slug, $post_type = "post" ) {
    $query = new WP_Query(
        array(
            'name'   => $slug,
            'post_type'   => $post_type,
            'numberposts' => 1,
            'fields'      => 'ids',
        ) );
    $posts = $query->get_posts();
    return array_shift( $posts );
}

Để có thêm hiệu suất, tôi cũng sẽ thêm 'no_found_rows' => truevào các đối số get_posts.
Philipp
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.