कस्टम पोस्ट प्रकार के लिए एकल दृश्य को अक्षम कैसे करें?


47

मैंने एक कस्टम पोस्ट प्रकार बनाया:

register_post_type('sample_post_type',array(
    'labels' => array(
        'name' => _x('Sample Posts', 'post type general name'),
        'singular_name' => _x('Sample Post', 'post type singular name')
    ),
    'public' => true,
    'show_in_nav_menus' => false,
    'exclude_from_search' => true
));

मैं इस विशिष्ट पोस्ट प्रकार के लिए एकल पोस्ट दृश्य को कैसे अक्षम कर सकता हूं? एक साधारण 404 प्रदर्शित करना ठीक है, या मुखपृष्ठ पर पुनर्निर्देशित करना है। यह एक प्लगइन के अंदर है, इसलिए मैं एक खाली पृष्ठ को सेटअप करने के लिए एक एकल-नमूना_पॉस्ट_टाइप.php फ़ाइल नहीं बना सकता।

जवाबों:


42

आप template_redirectकस्टम पोस्ट प्रकार के लिए हुक को पुनर्निर्देशित करने के लिए उपयोग कर सकते हैं, आप किसी अन्य URL का उपयोग कर सकते हैं जिसे आप चाहते हैं home_url()और अन्य तर्क में त्रुटि कोड।

<?php
add_action( 'template_redirect', 'wpse_128636_redirect_post' );

function wpse_128636_redirect_post() {
  $queried_post_type = get_query_var('post_type');
  if ( is_single() && 'sample_post_type' ==  $queried_post_type ) {
    wp_redirect( home_url(), 301 );
    exit;
  }
}
?>

अपडेट किया गया:

एक वैकल्पिक दृष्टिकोण सेट करना होगा:

