Câu trả lời:
Sử dụng biến toàn cục $post
:
<?php
global $post;
$post_slug = $post->post_name;
?>
echo
nó. Vì vậy, điều này thật lý tưởng:<?php global $post; echo $post->post_name; ?>
$WP_Post
?
Theo câu trả lời khác, sên được lưu trữ trong post_name
tà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() );
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.
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_name
tí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.
$post
có 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_posts
phá 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;
query_posts
khô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 :)
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.
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) );
}
}
Đây là chức năng sử dụng khi muốn lấy sên bên ngoài vòng lặp.
get_post_field( 'post_name');
Câu trả lời được tìm thấy ở đây: Làm thế nào để truy xuất Slug của trang hiện tại trong WordPress?
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' );
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_loaded
hoặ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
, mysqli
hoặc một PDO
ví 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.
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.
Trang động gọi trong WordPress.
<?php
get_template_part('foldername/'.basename(get_permalink()),'name');
?>
<?php global $post; $post_slug=$post->post_name; echo $post_slug; ?>