私は自分のウェブサイトのユーザーがページの編集を提案できるようにするというアイデアが好きです。Stack Exchangeの編集システムによく似ていますが、登録ユーザーだけでなく誰でも編集できる必要があるという点で異なります。すべての編集は承認プロセスを経ます。
どうすれば実装できますか?
私は自分のウェブサイトのユーザーがページの編集を提案できるようにするというアイデアが好きです。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
、単一のポストループ中に、元のデータまたは新しいデータのいずれかを含むを返しました。このようにして、変更を確認する必要のない他のすべての投稿値を設定することに動きました。
投稿コンテンツのコピー編集を(一時的に)保存できる場所を検索する際に留意しなければならない主な事実は、コンテンツがの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
。この場合、デフォルト値のカスタム分類にリンクされたテキストボックス(エディターを使用する場合があります)を使用します。
への変更は、PHP inline-diffパッケージまたはText-Diff PEARパッケージなどの Diffアルゴリズムを使用して(ドラフトとして)送信および入力した後、または CSSの組み合わせで長すぎないテキストに対してこれに応じてPHP関数を使用した後content
に比較さoriginal post content
れます。CAPTCHA code
次に、値を3つのカスタムメタボックス(その分類バックエンドの追加/編集ページ)に保存することにより、
あとで使用するためPost ID
のupdate_option()
機能で保存することもできます。
編集されたバージョンを読み、管理者に受け入れられた後、その投稿は、functions.phpでコーディングした元の投稿に置き換えられます。
まあ、これはかなり複雑です。適切な答えを書くにはかなりの時間がかかります。したがって、これは単なる考えではなく、本当の答えではありません。
ajaxwp_update_post
経由でWordPressビルドを使用すると、必要な改訂履歴が得られますが、編集の承認に必要な機能は得られません。
編集から下書きを作成することはデフォルトでは不可能ですが、ここで説明しました。公開されたページまたは投稿のリビジョンを下書きする方法はありますか?どの回避策を使用しましたか?
フロントエンドエディターを試して使用することはできますが、公開されている編集を制御することはできません。したがって、権限ベースの編集を許可するRevisionaryなどの別のプラグインで試してみて、それらが一緒に機能するかどうかわかりません。
そうでない場合、上記の2つのプラグインに基づいてプラグインをハッキングするか、ゼロから何かを記述する必要があります。
私のスクラッチアプローチは、JSONを使用して投稿コンテンツ/データを出力する別のページに移動するボタンを使用することです。これは、AjaxエディターとWYSIWYGエディターを使用する場合により簡単です。保存ボタンは、公開ではなくドラフトとして投稿し、その方法で編集を制御できます(これを達成する方法に関する上記のWPSEの議論を参照してください、それはかなり困難です)。
これを行うと、サニタイズ、エンコーディング、スパム、メディア処理、カスタムフィールド、タイムスタンプ、メモリなど、さらに複雑な問題が発生します。 。
追伸 これはプラグインにとって良い考えです。