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