Bir taslak yayını herkes için nasıl erişilebilir hale getiririm?


13

Wordpress web sitemde birkaç yayınlanmamış mesajım var ve normal kullanıcılara () giriş yapmamış olan normal kullanıcılar için erişilebilir hale getirmeye çalışıyorum site.com/post-here. Bunun en iyi uygulama olmadığını anlıyorum ama özel amacım için bunun yapılması gerekiyor.

Aşağıdaki kod snippet'i dosyama eklemeyi denedim functions.php:

function enable_view_drafts() {
$role = get_role( 'subscriber' ); 
$role->add_cap( 'read_private_posts' ); 
$role->add_cap( 'edit_posts' );
}
add_action( 'after_setup_theme', 'enable_view_drafts');

Ben de inityerine kanca denedim after_setup_theme. Şanssız.

Anladığım kadarıyla rollerdeki değişiklikler veritabanına kaydedilir, bu yüzden sadece bir kez yapılması gerekir. Bu yüzden after_setup_themeişlevi çağırmak için kanca kullanıyorum .

Ancak sayfaya normal kullanıcı olarak erişmeye çalıştığımda, yazı içeriğini göstermek yerine 404 sayfası gösteriliyor. Ayrıca önizleme URL'sini ( site.com/?p=212&preview=true) yüklemeyi denedim ancak bu da çalışmadı.

Bunlar benim tahminlerim:

  • normal kullanıcının capstaslak gönderisini okumak için yeterli değeri yoktur .
  • taslak yayınların ön uçta test edilmesi ve görüntülenmesi hiçbir kullanıcı için (yöneticiler dahil) mümkün değildir.

Yapmaya çalıştığım şeyi başarmak için ne gibi değişiklikler yapmam gerekiyor? Mümkün değilse, hangi alternatif çözümleri önerirsiniz?

Not: Eklenti tabanlı çözümler için aramıyorum.


2
Bence burada biraz karışıklık var. Birisi kendisinden, oturum değilse / o olduğunu değil o / o vardır bu nedenle, bir kullanıcı değil herhangi kapaklar. Aboneler onlar kayıtlı olması gerekiyor ve giriş aboneleri olarak kabul edilecek hale böylece, kullanıcılardır. Oturum açmamış birine yetenek veremezsiniz. Oturum açmamış birisinin yayınlarınızı görüntülemesini istiyorsanız, yayınlanmış yayınlardan hiç de farklı değildir. Peki, neden yayınlanmıyor? Veya abonelere taslak göstermek mi istiyorsunuz (abone olarak giriş yaptınız)?
gmazzap

@GM: Ben yapmaya çalışıyorum yayınlanmamış mesaja direkt kalıcı bağlantı bilen herkese mesajlar erişilebilir. Tuhaf bir gereklilik gibi görünebilir, ancak bir proje için buna ihtiyacım var. Sorumda belirttiğim gibi, eğer bu mümkün değilse - başka çözümler önerebilir misiniz (tabii ki tanıyorsanız)?
Amal Murali

@GM: Bunu yapan bir eklenti biliyor musunuz?
Amal Murali

Aşağıdaki cevabı 3 yukarı oyla okudunuz mu? Nasıl yapılacağını açıklar ve cevabın sonunda github'dan tam bir çalışma eklentisi indirmek için bir bağlantı bulursunuz.
gmazzap

2
Daha sonraki okuyucular için: GitHub'da Dominik Schilling'in bu eklentisi var .
kaiser

Yanıtlar:


12

Bilinmeyen kullanıcılara yetenek atayamazsınız. Bir yayını herkes için görünür yapmak istiyorsanız, bu yayınlar için ayrı bir URL oluşturun ve yalnızca seçilen yayınlarda önizlemeyi etkinleştirmek için yayın düzenleyicisine bir kontrol öğesi ekleyin.
Böyle bir URL çağrıldığında, yayın için bir önizlemeye izin verilip verilmediğini ve yayının henüz yayınlanmadığını kontrol edin. Ayrıca, arama motorlarının bu URL'yi yok saydığından emin olun.

URL için bir bitiş noktası kullanırdım :

add_rewrite_endpoint( 'post-preview', EP_ROOT );

Artık aşağıdaki gibi URL'ler oluşturabilirsiniz ...

http://example.com/post-preview/123

123Posta kimliği nerede .

