如何启用建议的编辑?


19

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

我该如何实施?


1
我不知道该怎么做,但是我认为这可能确实有问题。我认为您会收到很多垃圾邮件。
马丁·托马

3
您是否肯定需要为网站安装WordPress?您所需的功能听起来很像MediaWiki的安装。您应该权衡两种安装方式的利弊。MediaWiki是一个很好的选择。
Marc Dingena

不久前,我就用这个想法跳来跳去。最近的可用的解决方案是这样的插件:wordpress.org/support/plugin/post-forking然而在非常早期的阶段。该插件仅限于注册用户。
克里斯汀·库珀

我们一直在朝着这样的方向努力。我们已经预想了帖子的Wikipedia风格编辑,以及一个“历史记录”小部件:github.com/publishpress/Revisionary/issues/13我们还没有,但几乎所有结构都已就绪。
史蒂夫堡

Answers:


11

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

就像一个月前要做的事情一样,这是最简单,最可行的证明方式(我可以罚款),以检查内容或标题是否发生更改,或者作者是否更改:

// 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在单个后循环中返回了,其中包含原始数据或新数据。这样一来,我就可以设置所有其他不需要检查更改的帖子值。

提出修改

在搜索可以(临时)保存帖子内容的副本编辑的地方时,必须记住的主要事实是该内容是的db条目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_approved0进行设置。不知道这是否会起作用,或者不确定此(核心)值是否实际上是注释元数据,并且是否需要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
}

可以在WPEngineer上找到更多信息。

批准编辑

然后,您可以使用我显示的第一个代码来检查代码是否有更改,然后添加自定义操作并处理建议的编辑,然后简单地更新帖子。评论本身拥有一个键值为的值comment_post_ID,因此,直接识别已编辑帖子ID是很容易的。

最后说明

我也想看看最终的插件。请在这里链接:)


1
我对这个问题的赏识在于使用注释元来存储建议的编辑以及wp_text_diff()进行实际比较的想法。支持其他答案。
fuxia

8

我的想法很简单。

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

  • 提交后(作为草稿)和使用Diff算法(例如PHP内联差异Text-Diff PEAR包)输入后,根据使用PHP函数(对于CSS组合不太长的文本)使用PHP函数,对的任何更改都content将与之进行比较。original post contentCAPTCHA code

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

    1. 原始内容
    2. 编辑版本
    3. 用户昵称和他的电子邮件

    并保存Post IDupdate_option()供以后使用。

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


一些注意事项:(A)“当您在functions.php中编码时” -与此不同意。这是插件材料。(B)“使用帖子内容的默认值链接到自定义分类法” -分类法术语/分类群在任何情况下都适合内容的情况下只有一个可能的值:说明。然后,您需要一个位置来存储帖子ID。这会在哪里?由于WP税制的局限性,无处可做,因此您只能保存术语ID。然后,这仅是一种(有限的)单向系统:过帐>期限数据。
凯撒

4

嗯,这相当复杂,正确的答案将花费大量时间来编写。所以这只是一些想法,不是一个真正的答案。

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

默认情况下,无法通过编辑创建草稿,但已在此处进行了讨论。是否可以草拟已发布页面或帖子的修订版?您使用了什么解决方法?

您可以尝试使用前端编辑器,但无法控制正在发布的编辑,因此请尝试使用另一个插件(如Revisionary)将其混搭,该插件允许基于权限的编辑,我不知道它们是否可以一起使用。

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

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

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

ps。对于插件来说,这是一个好主意。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.