मैं एडिटर के ऊपर कस्टम मेटा बॉक्स कैसे लगा सकता हूं लेकिन एडिट पोस्ट पेज पर शीर्षक अनुभाग के नीचे?


30

मेरे पास एक कस्टम पोस्ट प्रकार के लिए एक कस्टम मेटा बॉक्स है जिसे मेरा ग्राहक शीर्षक / पर्मलिंक अनुभाग और व्यवस्थापक पैनल में पोस्ट संपादक के बीच रखना चाहता है। क्या यह संभव है और अगर ऐसा है तो एक हुक / फिल्टर / आदि है जिसे मुझे उपयोग करने की आवश्यकता होगी?


यहाँ बहुत ही समान प्रश्न: wordpress.stackexchange.com/questions/35416/…
साइमन ईस्ट

जवाबों:


51
  • बस उन्नत संदर्भ, और उच्च प्राथमिकता का उपयोग करके एक मेटा बॉक्स जोड़ें
  • फिर, edit_form_after_titleहुक पर कुंडी
  • अपने मेटा बॉक्स को वहां प्रिंट करें, फिर इसे हटा दें ताकि यह दो बार दिखाई न दे।

    // Move all "advanced" metaboxes above the default editor
    add_action('edit_form_after_title', function() {
        global $post, $wp_meta_boxes;
        do_meta_boxes(get_current_screen(), 'advanced', $post);
        unset($wp_meta_boxes[get_post_type($post)]['advanced']);
    });
    

एक साइट जिस पर मैं काम कर रहा हूँ register_meta_box_cb, वह register_post_typeफंक्शन के पैरामीटर का उपयोग करके कुछ मेटाबॉक्स को पंजीकृत करती है। मैंने आपका कोड आज़मा लिया है, लेकिन मेटाबेस संपादक के ऊपर नहीं चलते हैं। क्या यह मेरे मामले में इस्तेमाल किया जा सकता है? धन्यवाद
Leemon

मैं एक कस्टम का उपयोग कर की सिफारिश करेंगे $context, के बजाय advanced, की तरह उपयोग कुछ my_before_editorहै, ताकि आप में सभी मेटा बक्से हिलना मत advancedसंदर्भ, आप विशेष रूप से अपने विशिष्ट मेटा बक्से को लक्षित .. देख developer.wordpress.org/reference/functions/add_meta_box
farinspace

14

यहां बताया गया है कि आप संपादक के ऊपर विशिष्ट मेटा बॉक्स कैसे स्थानांतरित कर सकते हैं , लेकिन इससे पहले कि मैं कोड पोस्ट करूं, मैं एंड्रयू और mhulse को धन्यवाद देना चाहूंगा। तुम लोग कमाल के हो!

function foo_deck( $post_type ) {
    if ( in_array( $post_type, array( 'post', 'page' ) ) ) {
        add_meta_box(
            'contact_details_meta',
            'Contact Details',
            'contact_details_meta',
            $post_type,
            'test', // change to something other then normal, advanced or side
            'high'
        );
    }
}

add_action('add_meta_boxes', 'foo_deck');

function foo_move_deck() {
        # Get the globals:
        global $post, $wp_meta_boxes;

        # Output the "advanced" meta boxes:
        do_meta_boxes( get_current_screen(), 'test', $post );

        # Remove the initial "advanced" meta boxes:
        unset($wp_meta_boxes['post']['test']);
    }

add_action('edit_form_after_title', 'foo_move_deck');

1
change to something other then normal, advanced or side-मेरे मामले में कुंजी। जानकारी के लिए धन्यवाद।
मयीनुल इस्लाम

यह मेरे लिए सबसे मददगार जवाब था। धन्यवाद!
मारविनप्यू

12

एंड्रयू के जवाब के आधार पर एक पूर्ण कोड उदाहरण प्रदान करने के लिए ... मुझे अपनी पोस्ट में "डेक" (उर्फ उपशाखा) शामिल करने का एक तरीका चाहिए; मैं चाहता था कि मुख्य शीर्षक बार के बाद डेक क्षेत्र दिखाई दे।

/**
 * Add a "deck" (aka subhead) meta box to post page(s) and position it
 * under the title.
 *
 * @todo Move to class.
 * @see http://codex.wordpress.org/Function_Reference/add_meta_box
 * @see http://wordpress.org/extend/ideas/topic/add-meta-box-to-multiple-post-types
 * @see https://github.com/Horttcore/WordPress-Subtitle
 * @see http://codex.wordpress.org/Function_Reference/wp_nonce_field
 */

# Adds a box to the main column on the Post and Page edit screens:
function foo_deck($post_type) {

    # Allowed post types to show meta box:
    $post_types = array('post', 'page');

    if (in_array($post_type, $post_types)) {

        # Add a meta box to the administrative interface:
        add_meta_box(
            'foo-deck-meta-box', // HTML 'id' attribute of the edit screen section.
            'Deck',              // Title of the edit screen section, visible to user.
            'foo_deck_meta_box', // Function that prints out the HTML for the edit screen section.
            $post_type,          // The type of Write screen on which to show the edit screen section.
            'advanced',          // The part of the page where the edit screen section should be shown.
            'high'               // The priority within the context where the boxes should show.
        );

    }

}