Ardından posta kimliğini incelemek için bir geri arama işleyicisi kullanın, geçerli olup olmadığını kontrol edin ve ana sorgunun üzerine yazın. Bu muhtemelen tek kabul edilebilir kullanım durumudur query_posts(). :)

Son noktanın bir sınıf T5_Endpoint(model) ve çıktı işleyicisinin, T5_Render_Endpointmodeli daha önce geçiren bir sınıf (görünüm) olduğunu varsayalım . Sonra muhtemelen render()denilen bir yöntem var template_redirect:

public function render()
{
    $post_id = $this->endpoint->get_value();

    if ( ! $post_id )
        return;

    if ( 1 !== $this->meta->get_value( $post_id )
        or 'publish' === get_post_status( $post_id )
        )
    {
        wp_redirect( get_permalink( $post_id ) );
        exit;
    }

    $query = array (
        'suppress_filters' => TRUE,
        'p'                => $post_id,
        'post_type'        => 'any'
    );

    query_posts( $query );

    add_action( 'wp_head', 'wp_no_robots' );
}

$this->metaT5_Post_Metaönizlemeye izin verilip verilmediğini kontrol eden meta sonrası değeri için başka bir modeldir (sınıf ). Denetim, aynı meta sınıfı alan başka bir görünüm tarafından oluşturulan Yayınla kutusuna ( eylempost_submitbox_misc_actions ) ayarlanır .

ekran görüntüsü

Bu nedenle T5_Post_Metameta değeri nerede ve ne zaman saklayacağını bilir, görünümler onunla bir şeyler yapar.
Ayrıca, yayın yayınlandığında yayın meta alanını silmek için bağlantıyatransition_post_status geçin. Kaynakları israf etmek istemiyoruz, değil mi?

Bu sadece bir taslak. Ele alınacak birçok detay var… Bunun nasıl uygulanacağını gösteren küçük bir eklenti yazdım: T5 Public Preview .


Çok teşekkür ederim. Sonunda hedefime bazı ince ayarlarla ulaştım. Muhteşem. : D
Amal Murali

6

Bu sorunu, @ toscho'nun yukarıdaki cevabından daha basit bir şekilde düşündüğüm şekilde çözdüm.

Benim kullanım durumum, dahili bir intranet hazırlama sitesi ve halka açık bir site için aynı veritabanını kullanıyorum ve iş akışı, yazarların taslaklar yazması ve yayınlamadan önce bu taslakları görüntüleyen diğer kullanıcılarla paylaşmasıdır. Özellikle gözden geçirenlerin taslakları görmek için giriş yapmak istemiyordu, bu yüzden ben sadece ENV_PRODUCTIONhostp dayalı wp-config dosyasında ayarlanan bir sabit bağlı $_SERVER['SERVER_NAME']. ENV_PRODUCTIONBurada kontroller yapılıyor; üretim yeri görüntüleniyorsa tüm bu filtreleri kısaltmak.

Bu biraz garip, çünkü WP_Query $ wp_query-> posts dizisindeki tüm mesajları kaldırdıktan sonra takmanız gerekiyor, ancak bana istikrarlı ve güvenli görünüyor.

/*
 * On staging site home and archives, drafts should be visible.
 */
function show_drafts_in_staging_archives( $query ) {
    if ( ENV_PRODUCTION )
        return;

    if ( is_admin() || is_feed() )
        return;

    $query->set( 'post_status', array( 'publish', 'draft' ) );
}

add_action( 'pre_get_posts', 'show_drafts_in_staging_archives' );


/*
 * Make drafts visible on staging site single views.
 *
 * (Because on single views, WP_Query goes through logic to make sure the 
 * current user can edit the post before displaying a draft.)
 */
function show_single_drafts_on_staging( $posts, $wp_query ) {
    if ( ENV_PRODUCTION )
        return $posts;

    //making sure the post is a preview to avoid showing published private posts
    if ( ! is_preview() )        
        return $posts;

    if ( count( $posts ) )
        return $posts;

    if ( !empty( $wp_query->query['p'] ) ) {
        return array ( get_post( $wp_query->query['p'] ) );
    }
}

add_filter( 'the_posts', 'show_single_drafts_on_staging', 10, 2 );

