要创建随机帖子的特殊输出,请执行以下操作:
- Register an endpoint 到你博客的根目录。看见A (Mostly) Complete Guide to the WordPress Rewrite API 有关详细信息刷新永久链接设置。我只会在(取消)激活时执行此操作钩住
\'template_redirect\'
并根据请求端点的详细信息返回输出。然后exit
.
仅此而已。
嗯……一些代码可能有助于理解细节。:)
让我们为HTML和JSON输出构建一个小插件。
我已经给它命名了T5 Random Posts Endpoint; 所有代码都进入一个具有静态方法的类中,以保持全局命名空间干净。
add_action( \'init\', array ( \'T5_Random_Posts_Endpoint\', \'init\' ) );
/**
* Build a root endpoint.
*/
class T5_Random_Posts_Endpoint
{
/**
* Register endpoint and actions.
*
* @wp-hook \'init\'
* @return void
*/
public static function init()
{
add_rewrite_endpoint( \'randomposts\', EP_ROOT );
add_filter( \'request\', array ( __CLASS__, \'filter_request\' ) );
add_action( \'template_redirect\', array ( __CLASS__, \'render\' ) );
}
}
如你所见,我们称之为中央
init
方法打开
\'init\'
初始化我们的插件。创意命名,嗯?
端点已命名randomposts
并附着在根部。所以激活后,您可以打开example.com/randomposts/
或example.com/randomposts/json/
.
但是…如果调用第一个URL,则端点工作,请求变量randomposts
已设置–但已设置empty. 这就是为什么我们\'request\'
给变量adefault value 我们可以稍后再处理。让我们使用html
默认情况下:
/**
* Prepare the endpoint variable so it has always a value.
*
* @wp-hook \'request\'
* @param array $request
* @return array
*/
public static function filter_request( $request )
{
if ( isset ( $request[\'randomposts\'] )
and empty ( $request[\'randomposts\'] )
)
{
$request[\'randomposts\'] = \'html\';
}
return $request;
}
现在我们开始
\'template_redirect\'
因此WordPress不会使用默认模板
index.php
但我们自己的产出。
/**
* Create output.
*
* @wp-hook \'template_redirect\'
* @return void
*/
public static function render()
{
// This is not our endpoint.
if ( \'\' === $type = get_query_var( \'randomposts\' ) )
{
return;
}
// Someone is poking around.
// You can extend this and build different output variants.
if ( ! in_array( $type, array ( \'html\', \'json\' ) ) )
{
status_header( 414 );
print \'Unsupported Media Type. Use "html" or "json" only.\';
exit;
}
// Empty blog?
if ( ! $posts = get_posts( array ( \'numberposts\' => 10, \'orderby\' => \'rand\' ) ) )
{
status_header( 404 );
print \'No posts found.\';
exit;
}
self::$type( self::prepare_post_data( $posts ) );
exit;
}
首先,我们通过查看
get_query_var( \'randomposts\' )
. 我们在请求过滤器中填充了这个变量,因此如果它仍然是空的,我们肯定知道这不是我们的事,我们会很快返回。
然后,我们测试该请求是否针对预定义的输出变量之theme test data六 或json
. 如果有人打电话/randomposts/css
或/randomposts/lala
我们提出了一个414错误,并提供了一条有用的消息。然后退出。
然后我们终于得到了我们的帖子get_posts()
并在一个名为prepare_post_data()
:
/**
* Build a simple array with just titles and permalinks.
*
* @wp-hook \'template_redirect\'
* @param array $posts
* @return void
*/
protected static function prepare_post_data( $posts )
{
$data = array ();
foreach ( $posts as $post )
{
if ( empty ( $post->post_title) )
{
continue;
}
$data[ $post->ID ] = array (
\'title\' => strip_tags( $post->post_title ),
\'url\' => get_permalink( $post->ID )
);
}
return $data;
}
我们将此简单数组传递给一个名为的方法,该方法与我们的输出完全相同:
html()
或
json()
.<让我们从
json()
; 这是最简单的部分。看见
How to encode post content as JSON? 了解一些背景知识。
/**
* Render JSON output
*
* @wp-hook \'template_redirect\'
* @param array $data
* @return void
*/
protected static function json( array $data )
{
header( \'Content-type: application/json\' );
print json_encode( $data );
}
很简单,不是吗?这个
html()
不是那么难,只是更长:
/**
* Render HTML output
*
* @wp-hook \'template_redirect\'
* @param array $data
* @return void
*/
protected static function html( array $data )
{
?>
<!doctype html>
<title><?php bloginfo( \'name\' ); ?></title>
<meta name="viewport" content="width=device-width; initial-scale=1.0">
<?php
// Just a sample style. Be creative! :)
?>
<style>
body, body *
{
display: block;
font: 1em/1.4 Calibri, sans-serif;
list-style: none;
margin: 0;
padding: 0;
text-decoration: none;
}
a
{
background: #f5f5f5;
border-bottom: 1px solid #ddd;
color: #333;
padding: 5px 10px;
}
a:hover, a:focus
{
background: #333;
color: #f5f5f5;
}
h1 a
{
font-size: 1.2em;
font-weight: bold;
}
</style>
<h1><a href="<?php bloginfo( \'url\' ); ?>"><?php bloginfo( \'name\' ); ?></a></h1>
<ul>
<?php
foreach ( $data as $post )
{
print \'<li><a href="\' . $post[\'url\'] . \'">\' . $post[\'title\'] . \'</a></li>\';
}
?>
</ul>
<?php
}
这就是
theme test data:
现在我们的产出已经完成了——我们仍在render()
– 我们打电话exit
因为否则WordPress会包括index.php
从活动主题。
现在,我们只需要一种方法来刷新永久链接设置:
/**
* Reset permalinks.
*
* @wp-hook \'activate_\' . __FILE__
* @wp-hook \'deactivate_\' . __FILE__
* @return void
*/
public static function flush_rewrite_rules()
{
remove_action( \'init\', array ( __CLASS__, \'init\' ) );
add_action( \'init\', \'flush_rewrite_rules\', 11 );
}
我们防止违约
init
钩住这里,因为激活时我们在插件列表中,不需要端点,停用时我们不想重新注册现在未使用的永久链接。
我们通过以下方式将此方法附加到(取消)激活:
// refresh permalink settings
register_activation_hook(
__FILE__ ,
array ( \'T5_Random_Posts_Endpoint\', \'flush_rewrite_rules\' )
);
register_deactivation_hook(
__FILE__ ,
array ( \'T5_Random_Posts_Endpoint\', \'flush_rewrite_rules\' )
);
现在我们可以说:仅此而已。真正地
如果你能做到这一点complete plugin from GitHub.