如果您想要一个更隐蔽的答案,您可以使用下面的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
挂钩。
@note
这是假设您有一个标准的数据库前缀
wp_posts
. 如果需要考虑变量前缀,可以通过PHP轻松获得正确的post表,方法如下:
<?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
, 或a
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;
{
}
}
Usage
$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、帖子类型、slug和可见性。如果您需要进一步的详细信息,您可以使用new \\WP_Post($id);
, 或者对任何相关的表行使用任何其他本机Wordpress函数,甚至在循环之外。
我在自己的几个自定义主题和插件中使用了类似的设置,效果非常好。它也很安全,不会让内部数据在全局范围内浮动,在全局范围内可以像Wordpress中的大多数内容那样被覆盖。