ฉันจะทำให้ทุกคนสามารถเข้าถึงโพสต์ฉบับร่างได้อย่างไร


13

ฉันมีโพสต์ที่ไม่ได้เผยแพร่หลายโพสต์ในเว็บไซต์ Wordpress ของฉันและฉันพยายามทำให้ผู้ใช้ทั่วไป (ที่ไม่ได้เข้าสู่ระบบ) สามารถเข้าถึงได้โดยใช้ post slugs ( site.com/post-here) ฉันเข้าใจว่าอาจไม่ใช่วิธีปฏิบัติที่ดีที่สุด แต่เพื่อจุดประสงค์พิเศษของฉันสิ่งนี้จำเป็นต้องทำ

ฉันได้ลองเพิ่มข้อมูลโค้ดต่อไปนี้ใน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');

ฉันได้พยายามยังเบ็ดแทนinit after_setup_themeไม่มีโชค.

ความเข้าใจของฉันคือการเปลี่ยนแปลงบทบาทจะถูกบันทึกลงในฐานข้อมูลดังนั้นจะต้องทำเพียงครั้งเดียว นั่นคือเหตุผลที่ฉันใช้after_setup_themehook เพื่อเรียกใช้ฟังก์ชัน

แต่เมื่อฉันพยายามเข้าถึงหน้านี้ในฐานะผู้ใช้ทั่วไปฉันกำลังแสดงหน้า 404 แทนที่จะแสดงเนื้อหาของโพสต์ ฉันได้ลองโหลด URL ตัวอย่าง ( site.com/?p=212&preview=true) แล้ว แต่ก็ไม่ได้ผล

นี่คือการคาดเดาของฉัน:

  • ผู้ใช้ปกติมีไม่เพียงพอที่capsจะอ่านโพสต์แบบร่าง
  • การทดสอบและการดูโพสต์แบบร่างบนส่วนหน้าเป็นไปไม่ได้สำหรับผู้ใช้ (รวมถึงผู้ดูแลระบบ)

ฉันต้องทำการเปลี่ยนแปลงอะไรเพื่อที่จะบรรลุสิ่งที่ฉันพยายามทำ หากเป็นไปไม่ได้คุณจะแนะนำวิธีแก้ปัญหาอะไรอีกบ้าง

หมายเหตุ:ฉันไม่ได้มองหาโซลูชันที่ใช้ปลั๊กอิน


2
ฉันคิดว่ามีความสับสนเล็กน้อยที่นี่ หากใครบางคนไม่ได้เข้าสู่ระบบเขา / เธอไม่ใช่ผู้ใช้ดังนั้นเขา / เธอไม่มีตัวพิมพ์ใหญ่ สมาชิกเป็นผู้ใช้ดังนั้นพวกเขาจะต้องมีการลงทะเบียนและทำให้การเข้าสู่ระบบได้รับการยอมรับในฐานะสมาชิก คุณไม่สามารถให้ความสามารถกับคนที่ไม่ได้เข้าสู่ระบบหากคุณต้องการให้ทุกคนที่ไม่ได้เข้าสู่ระบบดูโพสต์ของคุณจะไม่แตกต่างจากโพสต์ที่เผยแพร่ ดังนั้นทำไมไม่เผยแพร่มัน หรือคุณต้องการที่จะแสดงร่างให้สมาชิก (เข้าสู่ระบบในฐานะสมาชิก)?
gmazzap

@GM: ฉันพยายามทำให้ทุกคนที่รู้โพสต์ลิงก์ที่ไม่ได้เผยแพร่สามารถเข้าถึงโพสต์ที่ไม่ได้เผยแพร่ได้ มันอาจดูเหมือนเป็นสิ่งที่แปลก แต่ฉันต้องการมันสำหรับโครงการ ดังที่ฉันได้กล่าวถึงในคำถามของฉันหากไม่สามารถทำได้ - คุณสามารถแนะนำการแก้ไขอื่น ๆ (ถ้าคุณรู้จักแน่นอน)
Amal Murali

