मौजूदा पोस्ट प्रकार को संशोधित करने के लिए register_post_type () का उपयोग करें


29

ऐसी बहुत सी स्थितियाँ हैं जहाँ कोई विषय या प्लगइन एक पोस्ट प्रकार को पंजीकृत करता है और आप इसे संशोधित करना चाहते हैं। बेशक है add_post_type_support()और remove_post_type_support(), लेकिन वे उन तर्कों की पूरी सूची तक पहुंच नहीं देते हैं जो register_post_type()ले जाते हैं। विशेष रूप से, शायद मैं एक पोस्ट प्रकार संग्रह को अक्षम करना चाहता हूं, व्यवस्थापक यूआई को छुपाना, खोज से छिपाना, आदि जबकि बाकी पोस्ट सेटिंग्स को छोड़ दें।

के लिए कोडेक्स पेजregister_post_type() मेरे सामने dangles इस:

विवरण

पोस्ट प्रकार बनाएं या संशोधित करें।

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

यह देखते हुए कि कोई deregister_post_type()फ़ंक्शन भी नहीं है , मुझे समझ नहीं आता कि यह कैसे किया जा सकता है।

जवाबों:


18

क्या यह फ़ंक्शन वास्तव में पोस्ट प्रकारों को संशोधित करने के लिए है

हाँ।

और यदि हां, तो क्या आप बस दंपति के तर्क को भुना सकते हैं और बाकी को अकेला छोड़ सकते हैं?

यदि आप किसी पोस्ट प्रकार के लिए तर्कों को संशोधित करना चाहते हैं, तो आपको get_post_type_objectपोस्ट प्रकार की वस्तु प्राप्त करने के लिए उपयोग करने की आवश्यकता है , इसमें जो आप चाहते हैं उसे संशोधित करें, फिर इसे अपने संशोधित प्रकार का उपयोग करके नए $ args पैरामीटर के रूप में फिर से पंजीकृत करें।


क्या संशोधित तर्कों के साथ दो लगातार कॉल करना register_post_typeसही होगा? मैं आपके "हाँ" द्वारा मान लेता हूं, और यह किसी भी त्रुटि को कम नहीं करता है और वांछित प्रभाव डालता है। वास्तविक मामला दूसरा विकल्प है जो मैं इस उत्तर में प्रस्तुत करता हूं: wordpress.stackexchange.com/a/74331/12615
brasofilo

हां, यह काम करता है, लेकिन ऐसा लगता है कि यदि आप ऐसा कर रहे हैं, तो आपको बार-बार एक ही पोस्ट प्रकार को पंजीकृत करने से रोकने के लिए कुछ फिल्टर या कुछ और जोड़ना होगा। मूल रूप से, पहले तर्क को सुलझा लें, फिर उसे पंजीकृत करें।
ओट्टो

मैं सिर्फ प्लगइन के ठीक पहले प्रदान किए गए हुक के कारण इसके बारे में सोचता था register_post_type। वास्तव में, कोई जरूरत नहीं है। यह "रिकॉर्ड्स के लिए" सवाल था, प्रतिक्रिया के लिए धन्यवाद।
ब्रासोफिलो

34

कुछ शोधों के बाद मैंने पाया कि इनमें से कोई भी उत्तर अप टू डेट नहीं है।

8 दिसंबर, 2015 तक वर्डप्रेस में एक नया फिल्टर शामिल है register_post_type_args, जो आपको एक पंजीकृत पोस्ट प्रकार के तर्कों में हुक करने देता है।

function wp1482371_custom_post_type_args( $args, $post_type ) {
    if ( $post_type == "animal-species" ) {
        $args['rewrite'] = array(
            'slug' => 'animal'
        );
    }

    return $args;
}
add_filter( 'register_post_type_args', 'wp1482371_custom_post_type_args', 20, 2 );

6
अब ऐसा करने का यही सही तरीका है।
डेव रोमसे

6
यह स्वीकृत उत्तर होना चाहिए
klewis

यदि आपको रनटाइम में पंजीकृत होने के बाद इसे अपडेट करने की आवश्यकता है तो क्या होगा? उदा: के बादinit
लुकास बुस्टामेंटे

@LucasBustamante यह कोई फर्क नहीं पड़ता। बस अपने प्लगइन / थीम के दौरान 'add_filter' लाइन को कॉल करें, न कि किसी क्रिया में। प्रत्येक register_post_typeफ़ंक्शन के दौरान फ़िल्टर को बुलाया जाएगा । एकमात्र परिदृश्य जहां मेरा कोड काम नहीं करेगा, यदि पोस्ट प्रकार सही तरीके से पंजीकृत नहीं किया जा रहा है। सभी पोस्ट प्रकार को इनिट हुक के दौरान पंजीकृत किया जाना चाहिए। कोडेक्स से: "register_post_type 'init' से पहले कॉल करने पर काम नहीं करेगा, और नए बनाए गए या संशोधित पोस्ट प्रकार के पहलू बाद में कॉल किए जाने पर गलत तरीके से काम करेंगे।" यदि आपको अभी भी मदद चाहिए तो मैं एक नए प्रश्न में अधिक विवरण पोस्ट करने का सुझाव दूंगा।
रेडली सस्टेयर

