这与@mrwweb的答案非常相似,但更具体一点。为了得到我们的post类,我们也不会重载分类法,但要做您最初想要做的事情:使用自定义元框。
有一个内置的模板标记,名为post_class
. 像WordPress中几乎所有其他函数一样,您可以通过过滤器控制其输出。
第一步:添加元框。
这是通过add_meta_box
. 如果你想知道这些论点是什么,你可以直接看一下法典——这些文档非常好。需要关注的是指定回调函数的第三个参数——回调是呈现HTML的内容。要添加我们将挂接到的元框add_meta_boxes_post
和电话add_meta_box
.
事情是这样的:
<?php
add_action(\'add_meta_boxes_post\', \'wpse52122_meta_box\');
/*
* Adds a meta box on the post editing screen.
*
* @uses add_meta_box
*/
function wpse52122_meta_box()
{
add_meta_box(
\'wpse52122-box\',
__(\'Add Custom Style\', \'wpse52122\'),
\'wpse52122_meta_box_cb\',
\'post\',
\'side\',
\'low\'
);
}
/*
* Callback function for the meta box added above. This is what renders the
* boxes HTML.
*
* @uses get_post_meta
*/
function wpse52122_meta_box_cb($post)
{
$meta = get_post_meta($post->ID, \'_wpse52122_style\', true);
wp_nonce_field(\'wpse52122_nonce\', \'wpse52122_nonce\', false);
echo \'<p>\';
echo \'<label for="wpse52122_style">\' . __(\'Edited?\', \'wpse52122\') . \'</label> \';
echo \'<input type="checkbox" name="wpse52122_style" id="wpse52122_style" \' .
checked($meta, \'on\', false) . \' />\';
echo \'</p>\';
}
现在,我们需要在保存帖子时实际保存这些内容。你陷入了
save_post
为此:
<?php
add_action(\'save_post\', \'wpse52122_save_post\');
/*
* Hooked in `save_post` this is the function that will take care of saving the
* checkbox rendered above
*
* @uses update_post_meta
* @uses wp_verify_nonce
* @uses current_user_can
*/
function wpse52122_save_post($post_id)
{
// no auto save
if(defined(\'DOING_AUTOSAVE\') && DOING_AUTOSAVE)
return;
// can the current user edit this post?
if(!current_user_can(\'edit_post\', $post_id))
return;
// Do we have our nonce?
if(!isset($_POST[\'wpse52122_nonce\']) ||
!wp_verify_nonce($_POST[\'wpse52122_nonce\'], \'wpse52122_nonce\')) return;
// if the the box is set, save meta key with \'on\' as the value.
$val = isset($_POST[\'wpse52122_style\']) && $_POST[\'wpse52122_style\'] ?
\'on\' : \'off\';
update_post_meta($post_id, \'_wpse52122_style\', esc_attr($val));
}
最后,钩住
post_class
添加“已编辑”类。钩子函数将得到三个参数,我们分别关注第一个和最后一个:post类数组和post id。
<?php
add_filter(\'post_class\', \'wpse52122_post_class\', 10, 3);
/*
* Hooked into `post_class` this function adds the class \'edited\' to the
* post_class array if the meta value `_wpse52122_style` is set to \'on\'
*
* @uses get_post_meta
* @return array The Post classes
*/
function wpse52122_post_class($classes, $class, $post_id)
{
if(\'on\' == get_post_meta($post_id, \'_wpse52122_style\', true))
{
$classes[] = \'edited\';
}
return $classes;
}
完成!然而,所有这些似乎都是相当多的工作。那么为什么不直接
post_class
并比较
post_created_gmt
和
post_modified_gmt
?
<?php
add_filter(\'post_class\', \'wpse52122_post_class_alt\', 11, 3);
/*
* Filter the post_class and add the class edited if the post_date_gmt &
* post_modified_gmt don\'t match up.
*
* @uses get_post
* @return array The post classes
*/
function wpse52122_post_class_alt($classes, $class, $post_id)
{
$post = get_post($post_id);
if(!$post) return $classes;
$created = strtotime($post->post_date_gmt);
$mod = strtotime($post->post_modified_gmt);
if($mod > $created)
{
$classes[] = \'edited-alt\';
}
return $classes;
}
这些都是
as a plugin.