编辑后的帖子样式不同

时间:2012-05-14 作者:Arg Geo

是否有任何方法可以将类添加到已编辑的帖子中,以使其风格不同?如果有一种方法可以在不添加类的情况下做到这一点,那么这个选项会更好。

已编辑-忽略上述问题-参见下文

是否有办法在用户撰写文章/帖子的区域中添加复选框(元框),以便选中该复选框后,将在特定帖子上添加一个类(在循环和单个帖子页面中)?如果这种方式不可能实现,有没有办法通过自定义字段来实现?如果两者都有可能,我宁愿选择第一种方式。

2 个回复
最合适的回答,由SO网友:chrisguitarguy 整理而成

这与@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_gmtpost_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.

SO网友:mrwweb

A.custom meta box 使用复选框字段可能效果最好,但我能想到的最简单的解决方案是:

创建“已编辑”类别post_class() 在每个文章/帖子/页面的包装器元素上*.category-edited 类(或者.category-{ID},如果“编辑的”slug发生更改,这会更安全)Thepost_class() 函数(了解它on the Codex) 是主题文件中使用的模板标记。它被放在循环中每个帖子的包装元素上。它可以位于任何HTML元素上,但常见的是div, article (仅限HTML5),以及li. 使用该类如下所示:

<article <?php post_class(); ?>>
    <!-- stuff like the_title() and the_content() goes here. -->
</article>
Post_class() 然后生成类似“class=\'post-23 category events\'”的内容。

结束