आप डिफ़ॉल्ट होम पेज के रूप में सीपीटी का उपयोग कैसे करते हैं?


20

मेरे पास एक क्लाइंट है जो साइट को अपनी साइट को कॉन्फ़िगर करने के लिए कस्टम पोस्ट प्रकारों का भारी उपयोग कर रहा है। लेकिन मैं उनके अनुरोधित होम पेज के लिए एक चट्टान और एक कठिन जगह के बीच हूं।

वास्तव में, मुख पृष्ठ वर्डप्रेस के भीतर विशिष्ट "पृष्ठों" का ढेर होगा। असल में, इसके लिए पेज होंगे: इंट्रो , ब्लॉग , हमारे बारे में , पोर्टफोलियो और हमसे संपर्क करें । वे सभी एक दूसरे के ऊपर ढेर हो जाएंगे ताकि आप एक पृष्ठ से दूसरे तक स्क्रॉल कर सकें।

मेरी पहली वृत्ति सिर्फ एक पृष्ठ का उपयोग करना था ( होम कहा जाता है ) और एक शोर्ट एम्बेड करना जो पृष्ठ स्लग को स्वीकार करता है और उचित क्रम (यानी [pageOrder]intro, blog, about-us, portfolio, contact-us[/pageOrder]) को आउटपुट करता है । पृष्ठ चीजों को बाहर निकालने, लूप को नियंत्रित करने और पृष्ठ के बाईं ओर नेविगेशन जोड़ने के लिए एक कस्टम पृष्ठ टेम्पलेट का उपयोग करेगा। लेकिन यह सब कलंकी लगता है।

मेरा आदर्श समाधान एक कस्टम पोस्ट प्रकार ( स्टैक कहा जाता है ) बनाने के लिए होगा जो अंतिम उपयोगकर्ता को ड्रैग-ड्रॉप वाले पृष्ठों को स्थिति में लाने की अनुमति देता है और लेआउट और नेविगेशन और इस तरह सीपीटी का ध्यान रखता है।

मेरे आदर्श समाधान के साथ समस्या सेटिंग्स है। वर्डप्रेस आपको साइट के डिफ़ॉल्ट होम पेज के लिए एक पृष्ठ का चयन करने की अनुमति देता है। लेकिन यह एक पोस्ट प्रकार के पेज से जुड़ा हुआ है , और मुझे यकीन नहीं है कि इसे संशोधित करने के लिए कहां हुक करना चाहिए ताकि उपयोगकर्ता डिफ़ॉल्ट होम पेज के रूप में एक स्टैक भी चुन सकें ।

इसलिए, डिफ़ॉल्ट होम पेज के लिए उपलब्ध पृष्ठों के ड्रॉपडाउन में सीपीटी जोड़ने के लिए मैं कहां हुक कर सकता हूं?

जवाबों:


11

उपयोगी उत्तर के लिए @toscho को धन्यवाद, लेकिन यह मेरे लिए थोड़ा हैकिश महसूस हुआ, इसलिए मैंने थोड़ा इधर उधर देखा और सोचा कि मैं इसके बजाय एक फिल्टर जोड़ सकता हूं:

function wpa18013_add_pages_to_dropdown( $pages, $r ){
    if('page_on_front' == $r['name']){
        $args = array(
            'post_type' => 'stack'
        );
        $stacks = get_posts($args);
        $pages = array_merge($pages, $stacks);
    }

    return $pages;
}
add_filter( 'get_pages', 'wpa18013_add_pages_to_dropdown', 10, 2 );

अपडेट करें

उपरोक्त कोड जोड़ने के बाद, मैं वास्तव में, होम पेज के रूप में एक कस्टम पोस्ट प्रकार का उपयोग करने में सक्षम था, लेकिन वर्डप्रेस Permalinks को पुनर्निर्देशित करेगा क्योंकि यह "पेज" पोस्ट प्रकार नहीं था। इसलिए मुझे http://localhost/testअनुप्रेषित करना चाहिए http://localhost/test/stacks/home-stack, जो मैं नहीं चाहता था।

हालाँकि, इस क्रिया को जोड़ना, यह निश्चित है और मुख पृष्ठ के पन्नों के साथ मेरे कस्टम पोस्ट प्रकार पर भी प्रश्नचिह्न लगाता है:

function enable_front_page_stacks( $query ){
    if('' == $query->query_vars['post_type'] && 0 != $query->query_vars['page_id'])
        $query->query_vars['post_type'] = array( 'page', 'stack' );
}
add_action( 'pre_get_posts', 'enable_front_page_stacks' );

