मैं एक ड्राफ्ट पोस्ट को सभी के लिए सुलभ कैसे बनाऊं?


13

मेरी वर्डप्रेस वेबसाइट में कई अप्रकाशित पोस्ट हैं और मैं सामान्य पोस्ट स्लग ( 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_themeफ़ंक्शन को कॉल करने के लिए हुक का उपयोग कर रहा हूं ।

लेकिन जब मैं पृष्ठ को एक सामान्य उपयोगकर्ता के रूप में एक्सेस करने का प्रयास करता हूं, तो मुझे पोस्ट सामग्री दिखाने के बजाय 404 पृष्ठ दिखाया जा रहा है। मैंने पूर्वावलोकन URL लोड करने की भी कोशिश की है ( site.com/?p=212&preview=true) लेकिन वह भी काम नहीं किया।

ये मेरे अनुमान हैं:

  • सामान्य उपयोगकर्ता के पास capsड्राफ्ट पोस्ट पढ़ने के लिए पर्याप्त नहीं है ।
  • फ्रंट-एंड पर ड्राफ्ट पोस्ट का परीक्षण करना और देखना किसी भी उपयोगकर्ता (प्रशासक सहित) के लिए संभव नहीं है।

जो मैं करने की कोशिश कर रहा हूं उसे पूरा करने के लिए मुझे क्या बदलाव करने होंगे? यदि यह संभव नहीं है, तो आप क्या वैकल्पिक उपाय सुझाते हैं?

नोट: मैं प्लगइन-आधारित समाधानों की तलाश में नहीं हूं।


2
मुझे लगता है कि यहां थोड़ा भ्रम है। यदि कोई व्यक्ति लॉग इन नहीं है, तो वह उपयोगकर्ता नहीं है, इसलिए उसके पास कोई कैप नहीं हैग्राहकों उपयोगकर्ताओं हैं, इसलिए वे पंजीकृत किया जाना है और प्रवेश ग्राहकों के रूप में पहचाना जा सकता है। आप किसी ऐसे व्यक्ति को क्षमताएँ नहीं दे सकते, जिसने लॉग-इन नहीं किया है। यदि आप चाहते हैं कि कोई भी व्यक्ति लॉग इन न करें अपनी पोस्ट प्रकाशित पोस्ट्स से बिल्कुल अलग न हों। तो, क्यों यह pubblish नहीं? या क्या आप ग्राहकों को ड्राफ्ट दिखाना चाहते हैं (लॉग इन सब्सक्राइबर)?
gmazzap

@GM: मैं अप्रकाशित पदों को उन सभी लोगों के लिए सुलभ बनाने की कोशिश कर रहा हूं, जो पोस्ट के लिए प्रत्यक्ष अनुमति को जानते हैं। यह एक अजीब आवश्यकता की तरह लग सकता है, लेकिन मुझे एक परियोजना के लिए इसकी आवश्यकता है। जैसा कि मैंने अपने प्रश्न में उल्लेख किया है, यदि यह संभव नहीं है - तो क्या आप अन्य काम के बारे में सुझाव दे सकते हैं (यदि आप एक जानते हैं, तो निश्चित रूप से)?
अमल मुरली

@GM: क्या आपको ऐसे प्लगइन के बारे में पता है जो ऐसा करता है?
अमल मुरली

क्या आपने 3 अपवोट के साथ नीचे दिए गए उत्तर को पढ़ा है? यह समझाता है कि यह कैसे करना है और उत्तर के अंत में आपको जीथब से पूर्ण काम करने वाले प्लगइन को डाउनलोड करने के लिए एक लिंक मिलता है।
15 अक्टूबर को gmazzap

2
बाद के पाठकों के लिए: वहाँ GitHub पर उपलब्ध डोमिनिक Schilling द्वारा इस प्लगइन है।
kaiser

जवाबों:


12

आप अज्ञात उपयोगकर्ताओं को क्षमताओं को असाइन नहीं कर सकते। यदि आप सभी के लिए एक पोस्ट दृश्यमान बनाना चाहते हैं, तो इन पोस्टों के लिए एक अलग URL बनाएं और पोस्ट एडिटर पर एक नियंत्रण तत्व जोड़ें, जो केवल चयनित पदों पर पूर्वावलोकन को सक्षम कर सके।
जब ऐसा URL कहा जाता है, तो जांचें कि क्या पोस्ट के लिए पूर्वावलोकन की अनुमति है और यदि पोस्ट पहले से प्रकाशित नहीं की गई है। यह भी सुनिश्चित करें कि खोज इंजन इस URL को अनदेखा करें।

URL के लिए मैं एक समापन बिंदु का उपयोग करेगा :

add_rewrite_endpoint( 'post-preview', EP_ROOT );

अब आप जैसे URL बना सकते हैं…

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

… जहां 123पोस्ट आईडी नहीं है।

फिर पोस्ट आईडी का निरीक्षण करने के लिए कॉलबैक हैंडलर का उपयोग करें, जांचें कि क्या यह वैध है और मुख्य क्वेरी को अधिलेखित कर दें। यह शायद एकमात्र स्वीकार्य उपयोग का मामला है 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->metaT5_Post_Metaपोस्ट मेटा मान के लिए एक और मॉडल (वर्ग ) है जो पूर्वावलोकन की अनुमति देता है तो नियंत्रित करता है। नियंत्रण को प्रकाशित बॉक्स ( कार्रवाईpost_submitbox_misc_actions ) में सेट किया जाता है, जिसे एक अन्य दृश्य द्वारा प्रस्तुत किया जाता है जो समान मेटा क्लास प्राप्त करता है।

स्क्रीन शॉट

तो T5_Post_Metaजानते हैं कि मेटा वैल्यू को कहां और कब स्टोर करना है, इसके साथ व्यूज कुछ करते हैं।
इसके अलावा, पोस्ट प्रकाशित होने पर पोस्ट मेटा फ़ील्ड को हटाने के लिए हुक करेंtransition_post_status । हम संसाधनों को बर्बाद नहीं करना चाहते हैं, है ना?

यह सिर्फ एक रूपरेखा है। कवर करने के लिए कई विवरण हैं ... मैंने एक छोटा सा प्लगइन लिखा है जो दिखाता है कि इसे कैसे लागू किया जाए: T5 सार्वजनिक पूर्वावलोकन


बहुत बहुत धन्यवाद। मैंने आखिरकार कुछ ट्वीक्स के साथ अपना लक्ष्य हासिल कर लिया। बहुत बढ़िया। : डी
अमल मुरली

6

मैंने इस समस्या को हल किया जो मैंने सोचा था कि @scho के उत्तर के ऊपर एक सरल तरीका था।

मेरा उपयोग मामला यह है कि मैं एक आंतरिक इंट्रानेट स्टेजिंग साइट और एक सार्वजनिक-सामना करने वाली साइट के लिए एक ही डेटाबेस का उपयोग कर रहा हूं, और वर्कफ़्लो यह है कि लेखक ड्राफ्ट लिखते हैं और इसे अन्य उपयोगकर्ताओं के साथ साझा करते हैं जो प्रकाशन से पहले इंट्रानेट साइट पर उन ड्राफ्ट को देखते हैं। मुझे विशेष रूप से ड्राफ्ट देखने के लिए समीक्षकों को लॉग इन करने की आवश्यकता नहीं थी, इसलिए मैं सिर्फ एक स्थिरांक पर निर्भर हूं, ENV_PRODUCTIONजो कि होस्टनाम में स्थित wp-config फाइल में सेट है $_SERVER['SERVER_NAME']। Thats यहाँ क्या जाँच ENV_PRODUCTIONकर रहे हैं; अगर उत्पादन साइट देखी जा रही है तो इन सभी फ़िल्टर को छोटा कर दें।

यह थोड़ा अजीब है, क्योंकि आपको WP_Query में $ wp_query-> पोस्ट्स सरणी से सभी पोस्ट हटाने के बाद हुक करना होगा, लेकिन यह स्थिर और मेरे लिए सुरक्षित लगता है।

/*
 * 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" हुक पर एक फ़िल्टर, डिफ़ॉल्ट पोस्ट_स्टैटस को स्टैचिंग साइट पर 'प्रकाशित, ड्राफ्ट' के लिए सेट करता है। यह संग्रह लिस्टिंग में मसौदा पदों को वापस कर देगा।
  • एकल विचारों के लिए एक अलग फ़िल्टर की आवश्यकता होती है, क्योंकि डुप्लिकेट पोस्टों को हटाने के लिए WP_Query वर्ग में कुछ बुरा तर्क है जब तक कि वर्तमान क्यूसर उन्हें संपादित नहीं कर सकता। मैंने 'the_posts' को फ़िल्टर करके और मेरे द्वारा परिणामों पर सही वापस चाहा गया पोस्ट जोड़कर मैं इसके आसपास पहुँच गया।

2
यह अविश्वसनीय है , इसे साझा करने के लिए बहुत बहुत धन्यवाद। बिल्कुल सही और बिल्कुल वही जिसकी मुझे जरूरत थी।
क्रिश्चियन वर्गा

मैंने यह कोड कहां रखा है? (कौन सी फाइल (ओं)?)
जोएलियो

@Joelio क्या आप उस समस्या के बारे में विशिष्ट हो सकते हैं जिसे आप हल कर रहे हैं? एक सरल दृष्टिकोण के रूप में, मैंने इस कोड को अपने फ़ंक्शन के लिए जोड़ दिया ।php, और अपने wp-config.php में एक सरल परिभाषा जोड़ दी, जो अनुरोध डोमेन के आधार पर ENV_PRODUCTION को सही या गलत पर स्थिर रखता है।
सुनहरा

@goldenapples मैंने अपने फ़ंक्शन के लिए कोड का यह टुकड़ा जोड़ा है। एफपी, मुझे wp-config में क्या जोड़ना चाहिए? आपकी मदद के लिए धन्यवाद
ग्राहम स्लीक

@MatthiasGrahamSlick - ENV_PRODUCTIONयदि आप उत्पादन पर हैं तो आपको बस कुछ सेट करना होगा । मैं उत्पादन के लिए domain.com का उपयोग कर रहा था और स्टेजिंग के लिए staging.domain.com, तो मेरी लाइन define( 'ENV_PRODUCTION', false === stripos( $_SERVER['HTTP_HOST'], 'staging' ) );क्या वह मदद थी?
सुनहरा

0

मुझे लगता है कि WordPress.org की वेबसाइट पर उपलब्ध "यूजर रोल एडिटर" प्लगइन वही हो सकता है जो आप खोज रहे हैं। वैसे, आप अपने ड्राफ्ट को हर किसी तक पहुंच क्यों देना चाहते हैं? मैं व्यक्तिगत रूप से एक ऐसे उदाहरण के बारे में नहीं सोच सकता जहाँ इसकी आवश्यकता होगी।


नहीं, जैसा कि प्रश्न में उल्लेख किया गया है, मैं प्लगइन-आधारित समाधानों की तलाश नहीं कर रहा हूं। Usecase थोड़ा जटिल है, लेकिन मुझे यकीन है कि यह इस विशिष्ट कार्य के लिए सबसे अच्छा समाधान है जिसे मैं पूरा करने की कोशिश कर रहा हूं। :-)
अमल मुरली

मैं कारण के रूप में अच्छी तरह से हैरान हूँ। यदि आप सभी को पोस्ट देखना चाहते हैं, तो बस पोस्ट को प्रकाशित क्यों नहीं करते? आप जिस भी विशेष राज्य को परिभाषित करना चाहते हैं, उसे ट्रैक करने के लिए पोस्ट पर कस्टम फ़ील्ड का उपयोग कर सकते हैं।
केनबी जूल

मैं उपयोगकर्ताओं को सामग्री देखने दे रहा हूं, लेकिन कुछ विशिष्ट कारणों से मैं नहीं चाहता कि पोस्ट प्रकाशित हों।
अमल मुरली

0

आप पृष्ठ / पोस्ट पर दृश्यता को "निजी" में बदल सकते हैं जो केवल संपादकों और प्रशासकों को दिखाई देता है और सार्वजनिक आगंतुकों, खोज इंजन, आरएसएस फ़ीड आदि को नहीं।


0

मुझे लगता है कि जीएम की टिप्पणी यहां सबसे अच्छी है। मुझे लगता है कि आप निम्नलिखित करने की कोशिश कर रहे हैं:

  1. एक पोस्ट लिखें
  2. मसौदे के रूप में संचित करें
  3. किसी बाहरी (लॉग-इन नहीं) उपयोगकर्ता को अनुमोदन के लिए मसौदा देखने दें
  4. प्रकाशित करना

क्या वो सही है?

दुर्भाग्य से, मैं ऐसा करने का कोई सरल तरीका नहीं सोच सकता। आप इसे एक निजी पोस्ट के रूप में पोस्ट कर सकते हैं ताकि उन्हें इसे देखने के लिए एक पासवर्ड दर्ज करने की आवश्यकता हो लेकिन इसके लिए आपको लॉग इन करना होगा। आप पासवर्ड की सुरक्षा भी कर सकते हैं, लेकिन फिर भी यह आपके फ़ीड और हालिया पोस्टों की सूची आदि में दिखाई देगा, क्या आप एक अतिथि उपयोगकर्ता खाता नहीं बना सकते हैं और जब आप उन्हें URL देते हैं तो उन्हें उपयोगकर्ता नाम / पासवर्ड दे सकते हैं?

अधिक जानकारी के लिए यहां पढ़ें: http://codex.wordpress.org/Content_Visibility

वैकल्पिक रूप से, एक प्लगइन है जो आपकी आवश्यकताओं के अनुरूप हो सकता है: http://wordpress.org/extend/plugins/shareadraft/ मुझे कोड पर एक त्वरित नज़र थी और ऐसा प्रतीत होता है कि डेवलपर get_post_statent द्वारा लौटाए गए मान को संशोधित कर रहा है ताकि आप हो सकें उस के साथ खेलने में सक्षम:

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

HTH


0

यदि आपको परवाह नहीं है कि पोस्ट "प्रकाशित" है या नहीं, तो बस नियमित रूप से प्रकाशित URL पर किसी के द्वारा इसे एक्सेस करना चाहते हैं और मुख्य पृष्ठ / खोज परिणाम / आरएसएस फ़ीड आदि पर नहीं दिखा रहे हैं, इस प्लगइन ने WP 4.6 के साथ काम किया है। 1 और आपको ठीक धुन देता है जहाँ एक पोस्ट दिखाई देती है:

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.