我喜欢使我网站的任何用户都可以建议对页面进行编辑的想法。类似于Stack Exchange上的编辑系统,但不同之处在于任何人都应该能够编辑,而不仅仅是注册用户。所有编辑都将经过批准过程。
我该如何实施?
我喜欢使我网站的任何用户都可以建议对页面进行编辑的想法。类似于Stack Exchange上的编辑系统,但不同之处在于任何人都应该能够编辑,而不仅仅是注册用户。所有编辑都将经过批准过程。
我该如何实施?
Answers:
就像一个月前要做的事情一样,这是最简单,最可行的证明方式(我可以罚款),以检查内容或标题是否发生更改,或者作者是否更改:
// 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_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
}
可以在WPEngineer上找到更多信息。
然后,您可以使用我显示的第一个代码来检查代码是否有更改,然后添加自定义操作并处理建议的编辑,然后简单地更新帖子。评论本身拥有一个键值为的值comment_post_ID
,因此,直接识别已编辑帖子ID是很容易的。
我也想看看最终的插件。请在这里链接:)
wp_text_diff()
进行实际比较的想法。支持其他答案。
我的想法很简单。
您可以Edit Suggestion
在帖子的底部创建一个具有自定义模板的链接,该链接使用文本框(可能带有编辑器),该文本框链接到默认值为的自定义分类法post content
。
提交后(作为草稿)和使用Diff算法(例如PHP内联差异包或Text-Diff PEAR包)输入后,或根据此使用PHP函数(对于CSS组合不太长的文本)使用PHP函数,对的任何更改都content
将与之进行比较。original post content
CAPTCHA code
然后通过将值保存在显示的3个自定义元框(在该分类法后端添加/编辑页面)中
并保存Post ID
以update_option()
供以后使用。
阅读编辑后的版本并被管理员接受后,该帖子将替换为您在functions.php中编码的原始帖子。
嗯,这相当复杂,正确的答案将花费大量时间来编写。所以这只是一些想法,不是一个真正的答案。
wp_update_post
通过ajax使用WordPress内置功能将为您提供所需的修订历史记录,但不能提供批准编辑所需的功能。
默认情况下,无法通过编辑创建草稿,但已在此处进行了讨论。是否可以草拟已发布页面或帖子的修订版?您使用了什么解决方法?
您可以尝试使用前端编辑器,但无法控制正在发布的编辑,因此请尝试使用另一个插件(如Revisionary)将其混搭,该插件允许基于权限的编辑,我不知道它们是否可以一起使用。
如果他们不这样做,您将不得不基于上述两个插件破解一个插件,或者从头开始编写一些东西。
我的临时方法是使按钮转到另一个页面,该页面使用JSON输出帖子内容/数据,这在使用Ajax和WYSIWYG编辑器时更容易使用。保存按钮将作为草稿而不是发布发布,这样您就可以控制编辑(请参见上面关于如何完成此操作的WPSE讨论,这相当艰巨)。
执行此操作时还会带来其他复杂问题,例如清理,编码,垃圾邮件,媒体处理,自定义字段,时间戳,内存等。好消息是wordpress已经具有您可以插入的修订系统,并且具有处理多个编辑者的良好能力。
ps。对于插件来说,这是一个好主意。