Hướng dẫn how do i get the current slug in wordpress? - làm cách nào để lấy slug hiện tại trong wordpress?

Nếu bạn muốn có một câu trả lời dưới sự kết hợp hơn, bạn có thể sử dụng truy vấn SQL sau đây để 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ó hook nào bị bắn bất cứ điều gì.

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 các móc mu_plugins_loaded hoặc init.

@note

Đây là giả sử bạn có 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, bạn có thể có được bảng bài đăng chính xác thông qua PHP khá dễ dàng bằng cách thực hiện như sau:

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

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`;"
0,
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`;"
1 hoặc một ví dụ
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`;"
2. Vì không có đầu vào người dùng trong truy vấn này, nên việc chạy mà không có câu lệnh đã 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ữ điều này như một giá trị tĩnh riêng của một lớp, vì vậy nó có thể được truy cập mà không phải bắn lại truy vấn nhiều hơn một lần cho mỗi trang để có hiệu suất tốt nhất, một cái gì đó như thế này:

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

Cách 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 nhận đượ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ới

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`;"
3


Đ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 được điểm mà nó tìm thấy yêu cầu của bạn dễ chịu. Đây là một phiên bản tối ưu hóa hơn một chút của cùng một truy vấn được điều hành bởi chính Core WordPress. Cái này lọc ra tất cả các thứ rác mà bạn không muốn trả lại và chỉ cung cấp cho bạn một danh sách có tổ chức độc đáo với ID tác giả, loại bài đăng, sên và khả năng hiển thị có liên quan. 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

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`;"
4 hoặc sử dụng bất kỳ chức năng WordPress gốc nào khác với bất kỳ hàng bảng nào 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 an toàn và không để dữ liệu nội bộ nổi xung quanh trong phạm vi toàn cầu, nơi nó có thể bị ghi đè như hầu hết các thứ trong WordPress.

Có một số cách để có được trang hiện tại của Slug hoặc Post Slug trong WordPress. Đơn giản nhất, có thể lấy Slug Post Post hoặc trang trên trang bằng cách truy cập vào thuộc tính Post Post Post_Name toàn cầu. Phương thức đầu tiên được hiển thị bên dưới truy cập vào 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.post_name property. The first method shown below accesses that post_name property within the $post variable while the second option below uses the get_post_field method.

Cả hai phương thức dưới đây đề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 trên trang hiện tại, tùy chọn thứ hai cung cấp một phương thức thay thế sử dụng post_id để lấy sên.

Tùy chọn 1: 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 toàn cầu.post_name property of the global post object.

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 toàn cầu giữ dữ liệu được liên kết với trang hiện tại hoặc bài đăng đang được truy cập. Biến toàn cầu này có sẵn bên trong vòng lặp WordPress. Vòng lặp WordPress là mã PHP được sử dụng bởi WordPress để hiển thị các bài đăng trên mỗi https://codex.wordpress.org/the_loop. 

Tùy 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 sên. Nếu bạn ở trong vòng lặp, điều này trông giống như mã sau:get_post_field function to get the current page or post slug. IF you are inside the loop, this looks like the following code:

$page_slug = get_post_field( 'post_name' );

Nếu bạn ở bên ngoài vòng lặp bài, bạn sẽ cần một đối số thứ hai cho chức năng GET_POST_FIELD. Đối với đối số thứ hai đó, bạn có thể sử dụng giá trị $ post_id. Xem mã bên dưới làm ví dụ:get_post_field function. For that second argument, you could use a $post_id value. See code below as an example:

$page_slug = get_post_field( 'post_name', $post_id );

Thats tất cả để có nó!