Önerilen düzenlemeler nasıl etkinleştirilir?


19

Web sitemin herhangi bir kullanıcısının bir sayfada düzenlemeler önermesini sağlama fikrini seviyorum. Stack Exchange'deki düzenleme sistemine çok benzer, ancak herkes sadece kayıtlı kullanıcıları değil, düzenleme yapabilmelidir. Tüm düzenlemeler bir onay sürecinden geçer.

Bunu nasıl uygulayabilirim?


1
Nasıl yapılacağını bilmiyorum, ama bence bu gerçekten sorunlu olabilir. Bence çok fazla spam alacaksınız.
Martin Thoma

3
Web siteniz için bir WordPress kurulumuna ihtiyacınız olduğundan emin misiniz? İstediğiniz işlevsellik bir MediaWiki yüklemesine çok benziyor . Her iki kurulumun da artılarını ve eksilerini tartmalısınız. MediaWiki iyi bir alternatiftir.
Marc Dingena

Bir süre önce bu fikirle zıplıyordum. Mevcut bir çözüme en yakın olan bu eklentiydi: wordpress.org/support/plugin/post-forking Ancak çok erken aşamalarda. Eklenti kayıtlı kullanıcılarla sınırlıdır.
Christine Cooper

Biz böyle bir şeye doğru çalışıyoruz. Bir "Tarih" widget'ıyla birlikte yayınlar için Wikipedia tarzı düzenlemeyi öngörmüştük: github.com/publishpress/Revisionary/issues/13 Henüz orada değiliz, ancak neredeyse tüm yapı yerinde.
steveburge

Yanıtlar:


11

Yazı içeriğini, başlığı ve yazarı farklılaştırın

Bir ay önce ilgili bir şey yapmak zorunda kaldığımız gibi, işte içerikte veya başlıkta bir değişiklik olup olmadığını veya yazarın değişip değişmediğini kontrol etmek için en kolay ve gelecekteki kanıt yolu (iyi olabilirim):

// 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'];

Senaryomu kısaca açıklamak için: Uzak bir konumdan uzak bir API yoluyla yayın alıyordum. Daha sonra global $post, orijinal verileri veya yeni verileri içeren tek bir yazı döngüsü sırasında, döndüm . Bu şekilde, değişiklikleri kontrol etmem gerekmeyen diğer tüm posta değerlerini ayarlayarak dolaştım.

Düzenlemeyi önerme

Gönderi içeriğinin bir kopya-düzenlemesinin (geçici olarak) kaydedilebileceği bir yer ararken akılda tutulması gereken ana gerçek, içeriğin bir db girişi olmasıdır longtext. Dolayısıyla, önerilen düzenlemeyi kaydetmek istediğiniz yer bu gereksinimi karşılamalıdır. Yorumlar bunu yapar.

Sonra onları güzel bir döngü içine yerleştirmek için bir API sundukları güzel bir gerçek var, bu yüzden sorunsuz bir şekilde entegre oluyor, son derece özelleştirilebilir ve hızlı bir şekilde kurulabilir. Son olarak, çoğu tema zaten entegre yorumlarla birlikte gelir, bu nedenle sistemde piggyback yapmak ve neredeyse mevcut herhangi bir temaya bağlanmak kolaydır.

Yorum formunu sadece (ya da) uzatmanızı ya da değiştirmenizi öneririm. Aşağıdakilerden birini kullanın veya çağrılı çağrıyla ek alanlar ekleyin 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
}

Bu yüzden sıraya ayarlamak için değeri olan bir hiddenalan ekledim . Bunun işe yarayıp yaramayacağından ya da bu (çekirdek) değerin aslında yorum meta verileri olup olmadığından ve kaydetme sırasında kullanarak eklenmesi gerekip gerekmediğinden emin değilim . Değilse, bir şey kullanabilirsiniz boyunca aşağıdaki kod satırlarını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 );
}

Yorumları yönetici tarafında görüntüleme

Burada basit bir sınıf uzantısı ve özel bir yönetici sayfası ile giderdim:

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
}

Daha fazla bilgi WPEngineer'da bulunabilir .

Düzenlemeleri onaylama

Daha sonra, özel eylemler ekleyebilir ve değişiklik olup olmadığını kontrol etmek için gösterdiğim ilk kodu kullanarak önerilen düzenlemeleri işleyebilir ve daha sonra yayını güncelleyebilirsiniz. Yorumun kendisi anahtarlı bir değer içerir comment_post_ID, bu nedenle düzenlenen yayın kimliğini tanımlamak basittir.