8

यहां एक 'registered_post_type'अन्य प्रकार के पोस्ट प्रकार को संशोधित करने के लिए फ़िल्टर का उपयोग करने का एक उदाहरण दिया गया है ।

एक प्लगिन जो मैं उपयोग कर रहा था, उसमें एक menu_icon शामिल नहीं था, इसलिए मैं अपना खुद का एक ऐड करना चाहता था।

<?php
/**
 * Add a menu icon to the WP-VeriteCo Timeline CPT
 *
 * The timeline plugin doesn't have a menu icon, so we hook into 'registered_post_type'
 * and add our own.
 *
 * @param  string $post_type the name of the post type
 * @param  object $args the post type args
 */
function wpse_65075_modify_timeline_menu_icon( $post_type, $args ) {
    // Make sure we're only editing the post type we want
    if ( 'timeline' != $post_type )
        return;

    // Set menu icon
    $args->menu_icon = get_stylesheet_directory_uri() . '/img/admin/menu-timeline.png';

    // Modify post type object
    global $wp_post_types;
    $wp_post_types[$post_type] = $args;
}
add_action( 'registered_post_type', 'wpse_65075_modify_timeline_menu_icon', 10, 2 );

यह ज्यादातर मामलों में करने के लिए एक बहुत साफ तरीका है; हालाँकि, यह ध्यान दिया जाना चाहिए कि यह फ़िल्टर पुनर्लेखनों द्वारा लेने के लिए बहुत देर हो चुकी है इसलिए स्वीकार किए गए उत्तर का उपयोग उन स्थितियों के बजाय करना चाहिए।
mrwweb

4

हुक के 'registered_post_type'बाद दूसरे कोड ने इसे पंजीकृत किया है। के अंत में इसे कहा जाता है register_post_type()। आपको दो तर्क मिलते हैं: $post_typeऔर $args
अब आप इस पोस्ट प्रकार के लिए कुछ भी बदल सकते हैं। $GLOBALS['wp_post_types']कुछ विकल्पों के लिए निरीक्षण करें।


मुझे उस हुक की ओर इशारा करने के लिए धन्यवाद। पोस्ट प्रकार को संशोधित करने के तरीके के बारे में (अधिक महत्वपूर्ण) प्रश्न का उत्तर देता है , लेकिन इसके वर्णन के बारे में क्या register_post_type()"संशोधित?" क्या यह सिर्फ गलत है? क्या मुझे अपने इंटरनेट घोड़े पर हॉप करना चाहिए और इस पल को कोडेक्स से प्राप्त करना चाहिए?
mrwweb

2
$wp_post_types[$post_type] = $args;… सुझाव है कि आपको गुणों को बदलने में सक्षम होना चाहिए। अपने प्रश्न में विफल कोड का एक उदाहरण जोड़ें।
FUXIA

0

मैं घटनाक्रम कैलेंडर प्लगइन के साथ एक ही बात का सामना करना पड़ा ।

मैंने tribe_organizer पोस्ट प्रकार को संशोधित करने के लिए function.php में नीचे कोड जोड़ा

function tribe_modify_organizer() {
 //New arguments
    $tribe_organizer_args = get_post_type_object('tribe_organizer'); // get the post type to modify
    $tribe_organizer_args-> taxonomies = array('post_tag' , 'tribe_events_cat'); // add taxonomies support
    $tribe_organizer_args-> exclude_from_search = false; // show in search result
 //re-register the same post type includeing the new args
    register_post_type( 'tribe_organizer', $tribe_organizer_args );
}
add_action( 'init', 'tribe_modify_organizer', 100 );

0

मुझे नहीं पता कि यह बदसूरत है, लेकिन GLOBALजब भी आपको एक भी तर्क में हेरफेर करने की आवश्यकता होती है, तो आप प्लेसहोल्डर को "मक्खी पर" बदल सकते हैं । यह है कि हम contentsव्यवस्थापक मेनू में स्वीकार्य होने के लिए गैर-सार्वजनिक पोस्ट प्रकार का उपयोग कैसे करते हैं । हम मेनू रेंडर के बाद पहले बंद करते हैं और बंद करते हैं:

function entex_theme_make_contents_public(){
    $GLOBALS['wp_post_types']['contents']->public = true;
}
add_action('admin_menu', 'entex_theme_make_contents_public', 10);

function entex_theme_make_contents_private_again(){
    $GLOBALS['wp_post_types']['contents']->public = '';
}
add_action('admin_menu', 'entex_theme_make_contents_private_again', 12);

हमारे मामले में, हम चाहते हैं कि हमारे मेनू प्रकार को स्वीकार करने के लिए व्यवस्थापक मेनू पोस्ट सूची प्लगइन हो, क्योंकि वे return get_post_types(array('public' => true));प्राथमिकता 11 के साथ अपने हुक के अंदर कॉल करते हैं ...

अगर यह किसी भी मुद्दे को रोक सकता है तो डेवलपर्स -प्लीज एक टिप्पणी करें।

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