Filtrelerin iki ayrı parçası vardır.

  • "Pre_get_posts" kancasındaki bir filtre, varsayılan post_status'u hazırlama sitesinde 'yayınla, taslak' olarak ayarlar. Bu, arşiv listelerindeki taslak yayınları döndürür.
  • WP_Query sınıfında, geçerli kullanıcı bunları düzenleyemediği sürece taslak yayınları sorgu sonuçlarından kaldırmak için tek bir mantık için ayrı bir filtre gereklidir. Ben 'the_posts' filtreleme ve sonuçlara hemen geri istediğim yazı ekleyerek bu var.

2
Bu inanılmaz , bunu paylaştığın için çok teşekkür ederim. Kesinlikle mükemmel ve tam olarak ne gerekli.
Christian

Bu kodu nereye koyacağım? (hangi dosya (lar)?)
Joelio

@Joelio Çözdüğünüz soruna özgü olabilir misiniz? Basit bir yaklaşım olarak, bu kodu benim function.php dosyasına ekledim ve wp-config.php dosyasına istek etki alanına bağlı olarak ENV_PRODUCTION sabitini true veya false olarak ayarlayan basit bir tanım ekledim.
goldenapples

@goldenapples Bu kod parçasını function.php dosyasına ekledim, wp-config'e ne eklemeliyim? Yardımınız için teşekkürler
Graham Slick

@MatthiasGrahamSlick - Üretimde ENV_PRODUCTIONsabit olmanız gereken bir şeye ihtiyacınız var . Üretim için domain.com'u ve sahneleme için staging.domain.com'u kullanıyordum, bu yüzden hattım define( 'ENV_PRODUCTION', false === stripos( $_SERVER['HTTP_HOST'], 'staging' ) );yardımcı oldu mu?
goldenapples

0

Bence WordPress.org'un web sitesinde bulunan "Kullanıcı Rolü Editörü" eklentisi aradığınız şey olabilir. Bu arada, taslaklarınıza neden herkese erişim vermek istiyorsunuz? Şahsen bunun gerekli olacağı bir örneği düşünemiyorum.


Hayır, soruda belirtildiği gibi, eklenti tabanlı çözümler aramıyorum. Usecase biraz karmaşık ama eminim bu yapmaya çalışıyorum bu belirli görev için en iyi çözümdür . :-)
Amal Murali

Sebebi de şaşırttı. Herkesin yayını görmesini istiyorsanız, neden yayını yayınlamıyorsunuz? Tanımlamak isteyebileceğiniz herhangi bir özel durumu izlemek için yayındaki özel alanları kullanabilirsiniz.
KenB

Kullanıcıların içeriği görmesine izin veriyorum, ancak belirli bir nedenden dolayı yayınların yayınlanmasını istemiyorum.
Amal Murali

0

Sayfadaki / yayındaki görünürlüğü yalnızca Editörler ve Yöneticiler tarafından görülebilen ve herkese açık ziyaretçiler, arama motorları, rss yayınları vb. İçin değil "Özel" olarak değiştirebilirsiniz.


0

Bence GM'nin yorumu burada en iyisi. Aşağıdakileri yapmaya çalıştığınızı varsayıyorum:

  1. Bir yazı yazın
  2. Taslak olarak kaydet
  3. Harici (oturum açmamış) bir kullanıcının taslağı onay için görüntülemesine izin ver
  4. Yayınla

Bu doğru mu?

Ne yazık ki, bunu yapmanın basit bir yolunu düşünemiyorum. Özel bir gönderi olarak gönderebilirsiniz, böylece görüntülemek için bir şifre girmeleri gerekir, ancak bunun için giriş yapmanız gerekir. Ayrıca parolayı koruyabilirsiniz, ancak yine de feed'inizde ve son gönderiler vb.

Daha fazla bilgi için burayı okuyun: http://codex.wordpress.org/Content_Visibility

Alternatif olarak, ihtiyaçlarınıza uygun bir eklenti var: http://wordpress.org/extend/plugins/shareadraft/ Koda hızlıca baktım ve geliştiricinin get_post_status tarafından döndürülen değeri değiştirdiği anlaşılıyor. bununla oynayabilir:

http://codex.wordpress.org/Function_Reference/get_post_status

HTH


0

Gönderinin "yayınlanmış" olup olmadığını umursamıyorsanız, normal yayınlanmış URL'den herkes tarafından erişilebilir olmasını ve ana sayfada / arama sonuçları / rss yayınlarında vb. Görünmemesini istiyorsanız, bu eklenti WP 4.6 ile çalıştı. 1 ve bir yayının göründüğü yeri ince ayarlamanıza olanak tanır:

https://wordpress.org/plugins/wp-hide-post/

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.