Làm cách nào để truy xuất slug của trang hiện tại?


99

Tôi đang cố gắng truy xuất slug của trang WordPress hiện tại bên ngoài vòng lặp. Tiêu đề của trang trở lại với wp_title (), nhưng làm thế nào tôi có thể có được sên?

<li>
  <a href="/slug-of-current-page/">
    <?php wp_title('', true); ?>
  </a>
</li>

Câu trả lời:


151

Sử dụng biến toàn cục $post:

<?php 
    global $post;
    $post_slug = $post->post_name;
?>

3
Cảm ơn bạn. Giải pháp của bạn hoạt động tuyệt vời. Chỉ cần lặp lại tiếng sên:<?php global $post; $post_slug=$post->post_name; echo $post_slug; ?>
sarytash

1
Giống như sarytash đã nói, bạn cần echonó. Vì vậy, điều này thật lý tưởng:<?php global $post; echo $post->post_name; ?>
it_me

Thế còn $WP_Post?
Peter Mortensen

68

Theo câu trả lời khác, sên được lưu trữ trong post_nametài sản. Mặc dù nó có thể được truy cập trực tiếp, tôi thích get_post_field()chức năng (không được sử dụng) để truy cập các thuộc tính bài đăng không có API thích hợp cho chúng.

Nó yêu cầu bài đăng được cung cấp rõ ràng và không mặc định cho bài hiện tại, vì vậy đầy đủ cho bài hiện tại, nó sẽ là:

$slug = get_post_field( 'post_name', get_post() );

12
Điều đáng chú ý là nếu bạn ở trong vòng lặp, bạn có thể sử dụng get_post_fieldmà không cần đối số thứ hai ( tài liệu )
jmarceli

26

EDIT 5 THÁNG 4 NĂM 2016

Sau khi đào để có độ tin cậy cao hơn, cuối cùng tôi đã thực hiện câu trả lời này cho bài đăng sau đây dẫn đến chỉnh sửa này: ( Hãy chắc chắn kiểm tra nó )

Phương pháp đáng tin cậy nhất cho đến nay tôi có thể đưa ra là:

// Get the queried object and sanitize it
$current_page = sanitize_post( $GLOBALS['wp_the_query']->get_queried_object() );
// Get the page slug
$slug = $current_page->post_name;

Bằng cách này, bạn chắc chắn 99,9999% rằng bạn nhận được dữ liệu chính xác mỗi lần.

CÂU TRẢ LỜI

Một cách khác an toàn hơn cho vấn đề này là sử dụng get_queried_object()đối tượng được truy vấn hiện tại để lấy sên trang được giữ bởi thuộc post_nametính. Điều này có thể được sử dụng bất cứ nơi nào trong mẫu của bạn.

$postcó thể được sử dụng, nhưng nó có thể không đáng tin cậy vì bất kỳ truy vấn tùy chỉnh hoặc mã tùy chỉnh nào cũng có thể thay đổi giá trị của $post, vì vậy cần tránh bên ngoài vòng lặp.

Sử dụng get_queried_object()để có được đối tượng trang hiện tại đáng tin cậy hơn nhiều và ít có khả năng được sửa đổi, trừ khi bạn đang sử dụng cái ác query_postsphá vỡ đối tượng truy vấn chính, nhưng sau đó tất cả tùy thuộc vào bạn.

Bạn có thể sử dụng như trên

if ( is_page() )
    $slug = get_queried_object()->post_name;

Tôi phải nói rằng đó query_postskhông phải là xấu khi bạn muốn thay đổi truy vấn chính , tuy nhiên bạn thường không và thường bị sử dụng sai :)
jave.web

11

Cách đơn giản để lấy sên là:

<?php echo basename(get_permalink()); ?>

2
điều này phụ thuộc vào cài đặt permalink. Nếu bạn sử dụng cài đặt "đơn giản", các liên kết sẽ trông như thế http://domain/?p=123, để lại cho bạn ?p=123.
Mene

8

Lấy ví dụ mã, có vẻ như những gì bạn thực sự cần là một liên kết. Trong trường hợp đó, bạn có thể sử dụng get_permalink () , có thể được sử dụng bên ngoài vòng lặp. Điều đó sẽ làm những gì bạn cần đáng tin cậy hơn là sử dụng sên bài.


4
Đây là URL đầy đủ, không chỉ là sên.
Fred

2

Có thể là một câu hỏi cũ, nhưng tôi đã tạo các hàm get_the_slug () và the_slug () dựa trên câu trả lời của bạn.

if ( !function_exists("get_the_slug") ) {
    /**
    * Returns the page or post slug.
    *
    * @param int|WP_Post|null $id (Optional) Post ID or post object. Defaults to global $post.
    * @return string
    */
    function get_the_slug( $id = null ){
        $post = get_post($id);
        if( !empty($post) ) return $post->post_name;
        return ''; // No global $post var or matching ID available.
    }
    /**
    * Display the page or post slug
    *
    * Uses get_the_slug() and applies 'the_slug' filter.
    *
    * @param int|WP_Post|null $id (Optional) Post ID or post object. Defaults to global $post.
    */
    function the_slug( $id=null ){
        echo apply_filters( 'the_slug', get_the_slug($id) );
    }
}


0

Nói thêm về câu trả lời của @Matthew Boynes, nếu bạn quan tâm đến việc lấy sên cha mẹ (nếu có) thì tôi cũng thấy chức năng này hữu ích:

function mytheme_get_slugs() {
    if ( $link = get_permalink() ) {
        $link = str_replace( home_url( '/' ), '', $link );
        if ( ( $len = strlen( $link ) ) > 0 && $link[$len - 1] == '/' ) {
            $link = substr( $link, 0, -1 );
        }
        return explode( '/', $link );
    }
    return false;
}