Son not

Son eklentiyi de görmek istiyorum. Lütfen buraya bağlayın :)


1
Önerilen düzenlemeyi saklamak için yorum meta kullanma fikri wp_text_diff()ve gerçek karşılaştırma için bu soruya ödül veriyorum . Diğer cevaplar için oylar.
fuxia

8

Benim fikrim basit bir şey.

  • Bir yapabilir Edit Suggestionvarsayılan değeri ile özel bir taksonomisinde bağlı olan o kullanımda, (belki bir editör ile) bir metin kutusu özel tanımlı şablonu olan mesajların alt kısmındaki bağlantıyı post content.

  • Herhangi bir değişiklik contentkıyasla edilecektir original post content(Taslak gibi) sunulması ve girilmesi sonrasında CAPTCHA codegibi Diff algoritmalar ile PHP inline-diff paketin veya Text-Diff ARMUT Paketi veya alternatif olarak uygun bir PHP fonksiyonu kullanılarak bu CSS kombinasyonu ile değil de uzun metinler için.

  • Ardından, değerleri gösteren 3 özel Meta Kutusuna (bu sınıflandırma arka uç ekleme / düzenleme sayfasına) değerler kaydederek

    1. Orijinal İçerik
    2. Düzenlenmiş versiyon
    3. Kullanıcı takma adı ve E-postası

    ve Post IDbelki update_option()daha sonra kullanmak üzere bir işlevle kaydetme .

  • Düzenlenmiş sürümü okuduktan ve yönetici tarafından kabul ettikten sonra, bu gönderi, function.php dosyasında kodlandıkça orijinal olanın yerini alacaktır.


Bazı notlar: (A) "function.php içinde kodladığınız gibi" - bunu kabul etmeyin. Bu eklenti malzemesidir. (B) "varsayılan içerik sonrası değere sahip özel bir sınıflandırma ile bağlantılı" - Bir sınıflandırma terimi / takson , içeriğin her durumda sığabileceği tek bir olası değere sahiptir: Açıklama. Ardından, posta kimliğini depolamak için bir yere ihtiyacınız olacaktır. Bu nerede olurdu? WP vergi sisteminin sınırları nedeniyle bunun için bir yer olmadığından, yalnızca kimlik kimliğini kaydedebilirsiniz. O zaman bu sadece (sınırlı) tek yönlü bir sistemdir: Post> Term data.
kaiser

4

Bu oldukça karmaşık, doğru bir cevabın yazılması oldukça zaman alacaktır. Yani bu sadece bazı düşünceler için gerçek bir cevap değil.

WordPress derlemesini ajaxwp_update_post aracılığıyla kullanmak , size gerekli düzeltme geçmişini verir, ancak düzenlemeleri onaylamak için gereken yeteneği sağlamaz.

Düzenlemelerden taslaklar oluşturmak varsayılan olarak mümkün değildir, ancak burada tartışılmıştır, Yayınlanmış bir sayfanın veya yayının revizyonunu yapmanın herhangi bir yolu var mı? Hangi geçici çözümleri kullandınız?

Ön Uç Düzenleyiciyi deneyebilir ve kullanabilirsiniz, ancak yayınlanan düzenlemeler üzerinde hiçbir kontrole sahip olmayacaksınız, bu yüzden Revizyonary gibi izinlere dayalı düzenlemelere izin veren başka bir eklenti ile deneyin ve birlikte çalışacaklarsa hiçbir fikrim yok.

Eğer yapmazlarsa yukarıdaki 2 eklentiye dayalı bir eklentiyi hacklemeniz veya sıfırdan bir şey yazmanız gerekecektir.

Sıfırdan yaklaşımım, Ajax ve WYSIWYG editörlerini kullanırken çalışmak daha kolay olan JSON kullanarak yayın içeriği / verilerini çıkaran başka bir sayfaya giden bir düğmeye sahip olmak olacaktır . Kaydet düğmesi yayınlamak yerine taslak olarak yayınlanır ve bu şekilde düzenlemeler üzerinde kontrol sahibi olursunuz (bunun nasıl yapılacağı ile ilgili WPSE tartışmasına bakın, oldukça ürkütücüdür).

Bunu yaparken dezenfeksiyon, kodlama, spam, medya kullanımı, özel alanlar, zaman damgaları, bellek, vb. Gibi ek komplikasyonlar var. .

ps. Bu bir eklenti için iyi bir fikir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.