unstick_post
- 取消粘贴帖子stick_post
- 贴帖子is_sticky
- 弄清楚一篇文章是否有粘性,记住这三点,我们所需要做的就是用一些管理菜单栏胶水将它们粘在一起。首先,让我们把所有的东西都放在一个班级里,以获得乐趣和收益。这个类将有一些我们稍后将使用的常量:nonce、取消粘贴帖子的操作和粘贴帖子的操作。
class WPSE_58818_Stick_Post
{
/**
* Ajax nonce.
*
* @since 1.0
*/
const NONCE = \'wpse58818_nonce_\';
/**
* Unstick ajax action
*
* @since 1.0
*/
const UNSTICK = \'wpse58818_unstick\';
/**
* Stick Ajax action
*
* @since 1.0
*/
const STICK = \'wpse58818_stick\';
} // end class
然后,让我们添加一个init函数来添加我们的操作。第一个操作是挂接到template\\u redirect。<?php
class WPSE_58818_Stick_Post
{
// snip snip
/**
* Adds actions and such.
*
* @since 1.0
* @access public
* @uses add_action
*/
public static function init()
{
add_action(
\'template_redirect\',
array(__CLASS__, \'template_r\')
);
}
}
注意:从现在起,我将省略class
一点您可以查看整个内容here.在连接到的函数中template_redirect
, 我们将检查是否位于单个贴子页面上,以及用户是否可以编辑它。如果可以的话,我们会admin_bar_menu
和wp_footer
.
/**
* Hooked into `template_redirect`. Adds the admin bar stick/unstick
* button if we\'re on a single post page and the current user can edit
* the post
*
* @since 1.0
* @access public
* @uses add_action
*/
public static function template_r()
{
if(
!is_single() ||
!current_user_can(\'edit_post\', get_queried_object_id())
) return; // not a single post or the user can\'t edit it
// Hook into admin_bar_menu to add stuff
add_action(
\'admin_bar_menu\',
array(__CLASS__, \'menu\'),
100
);
// Hook into the footer and spit out some JavaScript
add_action(
\'wp_footer\',
array(__CLASS__, \'footer\')
);
}
在menu
函数,连接到admin_bar_menu
, 我们可以添加新项目:/**
* Hooked into `admin_bar_menu`. Adds our stick/unstick node.
*
* @since 1.0
* @access public
*/
public static function menu($mb)
{
// get the current post ID
$post_id = get_queried_object_id();
$mb->add_node(array(
\'id\' => \'wpse58818-sticker\',
\'meta\' => array(
\'class\' => \'wpse58818-sticker\',
\'title\' => is_sticky($post_id) ? \'unstick\' : \'stick\'
),
\'title\' => is_sticky($post_id) ? __(\'Unstick\') : __(\'Stick\'),
\'href\' => self::get_url($post_id)
));
}
这里我们得到了第一个“实用程序函数”,它为管理菜单栏节点构建URL。这只是个包装add_query_arg
然后构建一个url,稍后将与AJAX一起使用:/**
* Get an Ajax URL to use for a given post
*
* @since 1.0
* @access protected
*/
protected static function get_url($post_id)
{
return add_query_arg(array(
\'post_id\' => absint($post_id),
\'action\' => is_sticky($post_id) ? self::UNSTICK : self::STICK,
\'nonce\' => wp_create_nonce(self::NONCE . $post_id)
), admin_url(\'admin-ajax.php\'));
}
Thefooter
函数只是输出一些JavaScript来进行AJAX调用。基本概述:当有人单击我们的新链接时,对给定的URL发出GET请求。如果成功,请更改(取消)粘贴链接的href、文本和标题。/**
* Hooked into `wp_footer`. Spits out a bit of JS to stick/unstick a post
*
* @since 1.0
* @access public
*/
public static function footer()
{
?>
<script type="text/javascript">
jQuery(document).ready(function($) {
$(\'.wpse58818-sticker a\').on(\'click\', function(e) {
e.preventDefault();
var action = $(this).attr(\'title\');
var that = this;
$.get(
$(this).attr(\'href\'),
{},
function(data) {
if(\'0\' == data)
{
console.log(data);
alert(\'<?php echo esc_js(__(\'An error occurred\')); ?>\');
return;
}
$(that).attr(\'href\', data);
if(\'stick\' == action) {
$(that).html(\'<?php echo esc_js(__(\'Unstick\')); ?>\');
$(that).attr(\'title\', \'unstick\');
} else {
$(that).html(\'<?php echo esc_js(__(\'Stick\')); ?>\');
$(that).attr(\'title\', \'stick\');
}
}
);
});
});
</script>
<?php
}
现在我们来看AJAX回调。Ajax in plugins/themes 值得一读。我们将修改init
稍微增加一点功能,再添加两个操作:
/**
* Adds actions and such.
*
* @since 1.0
* @access public
* @uses add_action
*/
public static function init()
{
add_action(
\'template_redirect\',
array(__CLASS__, \'template_r\')
);
// Ajax actions
add_action(
\'wp_ajax_\' . self::STICK,
array(__CLASS__, \'stick\')
);
add_action(
\'wp_ajax_\' . self::UNSTICK,
array(__CLASS__, \'unstick\')
);
}
以及我们的AJAX回调。这些很可能是相同的功能。我在这里把它们分开,因为在将来似乎更容易扩展/更改。这两种方法都会检查AJAX请求是否有效,(取消)相应地粘贴帖子,并回显新的URL以备将来(取消)粘贴。/**
* Ajax callback for the stick function
*
* @since 1.0
* @access public
*/
public static function stick()
{
$post_id = self::can_ajax();
stick_post($post_id);
echo self::get_url($post_id);
die();
}
/**
* Ajax callback for the unstick function
*
* @since 1.0
* @access public
* @uses unstick_post
*/
public static function unstick()
{
$post_id = self::can_ajax();
// nonces checked, everything is good to go. Unstick!
unstick_post($post_id);
echo self::get_url($post_id);
die();
}
我们的第二个“效用函数”出现在这里。can_ajax
验证nonce和用户权限,并将post ID返回(取消)stick。如果任何检查失败,它将退出(通过die(\'1\')
)./**
* Check to see if the current user can ajax. Returns the post ID to
* stick/unstick if successful. Kills the program otherwise
*
* @since 1.0
* @access protected
*/
protected static function can_ajax()
{
$post_id = isset($_REQUEST[\'post_id\']) ? $_REQUEST[\'post_id\'] : \'\';
if(
!$post_id ||
!check_ajax_referer(self::NONCE . $post_id, \'nonce\', false)
) die(\'0\');
if(!current_user_can(\'edit_post\', $post_id))
die(\'0\');
return $post_id;
}
这就是整个mess as a plugin.