'publicly_queryable'  => false`

पहले @gustavo द्वारा बताए अनुसार कस्टम पोस्ट को पंजीकृत करते समय। लेकिन यह सिर्फ पेज को पूरी तरह से हटा देता है और आपको 404 पेज पर रीडायरेक्ट करता है। इसके अलावा यह एकल के साथ-साथ संग्रह पृष्ठ भी छुपाता है, जो मूल रूप से फ्रंट-एंड से छिपा हुआ है और केवल कस्टम पोस्ट के लिए सेट किया जा सकता है।

^ यदि आप केवल व्यवस्थापक / बैक-एंड उपयोग के लिए कस्टम पोस्ट पंजीकृत करना चाहते हैं तो यह दृष्टिकोण काम करता है


एक अच्छा उपाय। मैंने पाया कि यह केवल गैर-प्रमाणित उपयोगकर्ताओं के लिए इस रीडायरेक्ट को करने के लिए उपयोगी था, यह देखने के लिए कि क्या get_current_user_id()मूल्यांकन करने के लिए 0.
RevNoah

2
कृपया उत्तर फॉर्म की जांच करें @Gustavo
रिचर्ड

2
क्यों केवल का उपयोग नहीं is_singular('post-type-slug')में if()2 की स्थिति के बजाय हालत?
आकाश के।

@AkashK। हाँ, जो काम कर सकता है, फ़ंक्शन के बारे में नहीं जानता था।
कुमार

74

बस तर्क स्थापित कर रहा हूं

'publicly_queryable'  => false

जब आप register_post_type () कहते हैं


1
ऐसा लगता है कि सभी डेटाबेस संदर्भ बनाते समय अपने सीपीटी को वास्तविक वेब पेज बनाने से रोकने के लिए उत्तर की तरह दिखता है।
बेन रेसिकॉट सेप

27
यह संग्रह को भी छुपाता है
अंतरिक्ष यात्री

1
यह स्वीकृत उत्तर होना चाहिए।
सिनिस्टरबर्ड

मेरे लिए यह 404 के बजाय मुखपृष्ठ पर पुनर्निर्देशित करता है। कोई विचार क्यों? मैं प्रासंगिक होने के कारण Piklist के साथ पोस्ट_टाइप दर्ज कर रहा हूं।
एमेरोथिसिस

8

कस्टम पोस्ट प्रकार को पंजीकृत करते समय ऐसा करने का एक सरल तरीका निम्नलिखित आर्गन हो सकता है

register_post_type('sample_post_type',array(
'labels' => array(
    'name' => _x('Sample Posts', 'post type general name'),
    'singular_name' => _x('Sample Post', 'post type singular name')
),
'public' => true,
'exclude_from_search' => true,
'show_in_admin_bar'   => false,
'show_in_nav_menus'   => false,
'publicly_queryable'  => false,
'query_var'           => false
));

1
आपको वास्तव में publically_querableकाम करने के लिए पोस्ट टाइप अभिलेखागार के लिए सही होने की आवश्यकता होगी ।
Howdy_McGee

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

7

एक। अपने कार्यों फ़ाइल से।

add_action( 'template_redirect', 'redirect_cpt_singular_posts' );
    function redirect_cpt_singular_posts() {
      if ( is_singular('your-cpt-slug') ) {
        wp_redirect( home_url(), 302 );
        exit;
      }
    }

दो। अपनी single.cpt.php फ़ाइल से:

<?php wp_redirect( home_url() ); exit; ?>

मुझे दूसरा विकल्प पसंद आया। लेकिन मुझे यह जानना चाहिए कि इस दूसरे विकल्प के साथ कोई कमी है।
user2584538

@ user2584538 यदि आपके पास कोई कस्टम single-cpt_name.phpफ़ाइल नहीं है तो आप ऐसा नहीं कर सकते। यदि आप फ़ंक्शन को एक सरल प्लगइन फ़ाइल में रखते हैं, तो आप किसी भी फ़ाइल को संपादित किए बिना सक्रिय / निष्क्रिय कर सकते हैं।
एलियासएनएस

2

स्वेन के वास्तव में अच्छे उत्तर से काम करते हुए, मैंने उनके फ़ंक्शन को फिर से लिखा in_array()है, अगर यह कथन में कई पोस्ट प्रकारों का उपयोग करना आसान बनाता है और फिर होम पेज के बजाय संग्रह पृष्ठ पर पुनर्निर्देशित किया जाता है।

(वैसे, मुझे लगता है कि सेटिंग query_varऔर / या publically_queryableगलत न केवल एकल विचारों को अक्षम करेंगे, बल्कि मूल संग्रह दृश्य, ओवरराइडिंग भी होगा 'has_archive' => true। उस स्थिति में आप अभी भी एक कस्टम WP_query सेट कर सकते हैं और अपना खुद का संग्रह पृष्ठ बना सकते हैं, एक टेम्प्लेट, लेकिन मुख्य प्रश्न यह नहीं करेगा कि क्या यह और होगा? '

function fq_disable_single_cpt_views() {
  $queried_post_type = get_query_var('post_type');
  $cpts_without_single_views = array( 'my-post-type', 'my-other-post-type' );
  if ( is_single() && in_array( $queried_post_type, $cpts_without_single_views )  ) {
    wp_redirect( home_url( '/' . $queried_post_type . '/' ), 301 );
    exit;
  }
}

add_action( 'template_redirect', 'fq_disable_single_cpt_views' );

2

ऊपर उल्लिखित सभी का परीक्षण किया गया है और वास्तविक समाधान सुझाए गए किसी भी पुनर्निर्देशन की तुलना में सरल है।

संग्रह को सुलभ होने के लिए और वस्तुओं को सूचीबद्ध करने के लिए, और एकल पोस्ट सुलभ और ऑटो पुनर्निर्देशित नहीं किया जाना चाहिए

'query_var' => false

जब अपने सीपीटी पंजीकरण। यदि आप publicly_queryableझूठे को अपने अभिलेखागार में सेट करते हैं, तो घर पर पुनर्निर्देशित किया जाएगा, कोई अन्य कॉम्बो अभ्यस्त काम नहीं करेगा। query_varझूठ को सेट करें और वह यह है।

यहाँ पूरा CPT https://gist.github.com/danyj/bfd038d3c8d578557c4d700bd0a7942a है

लाइन 50 देखें

जैसा कि यहाँ कहा गया है

https://codex.wordpress.org/Function_Reference/register_post_type

नोट: यदि query_var खाली है, अशक्त है, या बूलियन FALSE है, तब भी वर्डप्रेस इसे (4.2.2) व्याख्या करने का प्रयास करेगा और आपके कस्टम पोस्ट के पूर्वावलोकन / विचार 404 पर वापस आ जाएंगे।


यह हैक की तरह लगता है लेकिन यह काम करने लगता है। काश वे इसके बजाय मौजूदा has_archive संपत्ति के साथ एक समर्पित has_single संपत्ति जोड़ सकते हैं।
पॉवरबॉय

0

यदि आप कस्टम पोस्ट प्रकार को दृश्यपटल पर पूरी तरह से अक्षम करना चाहते हैं, लेकिन संग्रह पृष्ठ प्रदर्शित करने में सक्षम हैं तो चीजें थोड़ी जटिल हो सकती हैं।

एकल या संग्रह दृश्य को प्रदर्शित करने के publicly_queryableलिए सेट करना falseया रोकना संभव है। केवल एकल दृश्य पुनर्लेखन नियम बनाने से रोकने के लिए फ़ंक्शन तर्कों में कोई ध्वज नहीं है।rewritefalseregister_post_type

https://github.com/WordPress/WordPress/blob/5.2.3/wp-includes/class-wp-post-type.php#L540

हालाँकि आप अपने पोस्ट प्रकार को पंजीकृत करने के बाद फिर से लिखना टैग हटा सकते हैं और यह संग्रह दृश्य को फिर से लिखने के नियमों को अछूता छोड़ देगा लेकिन केवल एकल दृश्य पुनर्लेखन नियम को हटा देगा।

/**
 * Register event post type
 */
function wpse_128636_register_event_post_type() {

    $labels = array(
        'name' => __( 'Events' ),
        'singular_name' => __( 'Event' ),
        'add_new' => __( 'Add new' ),
        'add_new_item' => __( 'Add new' ),
        'edit_item' => __( 'Edit' ),
        'new_item' => __( 'New' ),
        'view_item' => __( 'View' ),
        'search_items' => __( 'Search' ),
        'not_found' => __( 'Not found' ),
        'not_found_in_trash' => __( 'Not found Events in trash' ),
        'parent_item_colon' => __( 'Parent' ),
        'menu_name' => __( 'Events' ),

    );

    $args = array(
        'labels' => $labels,
        'hierarchical' => false,
        'supports' => array( 'title', 'page-attributes' ),
        'public' => true,
        'show_ui' => true,
        'show_in_menu' => true,
        'show_in_nav_menus' => true,
        'publicly_queryable' => true,
        'exclude_from_search' => true,
        'has_archive' => true,
        'rewrite' => array('slug' => 'event'),
        'capability_type' => 'post',
    );

    register_post_type( 'event', $args );
    remove_rewrite_tag( '%event%' ); // This line will remove event rewrite rules for single view
}

add_action( 'init', 'wpse_128636_register_event_post_type' );

एक और बोनस यह है कि अब से आप इवेंट पोस्ट प्रकार पर्मलिंक संरचना ( event/simple-page) का उपयोग करके सरल वर्डप्रेस पेज बना सकते हैं जो जटिल वेबसाइटों में सहायक हो सकता है।

कोड संशोधन के बाद नियमों को फिर से लिखना याद रखें।

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