@GM: คุณรู้จักกับปลั๊กอินที่ทำเช่นนั้น?
Amal Murali

คุณอ่านคำตอบด้านล่างด้วย 3 upvotes แล้วหรือยัง? มันอธิบายวิธีการทำและในตอนท้ายของคำตอบคุณจะพบลิงค์เพื่อดาวน์โหลดปลั๊กอินที่ใช้งานได้เต็มรูปแบบจาก github
gmazzap

2
สำหรับผู้อ่านในภายหลัง: มีปลั๊กอินนี้โดย Dominik Schillingบน GitHub
ไกเซอร์

คำตอบ:


12

คุณไม่สามารถกำหนดความสามารถให้กับผู้ใช้ที่ไม่รู้จัก หากคุณต้องการให้ทุกคนเห็นโพสต์ให้สร้าง URL แยกต่างหากสำหรับโพสต์เหล่านี้และเพิ่มองค์ประกอบการควบคุมในเครื่องมือแก้ไขโพสต์เพื่อเปิดใช้งานตัวอย่างในโพสต์ที่เลือกเท่านั้น
เมื่อมีการเรียก URL ดังกล่าวให้ตรวจสอบว่าอนุญาตให้มีการแสดงตัวอย่างสำหรับโพสต์หรือไม่และโพสต์นั้นยังไม่ได้เผยแพร่ ตรวจสอบให้แน่ใจว่าเครื่องมือค้นหาไม่สนใจ URL นี้

สำหรับ URL ฉันจะใช้จุดปลาย :

add_rewrite_endpoint( 'post-preview', EP_ROOT );

ตอนนี้คุณสามารถสร้าง URL เช่น ...

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

…ที่ไหน123ID โพสต์

จากนั้นใช้ตัวจัดการการเรียกกลับเพื่อตรวจสอบรหัสโพสต์ตรวจสอบว่าถูกต้องและเขียนทับแบบสอบถามหลัก query_posts()นี้น่าจะเป็นกรณีที่ใช้เฉพาะสำหรับการได้รับการยอมรับ :)

สมมติว่าจุดสิ้นสุดเป็นคลาสT5_Endpoint(แบบจำลอง) และตัวจัดการเอาต์พุตคือคลาสT5_Render_Endpoint(มุมมอง) ที่ทำให้โมเดลส่งผ่านไปก่อนหน้านี้ จากนั้นอาจมีวิธีการที่render()เรียกว่า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->metaเป็นอีกรุ่นหนึ่ง (คลาสT5_Post_Meta) สำหรับค่าโพสต์เมตาที่ควบคุมหากอนุญาตให้แสดงตัวอย่างได้ การควบคุมถูกตั้งค่าในกล่องเผยแพร่ ( การกระทำpost_submitbox_misc_actions ), แสดงผลโดยมุมมองอื่นที่ได้รับคลาสเมตาเดียวกัน

ภาพหน้าจอ

ดังนั้นควรT5_Post_Metaรู้ว่าจะเก็บเมตาไว้ที่ไหนและเมื่อไหร่มุมมองจะทำบางสิ่งกับมัน
นอกจากนี้ขอเกี่ยวtransition_post_statusเพื่อลบฟิลด์โพสต์เมตาเมื่อโพสต์มีการเผยแพร่ เราไม่ต้องการเสียทรัพยากรใช่ไหม

นี่เป็นเพียงโครงร่าง มีรายละเอียดมากมายที่จะปกเป็น ... ฉันได้เขียนปลั๊กอินขนาดเล็กที่แสดงให้เห็นถึงวิธีการดำเนินการนี้: T5 ดูตัวอย่างสาธารณะ


ขอบคุณมาก. ในที่สุดฉันก็บรรลุเป้าหมายด้วยการปรับแต่ง น่ากลัว : D
Amal Murali

6

ฉันแก้ไขปัญหานี้ในสิ่งที่ฉันคิดว่าเป็นวิธีที่ง่ายกว่าคำตอบของ @ toscho ด้านบน

