आवश्यकतानुसार अधिक मेटा बॉक्स बनाएं


46

मैं चाहूंगा कि उपयोगकर्ता आवश्यकतानुसार अतिरिक्त मेटा बॉक्स फ़ील्ड बनाएं और निकालें।

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

आदर्श रूप से यह एक प्लगइन के उपयोग के बिना किया जाएगा, लेकिन फ़ंक्शन फ़ाइल में कोडित किया जाएगा।


आप कस्टम फ़ील्ड मेटाबॉक्‍स में निर्मित वर्णन कर रहे हैं!
बैनेटर्न

1
मैं अनिवार्य रूप से अनुमान लगाता हूं कि यह कैसे काम करता है, लेकिन यह केवल एक समय में एक क्षेत्र करने के लिए सेट किया गया है, और यह बहुत उपयोगकर्ता के अनुकूल नहीं है।
पिकार्ड 102

जवाबों:


52

तो आप इस तरह से कुछ मतलब है?

यहाँ छवि विवरण दर्ज करें

और जब आप ऐड ट्रैक पर क्लिक करते हैं तो यह बन जाता है:

यहाँ छवि विवरण दर्ज करें

यदि आप इसका मतलब यह है कि एक मेटाबॉक्‍स बनाने के द्वारा किया गया है, जिसमें फ़ील्ड जोड़ने और हटाने के लिए सरल jquery फ़ंक्शन है, और डेटा को एकल मेटा पंक्ति में डेटा की एक सरणी के रूप में सहेजा जाता है, यहां आप जाते हैं:

  add_action( 'add_meta_boxes', 'dynamic_add_custom_box' );

    /* Do something with the data entered */
    add_action( 'save_post', 'dynamic_save_postdata' );

    /* Adds a box to the main column on the Post and Page edit screens */
    function dynamic_add_custom_box() {
        add_meta_box(
            'dynamic_sectionid',
            __( 'My Tracks', 'myplugin_textdomain' ),
            'dynamic_inner_custom_box',
            'post');
    }

    /* Prints the box content */
    function dynamic_inner_custom_box() {
        global $post;
        // Use nonce for verification
        wp_nonce_field( plugin_basename( __FILE__ ), 'dynamicMeta_noncename' );
        ?>
        <div id="meta_inner">
        <?php

        //get the saved meta as an array
        $songs = get_post_meta($post->ID,'songs',false);

        $c = 0;
        if ( count( $songs ) > 0 ) {
            foreach( $songs as $track ) {
                if ( isset( $track['title'] ) || isset( $track['track'] ) ) {
                    printf( '<p>Song Title <input type="text" name="songs[%1$s][title]" value="%2$s" /> -- Track number : <input type="text" name="songs[%1$s][track]" value="%3$s" /><span class="remove">%4$s</span></p>', $c, $track['title'], $track['track'], __( 'Remove Track' ) );
                    $c = $c +1;
                }
            }
        }

        ?>
    <span id="here"></span>
    <span class="add"><?php _e('Add Tracks'); ?></span>
    <script>
        var $ =jQuery.noConflict();
        $(document).ready(function() {
            var count = <?php echo $c; ?>;
            $(".add").click(function() {
                count = count + 1;

                $('#here').append('<p> Song Title <input type="text" name="songs['+count+'][title]" value="" /> -- Track number : <input type="text" name="songs['+count+'][track]" value="" /><span class="remove">Remove Track</span></p>' );
                return false;
            });
// The live() method was deprecated in jQuery version 1.7, and removed in version 1.9. Use the on() method instead. We can use .on
            $(".remove").live('click', function() {
                $(this).parent().remove();
            });
        });
        </script>
    </div><?php

    }

    /* When the post is saved, saves our custom data */
    function dynamic_save_postdata( $post_id ) {
        // verify if this is an auto save routine. 
        // If it is our form has not been submitted, so we dont want to do anything
        if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) 
            return;

        // verify this came from the our screen and with proper authorization,
        // because save_post can be triggered at other times
        if ( !isset( $_POST['dynamicMeta_noncename'] ) )
            return;

        if ( !wp_verify_nonce( $_POST['dynamicMeta_noncename'], plugin_basename( __FILE__ ) ) )
            return;

        // OK, we're authenticated: we need to find and save the data

        $songs = $_POST['songs'];

        update_post_meta($post_id,'songs',$songs);
    }

