問題描述
我喜歡讓我的網站的任何用户建議對頁面進行修改的想法。很像 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 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。