Ví dụ: để thêm sên vào lớp cơ thể:

function mytheme_body_class( $classes ) {
    if ( $slugs = mytheme_get_slugs() ) {
        $classes = array_merge( $classes, $slugs );
    }
    return $classes;
}
add_filter( 'body_class', 'mytheme_body_class' );

0

Nếu bạn muốn có câu trả lời chính xác hơn, bạn có thể sử dụng truy vấn SQL sau để tìm nạp tất cả các bài đăng là bài đăng, trang hoặc phân loại tùy chỉnh bất cứ lúc nào, ngay cả khi chưa có câu hỏi nào được kích hoạt.

SQL thô:


SELECT `id`, `post_type` AS `type`, `post_author` AS `author`, `post_name` AS 
`slug`, `post_status` AS `status`
FROM wp_posts 
WHERE `post_type` NOT IN ('attachment', 'nav_menu_item', 'revision')
AND `post_status` NOT IN ('draft', 'trash')
ORDER BY `id`;

Điều này hoạt động ngay cả trên dòng đầu tiên của tệp chức năng của bạn, ngay cả trước khi móc mu_plugins_loadedhoặc init.

@Ghi chú

Điều này là giả sử bạn có một tiền tố cơ sở dữ liệu tiêu chuẩn wp_posts. Nếu bạn cần tính đến các tiền tố biến đổi, bạn có thể có được bảng bài chính xác thông qua PHP khá dễ dàng bằng cách thực hiện như sau:

<?php
global $wpdb;
$table = $wpdb->posts;
$query = "SELECT `id`, `post_type` AS `type`, `post_author` AS `author`, `post_name` AS 
`slug`, `post_status` AS `status`
FROM " . $table . "
WHERE `post_type` NOT IN ('attachment', 'nav_menu_item', 'revision')
AND `post_status` NOT IN ('draft', 'trash')
ORDER BY `id`;"

Sau đó chạy với một trong hai $wpdb, mysqlihoặc một PDOví dụ. Vì không có đầu vào của người dùng trong truy vấn này, nên chạy an toàn mà không có câu lệnh được chuẩn bị miễn là bạn không tiêm bất kỳ biến nào vào nó.

Tôi sẽ đề nghị lưu trữ giá trị này dưới dạng giá trị tĩnh riêng của một lớp, để có thể truy cập nó mà không cần phải truy vấn lại nhiều lần trên mỗi trang để có hiệu suất tốt nhất, đại loại như sau:

class Post_Cache
{
    private static $post_cache;

    public function __construct()
    {
        //This way it skips the operation if it's already set.
        $this->initCache();
    }

    public function get($id, $type = null)
    {
        if ( !(is_int( $id ) && array_key_exists( $id, self::$post_cache ) ) )
            return false;
        }
        if ( !is_null( $type ) )
        {
            //returns the specific column value for the id
            return self::$post_cache[$id][$type];
        }
        //returns the whole row
        return self::$post_cache[$id];
    }

    private function initCache()
    {
        if ( is_null(self::$post_cache) )
        {

            $query = "...";
            $result = some_query_method($query); //Do your query logic here.
            self::$post_cache = $result;
        {
    }
}

Sử dụng

$cache = new \Post_Cache();

//Get the page slug
$slug = $cache->get( get_the_ID(), 'slug');

if ($cache->get( get_the_ID() ))
{
    //post exists
} else {
    //nope, 404 'em
}
if ( $cache->get( get_the_ID(), 'status') === 'publish' )
{
    //it's public
} else {
    //either check current_user_can('whatever_permission') or just 404 it,
    //depending whether you want it visible to the current user or not.
}
if ( $cache->get( get_the_ID(), 'type') === 'post' )
{
    //It's a post
}
if ( $cache->get( get_the_ID(), 'type') === 'page' )
{
    //It's a page
}

Bạn có được ý chính. Nếu bạn cần thêm chi tiết, bạn có thể tìm nạp chúng như bình thường vớinew \WP_Post( get_the_ID() );


Điều này sẽ cho phép bạn kiểm tra các bài đăng bất cứ lúc nào, ngay cả khi vòng lặp wordpress không đạt đến điểm mà nó thấy yêu cầu của bạn dễ chịu. Đây là phiên bản được tối ưu hóa hơn một chút của cùng một truy vấn do chính Wordpress điều hành. Cái này lọc ra tất cả những thứ linh tinh mà bạn không muốn trả lại và chỉ cung cấp cho bạn một danh sách được sắp xếp độc đáo với id tác giả, loại bài đăng, sên và khả năng hiển thị. Nếu bạn cần thêm chi tiết, bạn có thể tìm nạp chúng như bình thường với new \WP_Post($id);hoặc sử dụng bất kỳ hàm Wordpress gốc nào khác với bất kỳ hàng nào trong bảng có liên quan, ngay cả bên ngoài vòng lặp.

Tôi sử dụng một thiết lập tương tự trong một vài chủ đề và plugin tùy chỉnh của riêng tôi và nó hoạt động khá tuyệt vời. Nó cũng bảo mật và không để dữ liệu nội bộ trôi nổi trong phạm vi toàn cầu nơi nó có thể bị ghi đè giống như hầu hết mọi thứ trong Wordpress.


0

Tôi thực sự không hiểu tại sao không có câu trả lời nào đơn giản làm:

global $wp;
$current_slug = $wp->request;

// Given the URL of https://example.com/foo-bar
if ($current_slug === 'foo-bar') {
  // the condition will match.
}

Điều này hoạt động cho tất cả các bài viết, trang, các tuyến tùy chỉnh.


-1

Trang động gọi trong WordPress.

<?php
    get_template_part('foldername/'.basename(get_permalink()),'name');
    ?>
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.