2013-02-20 33 views
47

Đối với thời điểm khi tôi muốn thể hiện một bài duy nhất mà không sử dụng một vòng lặp Tôi sử dụng này:truy vấn Wordpress bài duy nhất bằng cách sên

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

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

+1

Tại sao các ID 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 (không đáng tin cậy lắm và tôi khuyên bạn nên tránh). Nếu bạn đơn giản di chuyển cơ sở dữ liệu thì sẽ không có gì thay đổi. – Ennui

Trả lời

75

Từ WordPress Codex:

<?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 Get Posts

+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 trang? Tôi đã thử tất cả mọi thứ và không có gì hoạt động! –

+1

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

+0

Điều này dường như trả về nhiều, và do đó mơ hồ, kết quả nếu một số sên khá giống nhau (ví dụ: 'work' vs 'working') –

42

Làm thế nào về?

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

Đây là cách tốt nhất để thực hiện nó. –

+0

làm thế nào điều này đã không được tôi chú ý trong nhiều năm? tôi đồng ý, cách tốt nhất để lấy một đối tượng bài duy nhất. – aequalsb

+3

Chú ý đến các trang dành cho trẻ em hoặc các loại bài đăng theo cấp bậc: 'my-slug' sẽ trở thành' my-parent-slug/my-slug': https://codex.wordpress.org/Function_Reference/get_page_by_path#Examples –

3

một phương pháp ít tốn kém và 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); 
} 
0

Như api wordpress đã thay đổi, bạn không thể trang get_posts sử dụng với param 'POST_NAME'. Tôi đã sửa đổi chức năng 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ác vấn đề liên quan