제안 된 수정 사항을 사용하는 방법은 무엇입니까?


19

내 웹 사이트 사용자가 페이지에 대한 수정 사항을 제안하도록하는 아이디어가 마음에 듭니다. Stack Exchange의 편집 시스템과 비슷하지만 등록 된 사용자뿐만 아니라 누구나 편집 할 수 있어야한다는 점이 다릅니다. 모든 편집은 승인 프로세스를 거칩니다.

어떻게 구현할 수 있습니까?


1
나는 그것을하는 방법을 모른다. 그러나 나는 이것이 정말로 문제가 될 수 있다고 생각한다. 스팸이 많이 생길 것 같습니다.
Martin Thoma

3
웹 사이트에 워드 프레스 설치가 필요하십니까? 원하는 기능은 MediaWiki 설치 와 매우 비슷 합니다. 두 설치의 장단점을 고려해야합니다. MediaWiki는 좋은 대안입니다.
Marc Dingena

나는이 생각으로 잠시 뒤로 튀어 오르고있었습니다. 사용할 수있는 솔루션에 가장 가까운이 플러그인이었다 wordpress.org/support/plugin/post-forking 이 글은 그러나이다 매우 초기 단계. 플러그인은 등록 된 사용자로 제한됩니다.
Christine Cooper

우리는 이런 식으로 노력하고 있습니다. 우리는 게시물에 대한 위키피디아 스타일의 편집을 "히스토리"위젯과 함께 구상했습니다 : github.com/publishpress/Revisionary/issues/13 우리는 아직 없지만 거의 모든 구조가 갖추어져 있습니다.
steveburge

답변:


11

게시물 내용, 제목 및 저자를 차별화

몇 달 전에 관련된 일을해야했던 것처럼 콘텐츠 또는 제목에 변경 사항이 있는지 또는 저자가 변경되었는지 확인하는 가장 쉽고 가장 확실한 증거 방법은 다음과 같습니다.

// 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_approved0add_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를 식별하는 것은 간단합니다.

최종 메모

최종 플러그인도보고 싶습니다. 여기에 연결하십시오 :)


1
의견 메타를 사용하여 제안 된 편집 내용을 저장 wp_text_diff()하고 실제 비교 하는 아이디어에 대해이 질문에 현상금을 제공합니다 . 다른 답변을지지합니다.
fuxia

8

내 생각은 간단하다.

  • Edit Suggestion사용자 정의 정의 된 템플릿이있는 게시물의 맨 아래에 기본값이 인 사용자 지정 분류 체계에 연결된 텍스트 상자 (편집기와 함께)를 사용 하는 링크를 만들 수 있습니다 post content.

  • 모든 변경 사항 content에 비교됩니다 original post content(초안으로) 제출 및 입력 후 CAPTCHA code같은 DIFF 알고리즘을 PHP 인라인-DIFF 패키지 또는 텍스트-DIFF PEAR 패키지 또는 다른 방법에 따른 PHP 함수를 사용하여 CSS의 조합으로 너무 긴 텍스트에 대한합니다.

  • 그런 다음 표시되는 3 개의 사용자 정의 메타 박스 (해당 분류 백엔드 추가 / 편집 페이지)에 값을 저장하여

    1. 원본 내용
    2. 편집 된 버전
    3. 사용자 닉네임과 그의 이메일

    나중에 사용할 수 Post ID있는 update_option()기능으로 저장 하는 것도 가능 합니다.

  • 수정 된 버전을 읽고 관리자가 승인 한 후에는 해당 게시물이 functions.php에서 코딩 한대로 원래 게시물로 바뀝니다.


몇 가지주의 사항 : (A) "functions.php로 코딩 할 때" -이것에 동의하지 않습니다. 플러그인 자료입니다. (B) "포스트 컨텐츠의 기본값을 가진 사용자 정의 분류 체계에 연결됨" -분류 용어 / 택슨 은 컨텐츠가 어떤 경우에도 적합한 하나의 가능한 값을 갖습니다. 그런 다음 게시물 ID를 저장할 장소가 필요합니다. 이것은 어디에 있습니까? WP 세금 시스템의 한계로 인해 이에 대한 자리가 없기 때문에 용어 ID 만 저장할 수 있습니다. 그런 다음 이것은 (제한된) 단방향 시스템입니다 : Post> Term data.
카이저

4

글쎄, 이것은 다소 복잡합니다. 적절한 답변을 작성하는 데 상당한 시간이 걸립니다. 따라서 이것은 단지 몇 가지 생각에 대한 진정한 대답이 아닙니다.

ajaxwp_update_post통해 WordPress 빌드를 사용 하면 필요한 수정 히스토리가 제공되지만 편집을 승인하는 데 필요한 기능은 제공되지 않습니다.

기본적으로 편집에서 초안을 작성하는 것은 불가능하지만 여기서 논의 했습니다. 게시 된 페이지 또는 게시물의 개정 초안을 작성하는 방법이 있습니까? 어떤 해결 방법을 사용 했습니까?

프런트 엔드 편집기를 사용 해보고 사용할 수는 있지만 게시 된 편집 내용을 제어 할 수는 없으므로 권한 기반 편집을 허용하는 Revisionary 와 같은 다른 플러그인을 사용하여 매시업하십시오 .

그렇지 않으면 위의 2 가지 플러그인을 기반으로 플러그인을 해킹하거나 처음부터 무언가를 작성해야합니다.

내 스크래치 접근법은 JSON을 사용하여 게시물 내용 / 데이터를 출력하는 다른 페이지로 이동하는 버튼을 사용 하는 것입니다 .Ajax 및 WYSIWYG 편집기를 사용할 때 작업하기가 더 쉽습니다 . 저장 버튼은 게시 대신 초안으로 게시되며 편집 내용을 제어 할 수있는 방식으로이 작업을 수행하는 방법에 대한 위의 WPSE 토론을 참조하십시오.

위생 처리, 인코딩, 스팸, 미디어 처리, 사용자 정의 필드, 타임 스탬프, 메모리 등과 같은 추가 합병증이 있습니다. 워드 프레스에는 이미 연결할 수있는 수정 시스템과 여러 편집기를 처리 할 수있는 적절한 기능이 있습니다. .

추신. 이것은 플러그인에 대한 좋은 아이디어입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.