Answers:
使用全局变量$post
:
<?php
global $post;
$post_slug = $post->post_name;
?>
echo
。因此,这将是理想的:<?php global $post; echo $post->post_name; ?>
在寻求更高的可靠性之后,我最终对导致此编辑的以下帖子进行了此回答:(请务必将其签出)
到目前为止,我能想到的最可靠的方法是:
// 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;
这样,您就可以确保99.9999%的时间每次都能获得正确的数据。
解决此问题的另一种更安全的选择是使用get_queried_object()
它保存当前查询的对象,以获取由post_name
属性保存的页面信息。可以在模板中的任何位置使用它。
$post
可以使用,但是它可能不可靠,因为任何自定义查询或自定义代码都可以更改的值$post
,因此应避免在循环外使用。
使用get_queried_object()
得到当前页面的对象是更为可靠,是不太可能被修改,除非您使用的是邪恶query_posts
打破了主查询的对象,但随后即一切都取决于你。
您可以使用以下内容
if ( is_page() )
$slug = get_queried_object()->post_name;
query_posts
并不有害,但是您通常不这样做,并且经常被滥用:)
给定代码示例,看起来您真正需要的是链接。在这种情况下,可以使用get_permalink(),可以在循环外部使用它。这比使用后塞子更可靠地完成您需要的操作。
可能是一个老问题,但是我根据您的答案创建了函数get_the_slug()和the_slug()。
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) );
}
}
进一步@Matthew Boynes回答,如果您也有兴趣获取父子弹(如果有),那么我发现此功能很有用:
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;
}
例如,将子弹添加到主体类:
function mytheme_body_class( $classes ) {
if ( $slugs = mytheme_get_slugs() ) {
$classes = array_merge( $classes, $slugs );
}
return $classes;
}
add_filter( 'body_class', 'mytheme_body_class' );
如果您想要一个更高级的答案,则可以使用以下SQL查询来随时提取所有帖子,无论是帖子,页面还是自定义分类法,即使到目前为止还没有激发任何钩子。
原始SQL:
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`;
即使在函数文件的第一行,也可以在mu_plugins_loaded
或init
钩子之前,它都可以工作。
@注意
这是假设您具有标准的数据库前缀wp_posts
。如果您需要考虑变量前缀,则可以通过以下操作通过PHP轻松获得正确的发布表:
<?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`;"
然后,用运行$wpdb
,mysqli
或PDO
实例。由于此查询中没有用户输入,因此只要不向其中注入任何变量,就可以在没有准备好的语句的情况下安全运行。
我建议将其存储为类的私有静态值,这样就可以访问它,而不必为使最佳性能而每页多次触发查询,如下所示:
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;
{
}
}
用法
$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
}
你明白了。如果您需要更多详细信息,则可以按常规使用new \WP_Post( get_the_ID() );
即使wordpress循环未达到您认为您的要求可以接受的程度,这也可以让您随时检查帖子。这是由Wordpress核心本身运行的同一查询的稍微优化的版本。这个过滤器过滤掉了您不希望返回的所有垃圾,并为您提供了一个井井有条的列表,其中列出了相关的作者ID,帖子类型,子词和可见性。如果您需要更多详细信息,则可以按常规使用来获取它们new \WP_Post($id);
,或者将其他任何本机Wordpress函数与任何相关的表行一起使用,甚至可以在循环外使用。
我在几个自己的自定义主题和插件中使用了类似的设置,并且效果很好。它也很安全,不会在内部范围内浮动内部数据,就像在Wordpress中大多数东西一样可以覆盖内部数据。
WordPress中的动态页面调用。
<?php
get_template_part('foldername/'.basename(get_permalink()),'name');
?>
<?php global $post; $post_slug=$post->post_name; echo $post_slug; ?>