मैंने इस तरह के फिल्टर के साथ भी खेला है, लेकिन इसे फ्रंट पेज क्वेरी तक ही सीमित रखना होगा। और फिर मुझे कुछ अजीब व्यवहार / कीड़े द्वारा पीटा गया: मुझे सिर्फ 404 मिला। वैसे भी +1। :)
FUXIA

अच्छी पकड़। फ़ंक्शन के अंदर अतिरिक्त सशर्त (सुनिश्चित करें कि post_typeपहले से सेट नहीं है और page_idयह 0 नहीं है) सभी 404 को रोकता है। अब मैं अपने सभी कस्टम पोस्ट, मेरे सभी पोस्ट, और मेरे सभी पेजों के लिए बिना किसी व्यवधान के प्रश्नों को चला सकता हूं।
ईमान

@EAmann कोड के लिए धन्यवाद! यह वैसे ही काम करता है, जैसे कि यह फ्रंटपेज के शीर्षक को टाइटल ऑफ पोस्ट में बदलता है मुखपृष्ठ का नाम, क्या इसे केवल मुखपृष्ठ नाम, किसी व्यक्ति में बदला जा सकता है?
INT

यह बिल्कुल भी काम नहीं करता है ... सर्वर चेतावनियाँ / त्रुटियां: wpa18013_add_pages_to_dropdown () और अपरिभाषित चर: r
Dameer

8

संभावित हो? मेरे पहले समाधान का परिष्कृत संस्करण ।

add_filter( 'wp_dropdown_pages', 'add_cpt_to_front_page_dropdown', 10, 1 );


/**
 * Adds CPTs to the list of available pages for a static front page.
 *
 * @param  string $select Existing select list.
 * @return string
 */
function add_cpt_to_front_page_dropdown( $select )
{
    if ( FALSE === strpos( $select, '<select name="page_on_front"' ) )
    {
        return $select;
    }

    $cpt_posts = get_posts(
        array(
            'post_type'      => 'YOUR_POST_TYPE'
        ,   'nopaging'       => TRUE
        ,   'numberposts'    => -1
        ,   'order'          => 'ASC'
        ,   'orderby'        => 'title'
        ,   'posts_per_page' => -1
        )
    );

    if ( ! $cpt_posts ) // no posts found.
    {
        return $select;
    }

    $current = get_option( 'page_on_front', 0 );

    $options = walk_page_dropdown_tree(
        $cpt_posts
    ,   0
    ,    array(
            'depth'                 => 0
         ,  'child_of'              => 0
         ,  'selected'              => $current
         ,  'echo'                  => 0
         ,  'name'                  => 'page_on_front'
         ,  'id'                    => ''
         ,  'show_option_none'      => ''
         ,  'show_option_no_change' => ''
         ,  'option_none_value'     => ''
        )
    );

    return str_replace( '</select>', $options . '</select>', $select );
}

यह केवल कस्टम पोस्ट प्रकार का चयन करना है, लेकिन यह उस कस्टम पोस्ट प्रकार को फ्रंट पेज के रूप में प्रदर्शित नहीं करता है? या क्या मैं कुछ न कुछ भूल रहा हूं?
हमीदुल्ला खान

@Hameedullah - एक बार जब आप इसे चुनते हैं, तो वर्डप्रेस एक विकल्प को अपडेट करता है जो सामने वाले पेज के लिए उपयोग किया जाना चाहिए। फिर, जब कोई उपयोगकर्ता फ्रंट पेज पर जाता है, तो वर्डप्रेस डेटाबेस से वापस उसी विकल्प को पढ़ता है।
एमान

