问题描述
我喜欢让我的网站的任何用户建议对页面进行修改的想法。很像 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 添加/编辑页面) 中保存值
-
原创内容
-
编辑版本
-
用户昵称和他的电子邮件
并且可以使用
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 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。