กรณีการใช้งานของฉันคือฉันใช้ฐานข้อมูลเดียวกันสำหรับไซต์ staging อินทราเน็ตภายในและไซต์สาธารณะและเวิร์กโฟลว์คือผู้เขียนเขียนแบบร่างและแชร์กับผู้ใช้อื่นที่ดูแบบร่างเหล่านั้นบนไซต์อินทราเน็ตก่อนเผยแพร่ ฉันเฉพาะไม่ต้องการที่จะต้องแสดงความคิดเห็นเข้าสู่ระบบเพื่อดูร่างดังนั้นฉันแค่ขึ้นอยู่กับค่าคงที่ENV_PRODUCTIONซึ่งตั้งอยู่ในไฟล์ WP-config $_SERVER['SERVER_NAME']ขึ้นอยู่กับชื่อโฮสต์ใน ENV_PRODUCTIONนั่นคือสิ่งที่ตรวจสอบที่นี่กำลังทำ; เพียงตัดทอนตัวกรองทั้งหมดเหล่านี้หากมีการดูไซต์ที่ใช้งานจริง

นี่เป็นเรื่องแปลกเล็กน้อยเพราะคุณต้องขอหลังจาก WP_Query ลบโพสต์ทั้งหมดออกจากอาร์เรย์ $ wp_query-> posts แต่ดูเหมือนว่าจะมั่นคงและปลอดภัยสำหรับฉัน