@ हमीदुल्लाह खान आप सही हैं। यह 3.1 से पहले काम करता था, अब मैं पोस्ट के पर्मलिंक पर पुनर्निर्देशित हूं - और मुझे 404 मिलता है। अजीब। काश मेरे पास इसके लिए समय होता। :(
FUXIA

5

केवल एक front-page.phpटेम्प्लेट फ़ाइल क्यों न बनाएं , जो या तो एक सामान्य क्वेरी / लूप का उपयोग करती है, या (यदि फ्रंट पेज पर CPT प्रदर्शित करने के लिए कोई कस्टम थीम विकल्प सेट है), CPT के आधार पर एक कस्टम क्वेरी / लूप का आउटपुट देता है?

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

चीजों को आसान बनाने के लिए, आप register_settingसेटिंग API के माध्यम से अपने कॉल में "रीडिंग" विकल्प समूह का उपयोग करके, सेटिंग्स-रीडिंग में अपने थीम विकल्प को हुक कर सकते हैं , ताकि यह मौजूदा फ्रंट-पेज विकल्पों के साथ प्रदर्शित हो।


मुझे सरल समाधान पसंद हैं और चिप मुझे लगता है कि आपका सबसे अच्छा है। Wordpress फ्रंट पेज कोड x.wordpress.org/Template_Hierarchy#Home_Page_display के लिए कस्टम टेम्प्लेट की अनुमति देता है और फिर जो भी अंदर पसंद करता है वह कर सकता है।
अनमरी

यह सबसे अधिक रखरखाव योग्य और सीधा समाधान है। front-page.phpस्वचालित रूप से चयन किया जाता है क्योंकि वर्डप्रेस टेम्पलेट पदानुक्रम का हिस्सा है। यह याद रखने की आवश्यकता नहीं है कि ऐसा क्यों हो रहा है (या अगले व्यक्ति के लिए इसे चिह्नित करने की आवश्यकता है)।
Odys

2

मुझे लगता है कि 2011 में EAMann ने अपना अपडेट लिखने के बाद कुछ बदल दिया होगा, और wpa18013_add_pages_to_dropdown () फ़ंक्शन वह अब काम नहीं करता है। जैसा कि डेमर की एक टिप्पणी में उल्लेख किया गया है, यह समारोह वर्तमान में (दिसंबर 2013) "WPA18013_add_pages_to_dropdown ()" के लिए "मिसिंग तर्क 2" एक त्रुटि फेंकता है

वैसे भी, मेरे लिए समाधान, उस दूसरे पैरामीटर के बिना फ़ंक्शन को फिर से लिखना था, या इसकी सामग्री की जांच करना था। कोड का पूर्ण ब्लॉक तब बनता है:

function add_unbox_tabs_to_dropdown( $pages ){
    $args = array(
        'post_type' => 'unbox_tabs'
    );
    $items = get_posts($args);
    $pages = array_merge($pages, $items);

    return $pages;
}
add_filter( 'get_pages', 'add_unbox_tabs_to_dropdown' );

function enable_front_page_unbox_tabs( $query ){
    if('' == $query->query_vars['post_type'] && 0 != $query->query_vars['page_id'])
        $query->query_vars['post_type'] = array( 'page', 'unbox_tabs' );
}
add_action( 'pre_get_posts', 'enable_front_page_unbox_tabs' );

कृपया ध्यान दें कि उपरोक्त उदाहरण में, मैं जो कस्टम पोस्ट प्रकार जोड़ रहा हूं वह "स्टैक" के बजाय "अनबॉक्स_टैब्स" है।


1

मैं एक प्लगइन से एक टेम्पलेट शामिल करने के लिए इस तकनीक का उपयोग कर रहा हूं । तो, @ ChipBennett का समाधान लागू नहीं होता है।

स्थैतिक पृष्ठों की सूची में प्लगइन से CPT ( ) जोड़ने के लिए , मैंने @ EAMann के समाधान को इस प्रकार संशोधित किया: 'hierarchical' => 'false'

add_action( 'admin_head-options-reading.php', 'wpse_18013_modify_front_pages_dropdown' );
add_action( 'pre_get_posts', 'wpse_18013_enable_front_page_stacks' );

function wpse_18013_modify_front_pages_dropdown()
{
    // Filtering /wp-includes/post-templates.php#L780
    add_filter( 'get_pages', 'wpse_18013_add_cpt_to_pages_on_front' );
}

function wpse_18013_add_cpt_to_pages_on_front( $r )
{
    $args = array(
        'post_type' => 'stack'
    );
    $stacks = get_posts( $args );
    $r = array_merge( $r, $stacks );

    return $r;
}

function wpse_18013_enable_front_page_stacks( $query )
{
    if( '' == $query->query_vars['post_type'] && 0 != $query->query_vars['page_id'] )
        $query->query_vars['post_type'] = array( 'page', 'stack' );
}

कोर संदर्भ v3.4.2:
3.5 RC3 में लाइन संख्या का मामूली अंतर, लेकिन कोड समान रहता है

/**
 * wp-admin/options-reading.php#L96
 * Happens inside a <li><label>-</label></li>
 */
    wp_dropdown_pages( array( 
                'name' => 'page_on_front'
            ,   'echo' => 0
            ,   'show_option_none' => __( '&mdash; Select &mdash;' )
            ,   'option_none_value' => '0'
            ,   'selected' => get_option( 'page_on_front' ) 
        ) 
    )

/**
  * wp-includes/post-template.php#L768
  */
function wp_dropdown_pages($args = '') {
    $defaults = array( /* defaults array */ );    
    $r = wp_parse_args( $args, $defaults );
    extract( $r, EXTR_SKIP );  
    $pages = get_pages( $r );
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.