내 웹 사이트 사용자가 페이지에 대한 수정 사항을 제안하도록하는 아이디어가 마음에 듭니다. 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
.
모든 변경 사항 content
에 비교됩니다 original post content
(초안으로) 제출 및 입력 후 CAPTCHA code
같은 DIFF 알고리즘을 PHP 인라인-DIFF 패키지 또는 텍스트-DIFF PEAR 패키지 또는 다른 방법에 따른 PHP 함수를 사용하여 이 CSS의 조합으로 너무 긴 텍스트에 대한합니다.
그런 다음 표시되는 3 개의 사용자 정의 메타 박스 (해당 분류 백엔드 추가 / 편집 페이지)에 값을 저장하여
나중에 사용할 수 Post ID
있는 update_option()
기능으로 저장 하는 것도 가능 합니다.
수정 된 버전을 읽고 관리자가 승인 한 후에는 해당 게시물이 functions.php에서 코딩 한대로 원래 게시물로 바뀝니다.
글쎄, 이것은 다소 복잡합니다. 적절한 답변을 작성하는 데 상당한 시간이 걸립니다. 따라서 이것은 단지 몇 가지 생각에 대한 진정한 대답이 아닙니다.
ajax 를 wp_update_post
통해 WordPress 빌드를 사용 하면 필요한 수정 히스토리가 제공되지만 편집을 승인하는 데 필요한 기능은 제공되지 않습니다.
기본적으로 편집에서 초안을 작성하는 것은 불가능하지만 여기서 논의 했습니다. 게시 된 페이지 또는 게시물의 개정 초안을 작성하는 방법이 있습니까? 어떤 해결 방법을 사용 했습니까?
프런트 엔드 편집기를 사용 해보고 사용할 수는 있지만 게시 된 편집 내용을 제어 할 수는 없으므로 권한 기반 편집을 허용하는 Revisionary 와 같은 다른 플러그인을 사용하여 매시업하십시오 .
그렇지 않으면 위의 2 가지 플러그인을 기반으로 플러그인을 해킹하거나 처음부터 무언가를 작성해야합니다.
내 스크래치 접근법은 JSON을 사용하여 게시물 내용 / 데이터를 출력하는 다른 페이지로 이동하는 버튼을 사용 하는 것입니다 .Ajax 및 WYSIWYG 편집기를 사용할 때 작업하기가 더 쉽습니다 . 저장 버튼은 게시 대신 초안으로 게시되며 편집 내용을 제어 할 수있는 방식으로이 작업을 수행하는 방법에 대한 위의 WPSE 토론을 참조하십시오.
위생 처리, 인코딩, 스팸, 미디어 처리, 사용자 정의 필드, 타임 스탬프, 메모리 등과 같은 추가 합병증이 있습니다. 워드 프레스에는 이미 연결할 수있는 수정 시스템과 여러 편집기를 처리 할 수있는 적절한 기능이 있습니다. .
추신. 이것은 플러그인에 대한 좋은 아이디어입니다.