/*
 * 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 );

มีตัวกรองแยกออกเป็นสองส่วน

  • ตัวกรองในเบ็ด "pre_get_posts" ตั้งค่าเริ่มต้น post_status เป็น 'เผยแพร่ร่าง' ในเว็บไซต์การแสดงละคร นี่จะส่งคืนโพสต์ฉบับร่างในรายการเก็บถาวร
  • จำเป็นต้องใช้ตัวกรองแยกต่างหากสำหรับมุมมองเดียวเนื่องจากมีตรรกะที่น่ารังเกียจบางอย่างในคลาส WP_Query เพื่อลบโพสต์แบบร่างจากผลลัพธ์การค้นหาเว้นแต่ว่า cuser ปัจจุบันสามารถแก้ไขได้ ฉันได้สิ่งนี้โดยการกรอง 'the_posts' และเพิ่มโพสต์ที่ฉันต้องการกลับไปที่ผลลัพธ์

2
นี่เป็นเรื่องเหลือเชื่อขอบคุณมากที่แบ่งปันสิ่งนี้ สมบูรณ์แบบอย่างแน่นอนและสิ่งที่ฉันต้องการ
Christian Varga

ฉันจะใส่รหัสนี้ที่ไหน (ไฟล์ใด)?
Joelio

@ Joelio คุณสามารถระบุปัญหาที่คุณแก้ไขได้หรือไม่? เป็นวิธีง่าย ๆ ฉันเพิ่งเพิ่มรหัสนี้ลงใน functions.php ของฉันและเพิ่มคำนิยามแบบง่าย ๆ ไปยัง wp-config.php ซึ่งตั้งค่าคงที่ ENV_PRODUCTION เป็น True หรือ false ขึ้นอยู่กับโดเมนคำขอ
goldenapples

@goldenapples ฉันเพิ่มโค้ดนี้ลงใน function.php ของฉันฉันควรเพิ่มอะไรใน wp-config ขอบคุณสำหรับความช่วยเหลือของคุณ
Graham Slick

@MatthiasGrahamSlick - คุณแค่ต้องการบางสิ่งที่จะตั้งค่าENV_PRODUCTIONคงที่หากคุณกำลังผลิต ฉันใช้ domain.com เพื่อการผลิตและ staging.domain.com เพื่อจัดเตรียมดังนั้นบรรทัดของฉันจึงมีdefine( 'ENV_PRODUCTION', false === stripos( $_SERVER['HTTP_HOST'], 'staging' ) );ประโยชน์หรือไม่
goldenapples

0

ฉันคิดว่าปลั๊กอิน "User Role Editor" ที่มีอยู่ในเว็บไซต์ของ WordPress.org อาจเป็นสิ่งที่คุณกำลังมองหา ทำไมคุณถึงต้องการให้ทุกคนเข้าถึงร่างจดหมายของคุณ? โดยส่วนตัวฉันไม่สามารถนึกถึงอินสแตนซ์ที่จะต้องใช้สิ่งนี้


ไม่ตามที่กล่าวถึงในคำถามฉันไม่ได้มองหาโซลูชันที่ใช้ปลั๊กอิน กรณีของผู้ใช้มีความซับซ้อนเล็กน้อย แต่ฉันแน่ใจว่านี่เป็นทางออกที่ดีที่สุดสำหรับงานเฉพาะที่ฉันพยายามทำ :-)
Amal Murali

ฉันงุนงงเกี่ยวกับเหตุผลเช่นกัน หากคุณต้องการให้ทุกคนเห็นโพสต์ทำไมไม่เพียงโพสต์ประกาศ คุณสามารถใช้ฟิลด์ที่กำหนดเองในโพสต์เพื่อติดตามสถานะพิเศษที่คุณอาจต้องการกำหนด
KenB

ฉันอนุญาตให้ผู้ใช้เห็นเนื้อหา แต่ด้วยเหตุผลบางอย่างฉันไม่ต้องการให้โพสต์เผยแพร่
Amal Murali

0

คุณสามารถเปลี่ยนการเปิดเผยในหน้า / โพสต์เป็น "ส่วนตัว" ซึ่งจะปรากฏแก่บรรณาธิการและผู้ดูแลเท่านั้นไม่ใช่ผู้เข้าชมสาธารณะเครื่องมือค้นหาฟีด RSS และอื่น ๆ


0

ฉันคิดว่าความคิดเห็นของจีเอ็มเป็นสิ่งที่ดีที่สุดที่นี่ ฉันคิดว่าคุณกำลังพยายามทำสิ่งต่อไปนี้:

  1. เขียนโพสต์
  2. บันทึกเป็นร่าง
  3. อนุญาตให้ผู้ใช้ภายนอก (ไม่ใช่ลงชื่อเข้าใช้) ดูแบบร่างเพื่อขออนุมัติ
  4. ประกาศ

ถูกต้องหรือไม่

น่าเสียดายที่ฉันไม่สามารถคิดวิธีง่ายๆในการทำเช่นนี้ คุณสามารถโพสต์เป็นโพสต์ส่วนตัวเพื่อให้พวกเขาต้องป้อนรหัสผ่านเพื่อดู แต่คุณต้องเข้าสู่ระบบ คุณสามารถป้องกันด้วยรหัสผ่านได้ แต่จะยังคงปรากฏอยู่ในฟีดและรายการโพสต์ล่าสุดของคุณ ฯลฯ คุณไม่สามารถสร้างบัญชีผู้ใช้ของผู้เยี่ยมชมและให้ชื่อผู้ใช้ / รหัสผ่านเมื่อคุณให้ URL ได้หรือไม่

อ่านที่นี่สำหรับข้อมูลเพิ่มเติม: http://codex.wordpress.org/Content_Visibility

อีกวิธีหนึ่งคือมีปลั๊กอินที่เหมาะสมกับความต้องการของคุณ: http://wordpress.org/extend/plugins/shareadraft/ ฉันดูรหัสอย่างรวดเร็วและดูเหมือนว่านักพัฒนากำลังปรับเปลี่ยนค่าที่ส่งคืนโดย get_post_status ดังนั้นคุณอาจจะ สามารถเล่นกับสิ่งนั้นได้:

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

HTH


0

หากคุณไม่สนใจว่าโพสต์นั้น "เผยแพร่แล้ว" หรือไม่เพียงต้องการให้ทุกคนเข้าถึงได้ที่ URL ที่เผยแพร่ปกติและไม่ปรากฏในหน้าหลัก / ผลการค้นหา / ฟีด RSS rss เป็นต้นปลั๊กอินนี้ทำงานกับ WP 4.6 1 และให้คุณปรับแต่งตำแหน่งที่โพสต์จะปรากฏขึ้น:

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.