जब मैं उपरोक्त कोड का उपयोग करता हूं तो केवल "सरणी (0) {} ट्रैक्स जोड़ें" लगता है।
पिकार्ड 102

हाँ बस हटा देंvar_dump($songs);
बैनटेनट

कूल, जो कि तय किया गया था, लेकिन अब डेटा अपडेट पर बचत नहीं करता है। या कम से कम यह डेटा को माय ट्रैक के अंतर्गत फ़ील्ड के रूप में नहीं दिखा रहा है, न ही कस्टम फ़ील्ड में। अगर मैं var_dump को वापस रखता हूं, हालांकि यह "सरणी (1) {[0] => सरणी (1) {[1] => सरणी (2) {[" शीर्षक "] => स्ट्रिंग (4)" परीक्षण करता है "[" ट्रैक "] => स्ट्रिंग (5)" टेस्टे "}}} ट्रैक्स जोड़ें"
Picard102

4
वास्तव में निश्चित नहीं है कि समस्या क्या है, इसका सटीक कोड नहीं है, इसका उदाहरण है और मेरे अंत में ठीक काम कर रहा है, इसे बदलने की कोशिश if (count($songs) > 0){करेंif(is_array($songs)){
बैनेटर्न

2
यहाँ कोड btw है अगर किसी को उत्सुक है कि मैंने इसे कैसे लागू किया। leschinskidesign.com.php5-10.websitetestlink.com/test/… leschinskidesign.com.php5-10.websitetestlink.com/test/… leschinskidesign.com.php5-10-websitetestlink.com/test/…
Picard102

3

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

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

कुछ सुझाव:

http://wordpress.org/extend/plugins/verve-meta-boxes/

http://wordpress.org/extend/plugins/more-fields/


3
लेकिन क्या आपको कभी भी कुछ भी उपयोग नहीं करना चाहिए जो उपयोगकर्ताओं को मेटा बॉक्स जोड़ने या हटाने की अनुमति देता है क्यों?
ट्रैविस नॉर्थकट

मेरी एकमात्र चिंता यह है कि किसी भी प्लगइन के साथ यह मौका आता है कि भविष्य में इसका समर्थन किया जाना बंद हो जाए। मुझे लगता है कि यह संभवतः अधिक संभावना है कि मैं यह पता लगाने में सक्षम होऊंगा कि फ़ंक्शंस फ़ाइल का एक साधारण जोड़ कैसे ठीक किया जाए, यह पता लगाने की तुलना में कि प्लगइन को कैसे ठीक किया जाए।
पिकार्ड 102

प्लगइन्स अनिवार्य रूप से फ़ंक्शन हैं जो थीम के बाहर रहते हैं। आप एक प्लगइन ले सकते हैं और कोड को functions.php में कॉपी कर सकते हैं और यह काम करेगा। इसी तरह, आप फ़ंक्शन से बाहर ले जा सकते हैं। एफपीपी, प्लगइन के लिए आवश्यक हेडर जोड़ सकते हैं, और जैसे ही आप इसे सक्रिय करते हैं वैसे ही काम करता है।
एल्पी

जानकार अच्छा लगा। मैंने आपके द्वारा सुझाए गए दो प्लगइन्स की कोशिश की, लेकिन उनमें से किसी ने भी मुझे वास्तव में वह नहीं करने दिया जिसकी मुझे ज़रूरत थी कि मैं पहले से ही प्लगइन के बिना नहीं कर सकता। सुझावों के लिए धन्यवाद।
पिकार्ड 102
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.