# Callback that prints the box content:
function foo_deck_meta_box($post) {

    # Use `get_post_meta()` to retrieve an existing value from the database and use the value for the form:
    $deck = get_post_meta($post->ID, '_deck', true);

    # Form field to display:
    ?>

        <label class="screen-reader-text" for="foo_deck">Deck</label>
        <input id="foo_deck" type="text" autocomplete="off" value="<?=esc_attr($deck)?>" name="foo_deck" placeholder="Deck">

    <?php

    # Display the nonce hidden form field:
    wp_nonce_field(
        plugin_basename(__FILE__), // Action name.
        'foo_deck_meta_box'        // Nonce name.
    );

}

/**
 * @see https://wordpress.stackexchange.com/a/16267/32387
 */

# Save our custom data when the post is saved:
function foo_deck_save_postdata($post_id) {

    # Is the current user is authorised to do this action?
    if ((($_POST['post_type'] === 'page') && current_user_can('edit_page', $post_id) || current_user_can('edit_post', $post_id))) { // If it's a page, OR, if it's a post, can the user edit it? 

        # Stop WP from clearing custom fields on autosave:
        if ((( ! defined('DOING_AUTOSAVE')) || ( ! DOING_AUTOSAVE)) && (( ! defined('DOING_AJAX')) || ( ! DOING_AJAX))) {

            # Nonce verification:
            if (wp_verify_nonce($_POST['foo_deck_meta_box'], plugin_basename(__FILE__))) {

                # Get the posted deck:
                $deck = sanitize_text_field($_POST['foo_deck']);

                # Add, update or delete?
                if ($deck !== '') {

                    # Deck exists, so add OR update it:
                    add_post_meta($post_id, '_deck', $deck, true) OR update_post_meta($post_id, '_deck', $deck);

                } else {

                    # Deck empty or removed:
                    delete_post_meta($post_id, '_deck');

                }

            }

        }

    }

}

# Get the deck:
function foo_get_deck($post_id = FALSE) {

    $post_id = ($post_id) ? $post_id : get_the_ID();

    return apply_filters('foo_the_deck', get_post_meta($post_id, '_deck', TRUE));

}

# Display deck (this will feel better when OOP):
function foo_the_deck() {

    echo foo_get_deck(get_the_ID());

}

# Conditional checker:
function foo_has_subtitle($post_id = FALSE) {

    if (foo_get_deck($post_id)) return TRUE;

}

# Define the custom box:
add_action('add_meta_boxes', 'foo_deck');
# Do something with the data entered:
add_action('save_post', 'foo_deck_save_postdata');

/**
 * @see https://wordpress.stackexchange.com/questions/36600
 * @see https://wordpress.stackexchange.com/questions/94530/
 */

# Now move advanced meta boxes after the title:
function foo_move_deck() {

    # Get the globals:
    global $post, $wp_meta_boxes;

    # Output the "advanced" meta boxes:
    do_meta_boxes(get_current_screen(), 'advanced', $post);

    # Remove the initial "advanced" meta boxes:
    unset($wp_meta_boxes['post']['advanced']);

}

add_action('edit_form_after_title', 'foo_move_deck');

जाहिर है, ऊपर दिया गया कोड कुछ और काम कर सकता है, लेकिन इससे दूसरों को भी सामान बनाने में मदद मिलनी चाहिए (एंड्रयू का जवाब प्रकाश चमकता है, लेकिन मुझे लगा कि यह वास्तव में काम करने का उदाहरण देने में मददगार हो सकता है)।

इस जवाब से भी मदद मिली

जो सुधार किए जा सकते हैं:

  1. OOP / वर्ग (तों) बनाएं।
  2. शीर्षक फ़ील्ड की तरह इसे देखने / महसूस करने / व्यवहार करने के लिए शैलियों / js जोड़ें।

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

अधिक प्रेरणा के लिए यहां स्रोत कोड देखें (उन्होंने "उप-शीर्षक" को स्थानांतरित करने के लिए jQuery का उपयोग करने का विकल्प चुना)।


मामले में यह किसी को भी उसी रास्ते से नीचे जाने में मदद करता है: मैंने यहां एक प्रश्न पूछा है जिसमें कुछ संबंधित / समान कोड हैं (मैंने उप शीर्षक को पकड़ने और फ़िल्टर करने के लिए "शीर्षक" फ़ील्ड का उपयोग करने का विकल्प चुना है)।
mhulse

6

उन्नत अनुभाग में सब कुछ शीर्ष पर ले जाने के बजाय, नया अनुभाग क्यों न बनाएं और उसे शीर्ष पर ले जाएं:

// Create 'top' section and move that to the top
add_action('edit_form_after_title', function() {
  global $post, $wp_meta_boxes;
  do_meta_boxes(get_current_screen(), 'top', $post);
  unset($wp_meta_boxes[get_post_type($post)]['top']);
});

अब आपको topकेवल अनुभाग के highलिए और प्राथमिकता के लिए मेटा बॉक्स को पंजीकृत करना होगा ।

यह मेरे लिए वर्डप्रेस 4.4.2 पर काम कर रहा है। मैंने अन्य WP संस्करणों पर इसका परीक्षण नहीं किया है।


1

एक और तरीका है, जिस तरह से हम संपादक को किसी भी स्थिति में डाल सकते हैं:

  1. जब आप post_type रजिस्टर करते हैं तो सपोर्ट परम से एडिटर निकालें

  2. एक नकली मेटाबॉक्स जोड़ें

    add_meta_box( 'does-not-matter', 
    __( 'Description'), 
    function($post){ 
      wp_editor($post->post_content,'post_content',array('name'=>'post_content'));
    },
    'post_type_type', 
    'advanced', 
    'high' );
    

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