问题描述

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

我该如何实现?

最佳解决方案

比较帖子内容,标题和作者

如同一个月前做过的事情一样,这里是最简单和最未来的证明方式 (我可以罚款),以检查内容或标题是否有变化,或者作者更改:

// 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,其中包含原始数据或新数据。这样我就移动了设置所有其他不需要检查更改的帖子值。

提出编辑

搜索帖子内容的 copy-edit 可以 (暂时) 保存的地方的主要事实是,内容是 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
}

所以我添加了一个值为 0 的 comment_approved 的隐藏字段,将其设置在队列中。不知道这是否工作,或者这个 (核心) 值实际上是注释元数据,并且需要在保存期间使用 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 是直接的。

最后说明

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

次佳解决方案

我的想法很简单。

  • 您可以在具有自定义模板的帖子的底部创建一个 Edit Suggestion 链接,其中使用与默认值 post content 相关联的自定义分类法的文本框 (可能包含编辑器) 。

  • content 的任何更改与 original post content 进行比较,作为草案提交 (original post content),并使用 PHP inline-diff 包或 Text-Diff PEAR 包中的 Diff 算法输入 CAPTCHA code,或者使用不具有 CSS 组合的 too-long 文本的 PHP 函数。

  • 然后通过在 3 个自定义元框 (在分类法 back-end 添加/编辑页面) 中保存值

    1. 原创内容

    2. 编辑版本

    3. 用户昵称和他的电子邮件

    并且可以使用 update_option()功能节省 Post ID 以供将来使用。

  • 阅读编辑版本和管理员接受后,该职位将被替换为原始的一个,如在 functions.php 中编码。

第三种解决方案

这很复杂,一个适当的答案需要相当长的时间来写。所以这不是一个真正的答案只是一些想法..

通过 ajax 在 wp_update_post 中使用 WordPress 构建将为您提供所需的修订历史记录,而不是批准编辑所需的功能。

默认情况下,编辑创建草稿是不可能的,但这里已经讨论过了,Is there any way to draft a revision of a published page or post? What workarounds have you used?

您可以尝试使用 Front-end Editor,但是您无法控制正在发布的编辑内容,因此请尝试使用另一个插件 (如 Revisionary) 进行混搭,该插件允许基于权限的编辑,我不知道他们是否会一起工作。

如果不这样做,你将不得不基于上述 2 个插件来插入一个插件,或者从头开始写一些东西。

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

在执行此操作时还会出现额外的复杂性,例如清洁,编码,垃圾邮件,媒体处理,自定义字段,时间戳,内存等。好消息是,wordpress 已经具有可插入的修订系统和处理多个编辑器的体面能力。

PS 。这是插件的好主意。

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。