मैं केवल विशिष्ट कस्टम पोस्ट प्रकार के लिए मेटाडेटा कैसे बचा सकता हूं?


16

मैं इस ट्यूटोरियल के बाद एक कस्टम पोस्ट टाइप सेट करने का प्रयास कर रहा हूं । हालाँकि, मैं थोड़ा उलझन में हूँ कि कैसे / कहाँ लागू किया जाए update_post_meta()। ट्यूटोरियल इस पैटर्न का सुझाव देता है:

add_action('save_post', 'save_my_metadata');

function save_my_metadata()
{
    global $post;
    update_post_meta($post->ID, 'my_metadata', $_POST['my_metadata']);
}

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

मैंने ऊपर डाल दिया है functions.phpऔर अनुमान लगा रहा हूं कि समस्या का हिस्सा हो सकता है। मैं अनुमान लगा रहा हूं कि मुझे अपने कस्टम प्रकार के पदों के लिए केवल 'save_post' कार्रवाई को प्रतिबंधित करने की आवश्यकता है।


अच्छा सवाल बॉबी जैक, लेकिन क्या मैं आपसे यह सवाल पूछ सकता हूं कि "कुछ हद तक मेटाडेटा को केवल विशिष्ट कस्टम पोस्ट प्रकारों के लिए कैसे सहेजें"; जैसा कि आपका शीर्षक है कि लोग इस समस्या के समाधान की तलाश में हैं, उन्हें पहचानने के लिए बहुत सामान्य है।
माइकस्किंकल

@ माइक: किया (पूरी तरह से आपके सुझाव से सहमत है, धन्यवाद!)
बॉबी जैक

जवाबों:


18
function save_my_metadata($ID = false, $post = false)
{
    if($post->post_type != 'your_post_type')
        return;
    update_post_meta($ID, 'my_metadata', $_POST['my_metadata']);
}

वह काम करना चाहिए। बस पोस्ट प्रकार के नाम के साथ 'your_post_type' बदलें। इसके अलावा, कम ज्ञात तथ्य: 'save_post' हुक पोस्ट आईडी को एक तर्क के रूप में पारित करता है।

संपादित करें

मैंने जनवरी की टिप्पणी को प्रतिबिंबित करने के लिए फ़ंक्शन को अपडेट किया। धन्यवाद जन!


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

यह समाधान काम करता है ... मैंने बहुत सफलता के साथ क्लाइंट प्रोजेक्ट्स पर इसका उपयोग किया है।
एमान

शानदार- एक आकर्षण की तरह काम करता है। और मैं मान रहा हूँ कि यह करने के लिए समझ में आता है "अगर ($ पोस्ट-> post_type == 'जानवर') {update_post_meta ($ ID," number_of_legs ", $ _POST ['number_of_legs'];);} ($) post-> post_type == 'vehicle') {update_post_meta ($ ID, "number_of_wheels", $ _POST ['number_of_wheels']];} // ... आदि ... कई अलग-अलग पोस्ट प्रकारों को संभालने के लिए (माफी के लिए)? टिप्पणियों की खराब प्रारूपण क्षमता!)
बॉबी जैक

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

@ एमान - हाँ, लेखन के माध्यम से आधे रास्ते, मुझे एहसास हुआ कि एक स्विच बेहतर होगा, लेकिन टिप्पणियाँ संपादन कोड शुरू करने के लिए आदर्श स्थान नहीं हैं, इसलिए मैं आलसी हो गया;)
बॉबी जैक

4

यदि आप कई पोस्ट प्रकारों को संभालना चाहते हैं, तो मैं एक बुनियादी स्विच स्टेटमेंट सुझाऊंगा:

add_action('save_post', 'save_my_metadata');

function save_my_metadata($ID = false, $post = false)
{
    switch($post->post_type) 
    {
        case 'post_type_1':
            // Do stuff for post type 1
            update_post_meta($ID, 'my_metadata', $_POST['my_metadata']); // Example...
            break;
        case 'post_type_2':
            // Do stuff for post type 2
            break;
        default:
            return;
    }
}

मामले मूल रूप से एक जैसे हैं, if($post->post_type) == 'post_type_1') {}लेकिन कई और-और ब्लॉक की आवश्यकता नहीं है। defaultस्विच में ब्लॉक मामलों में जहां पोस्ट प्रकार अपने कस्टम सेट में नहीं है संभालती है।


4

