如何启用建议的编辑?

时间:2013-03-12 作者:Patrick Klug

我喜欢让我的网站的任何用户都可以建议对页面进行编辑的想法。与Stack Exchange上的编辑系统非常相似,但不同之处在于任何人都应该能够编辑,而不仅仅是注册用户。所有编辑都将通过审批流程。

我如何实现这一点?

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

区分帖子内容、标题和作者

就像几个月前不得不做的一些相关事情一样,这里有一种最简单、最能证明未来的方法(我可以确定),可以检查内容或标题是否有更改,或者作者是否有更改:

// Update Title
\'\' !== wp_text_diff(
    $el[\'post_title\'],
    $GLOBALS[\'post\']->post_title
)
    AND $GLOBALS[\'post\']->post_title = $el[\'post_title\'];
// Update Content
\'\' !== wp_text_diff(
    $el[\'post_content\'],
    $GLOBALS[\'post\']->post_content
)
    AND $GLOBALS[\'post\']->post_content = $el[\'post_content\'];
// Update author
$GLOBALS[\'post\']->post_author !== $el[\'post_author\']
    AND $GLOBALS[\'post\']->post_author = $el[\'post_author\'];
简单解释一下我的场景:我通过远程API从远程位置获取帖子。然后我退回了global $post, 在单个post循环期间,包含原始数据或新数据。这样,我就可以设置所有其他无需检查更改的帖子值。

建议编辑,在搜索可以(临时)保存帖子内容副本编辑的位置时,必须记住的主要事实是,内容是longtext. 因此,要保存建议编辑的位置应该满足该要求。评论可以做到这一点。

还有一个很好的事实是,它们提供了一个API来将它们很好地放置在一个循环中,因此它可以顺利集成,高度可定制,并且可以快速设置。最后但并非最不重要的一点是,大多数主题都已经集成了注释,因此很容易在系统上进行复制,并与几乎任何可用的主题挂钩。

我建议(或者)扩展或修改评论表单。使用以下字段或添加附加字段,并将回调连接到comment_form_default_fields.

<?php
// Add it for logged in users and guests:
add_action( \'comment_form_logged_in_after\', \'wpse_proposed_edit_textarea\' );
add_action( \'comment_form_after_fields\', \'wpse_proposed_edit_textarea\' );
function wpse_proposed_edit_textarea()
{
    ?>
    <p class="comment-form-title">
        <label for="wpse_propsed_edit">
            <?php _e( \'Propose Edit\', \'your_textdomain\' ); ?>
        </label>
        <textarea name="wpse_propsed_edit" id="wpse_propsed_edit">
            <?php the_content(); ?>
        </textarea>
    </p>
    <input type="hidden" name="comment_approved" id="comment_approved" value="0" />
    <?php
}
所以我添加了一个hidden 字段comment_approved 值为0 将其设置在队列中。不确定这是否可行,或者这个(核心)值是否实际上是注释元数据,是否需要使用add_comment_meta() 保存期间。如果没有,您可以在下面几行代码中使用一些东西

add_filter( \'pre_comment_approved\' , \'wpse_pre_suggest_edit\', 100, 2 );
function wpse_pre_suggest_edit( $approved , $commentdata )
{
    // You might need to inspect $commentdata 
    // to determine approval, disapproval, or spam status
    if ( ! empty( $commentdata[\'wpse_propsed_edit\'] ) )
    {
        # Now add a filter to the comment post action, so we save a meta entry
        add_action( \'comment_post\', \'wpse_set_proposed_edit\' );
        return 0;
    }

    return 1;
}

// This function makes it easier for us to identify the comments by their meta value
function wpse_set_proposed_edit( $comment_id );
{
    // Only run once
    remove_filter( current_filter(), __FUNCTION__ );

    add_comment_meta( $comment_id, \'proposed_edit\', true, true );
}

在管理端显示注释这里我将使用一个简单的类扩展和一个自定义管理页面:

function wpse_add_proposed_edits_admin_page()
{
    add_menu_page(
        \'Proposed Edits\',
        \'Suggested Edits\',
        \'activate_plugins\',
        \'proposed_edits\',
        \'wpse_proposed_edits_page_cb\'
    );
}
add_action( \'admin_menu\', \'wpse_add_proposed_edits_admin_page\' );

function wpse_proposed_edits_page_cb()
{
    $proposed_edits_table = new WP_Proposed_Edits_Table();
    $proposed_edits_table->prepare_items(); 
    $proposed_edits_table->display(); 
}

class WP_Proposed_Edits_Table extends WP_List_Table
{
    // Override List table default logic in here
}
更多信息can be found on WPEngineer.

批准编辑之后,您可以添加自定义操作,并使用我显示的第一个代码来处理建议的编辑,以检查是否有更改,然后只需更新帖子即可。注释本身包含一个键为的值comment_post_ID, 因此,识别编辑后的帖子ID很简单。

最后一句话,我也想看看最后的插件。请在此处链接:)

SO网友:revo

我的想法很简单。

您可以Edit Suggestion 链接位于具有自定义定义模板的帖子底部,其中使用一个文本框(可能带有编辑器),该文本框链接到默认值为的自定义分类法post content.

任何更改content 将与进行比较original post content 提交(草稿)并输入CAPTCHA code 使用Diff算法,如PHP inline-diff 包裹or Text-Diff 梨形包装or 或者使用PHP函数,根据this 对于不太长的文本,使用CSS组合。

然后将值保存在3个自定义元框中(在分类法后端添加/编辑页面中),显示

原始内容编辑版用户昵称及其电子邮件并保存Post ID 也许有一个update_option() 功能供以后使用。

阅读编辑版本并被管理员接受后,该帖子将替换为您在函数中编写的原始帖子。php。

SO网友:Wyck

嗯,这相当复杂,一个正确的答案需要相当长的时间才能写出。所以这不是一个真正的答案,只是一些想法。。

使用WordPress内置wp_update_post 通过ajax可以提供所需的修订历史记录,但不能提供批准编辑所需的功能。

默认情况下,无法通过编辑创建草稿,但此处已讨论过,Is there any way to draft a revision of a published page or post? What workarounds have you used?

您可以尝试使用Front-end Editor 但您将无法控制编辑的发布,所以请尝试使用另一个插件(如Revisionary 它允许基于权限的编辑,我不知道它们是否可以一起工作。

如果他们不这样做,你将不得不在上述两个插件的基础上破解一个插件,或者从头开始写一些东西。

我的临时方法是使用一个按钮转到另一个页面,该页面使用JSON输出帖子内容/数据,这在使用Ajax和WYSIWYG编辑器时更容易使用。“保存”按钮将作为草稿发布,而不是发布,这样您就可以控制编辑(参见上文WPSE关于如何实现这一点的讨论,这相当令人畏惧)。

在执行此操作时,还存在其他复杂问题,如清理、编码、垃圾邮件、媒体处理、自定义字段、时间戳、内存等。好消息是wordpress已经有了一个可以插入的修订系统,并且能够处理多个编辑器。

这是一个插件的好主意。

结束

相关推荐

多个单个站点,一个插件目录-调整plugins_url()

[这不是一个多站点问题]更新:这个问题在逻辑上是不可能的,或者是思维循环,如果你愿意的话,请检查下面的更新。技术是laid out here in WPEngineer.它允许有一个插件文件夹来为运行在同一服务器上的多个WordPress站点提供服务。所以,我所有的开发站点都在wp配置中有这个。phpdefine( \'WP_PLUGIN_DIR\', \'/www_dev/base-site/wp-content/plugins\' ); define( \'WP_PLUGIN_URL\', \