@ जॉन पी बलोच और @ इमान ने पहले ही शानदार जवाब दे दिए हैं, इसलिए मेरा अतिरिक्त है:

  1. एक अंडरस्कोर के साथ अपने मेटा_की को उपसर्ग करने पर विचार करें । ऐसा करने से उन्हें पोस्ट एडिट स्क्रीन पर प्रदर्शित कस्टम फ़ील्ड की सूची से छुपाया जाता है, अर्थात

    function save_my_metadata ($ post_id, $ post = false) {
       अगर ($ पोस्ट> post_type == 'your_post_type')
          update_post_meta ($ post_id, '_my_metadata', $ _POST ['my_metadata']);
    }
    
    जाहिर है इसका मतलब है कि आपको फ़ील्ड संपादित करने में सक्षम होने के लिए एक कस्टम मेटाबॉक्स की आवश्यकता होगी। यहाँ संदर्भ के लिए एक संपादन स्क्रीन है:



  2. एक और चीज़ जो आप कर सकते हैं वह है विशिष्ट पोस्ट प्रकारों को आसान बनाने के लिए अपना स्वयं का हुक जोड़ना, अर्थात आपका हुक " save_{$post_type}_post" हो सकता है ; एक movieपोस्ट प्रकार के लिए यह होगा save_movie_post। यहां आपको अपनी थीम की functions.phpफ़ाइल या किसी प्लगइन में जोड़ना होगा:

    add_action ('save_post', 'save_custom_post_type_posts', 10,2);
    फ़ंक्शन save_custom_post_type_posts ($ पोस्ट_िड, $ पोस्ट = गलत) {
       do_action ( "बचाने _ {$ पोस्ट> post_type} _POST");
    }
    
    इसके बाद आप अपने मूल कोड को फिर से लिख सकते हैं (जैसे # 1 से अंडरस्कोर ट्रिक सहित):

    ADD_ACTION ( 'save_my_postype_post', 'save_my_postype_metadata', 10,2);
    function save_my_postype_metadata ($ post_id, $ post) {
        update_post_meta ($ post_id, '_my_metadata', $ _POST ['my_metadata']);
    }

1

व्यक्तिगत रूप से, मैं पोस्ट प्रकारों के लिए कस्टम मेटा हैंडलर जोड़ने के लिए नीचे दिए गए पैटर्न का पालन करना पसंद करता हूं। नीचे के साथ, आप add_post_type_support ('my_post_type', 'उपशीर्षक') को कॉल करके पोस्ट प्रकार के लिए समर्थन सरणी में केवल कुंजी (नीचे उदाहरण में 'उपशीर्षक) जोड़कर मेटा समर्थन को पोस्ट प्रकार में जोड़ सकते हैं;

class Subtitle_Meta_Handler {
    public function initialize() {
        add_action('add_meta_boxes', array($this, 'add_metabox'), 10, 2);
        add_action('save_post', array($this, 'update'));
    }

    public function add_metabox($post_type, $post)
    {
        if(post_type_supports($post_type, 'subtitle'))
        {
            add_meta_box('subtitle', 'Subtitle', array($this, 'metabox'), $post_type);
        }
    }

    public function metabox($post)
    {
        $subtitle = get_post_meta($post->ID, 'subtitle', true);
        if(!$subtitle)
        {
            $subtitle = '';
        }
        ?>
        <input type="text" style="width: 70%;" value="<?php echo esc_attr($subtitle);?>" name="subtitle" id="subtitle">
        <?php
        wp_nonce_field('update_subtitle', 'subtitle_nonce');
    }

    public function update($post_id)
    {
        if(wp_is_post_autosave($post_id) || wp_is_post_revision($post_id)) {
            return $post_id;
        }
        if(isset($_REQUEST['subtitle_nonce']) && wp_verify_nonce($_REQUEST['subtitle_nonce'], 'update_subtitle')) {
            $subtitle = trim(strip_tags($_REQUEST['subtitle'], '<b><strong><span><a>'));
            if(empty($subtitle)) {
                delete_post_meta($post_id, 'subtitle');
            } else {
                update_post_meta($post_id, 'subtitle', $subtitle);
            }
        }
    }
}
add_action('init', array(new Subtitle_Meta_Handler(), 'initialize'));

उम्मीद है कि जल्द ही कोर में कुछ ऐसा जोड़ा जाएगा।


0

पूर्व अद्यतन की जाँच करें कि वर्तमान पद आपके पोस्ट-प्रकार का है या नहीं। यह सुनिश्चित करेगा कि आप इसे सभी पदों के लिए नहीं बचाएंगे।

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

पोस्ट प्रकार प्राप्त करना: get_post_type()या$post->post_type;


0

मैं काम करने के लिए इसे प्राप्त कर सकता हूं - यह सुनिश्चित नहीं कर सकता कि Im गलत क्या कर रहा है - लेकिन Im save_post के बजाय post_updated हुक का उपयोग करने की कोशिश कर रहा हूं - जैसा कि मैं चाहता हूं कि इन अपडेट को पोस्ट अपडेट होने के बाद डाला जाए ताकि मैं अन्य कस्टम फ़ील्ड से मान प्राप्त कर सकूं ।

 function update_meta ($ID = false, $post = false) {
  update_post_meta($ID, 'rest_long', 'Test 1');
  update_post_meta($ID, 'rest_lat', 'Test 2');
}

add_action('post_updated', 'update_meta');

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