Editörün üstüne ancak meta düzenleme sayfasındaki başlık bölümünün altına nasıl özel bir meta kutusu koyabilirim?


Yanıtlar:


51
  • Gelişmiş içeriği ve yüksek önceliği kullanarak bir meta kutusu ekleyin
  • Sonra, edit_form_after_titlekancaya sabitleyin
  • Meta kutularınızı oraya yazdırın, sonra çıkarın, böylece iki kez görünmez.

    // 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']);
    });
    

Üzerinde çalıştığım bir site register_meta_box_cb, register_post_typefonksiyonun parametresini kullanarak bazı meta kutuları kaydeder . Kodunuzu denedim ancak meta kutular editörün üzerinde hareket etmiyor. Bu benim durumumda kullanılabilir mi? Teşekkürler
leemon 18

Ben göndermek için özel bir öneriyoruz $contextyerine, advancedgibi kullanılması şey, my_before_editorsen tüm meta kutuları hareket etmeyecek şekilde, advancedbağlam, özel olarak .. özel meta kutuları hedef bkz developer.wordpress.org/reference/functions/add_meta_box
farinspace

14

Özel meta kutularını editörün üst kısmına nasıl taşıyabileceğinizi görebilirsiniz , ancak kodu göndermeden önce Andrew ve mhulse'a teşekkür etmek istiyorum. Siz harikasınız!

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-Benimde anahtar benim. Bilgi için teşekkürler.
Mayeenul Islam,

Bu bana en yararlı cevaptı. Teşekkür ederim!
marvinpoo

12

Andrew'un cevabını temel alarak tam kod örneği vermek için ... Yazılarıma "Güverte" (aka alt başlık) eklemek için bir yola ihtiyacım vardı; Güverte alanının ana başlık çubuğundan sonra görünmesini istedim.

/**
 * 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');

Açıkçası, yukarıdaki kod biraz daha fazla iş kullanabiliyordu, ancak başkalarının da aynı şeyleri yapmaya çalışmasına yardım etmeli (Andrew'un cevabı parlaktı, ama aslında çalışan bir örnek vermenin faydalı olabileceğini düşündüm).

Bu cevap da yardımcı oldu .

Yapılabilecek iyileştirmeler:

  1. OOP / sınıf (lar) yapın.
  2. Başlık alanı gibi görünmesini / hissetmesini / davranmasını sağlamak için stiller / js ekleyin.

Yukarıdaki iyileştirmeleri gelecekte bir noktada yapmayı planlıyorum, ancak en azından yukarıdaki kod başkalarının bunu anlamaya çalışmasına yardımcı olmalıdır.

Daha fazla ilham almak için buradaki kaynak koduna bakın ("alt başlığı" taşımak için jQuery kullanmayı seçtiler).


Herkesin aynı yolda ilerlemesine yardımcı olması durumunda: Burada , ilgili / benzer bir kodu olan bir soru sordum (alt başlığı tutmak ve filtrelemek için "başlık" alanını kullanmayı seçtim).
mhulse

6

Gelişmiş bölümdeki her şeyi en üste taşımak yerine, neden yeni bir bölüm oluşturmuyorsunuz?

// 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']);
});

Şimdi yapmanız gereken tek şey topbölüm ve highöncelik için kullanarak meta kutusunu kaydetmek .

Benim için WordPress 4.4.2 üzerinde çalışıyor. Bunu diğer WP versiyonlarında test etmedim.


1

Başka bir yol var, bu arada editörü herhangi bir pozisyona koyabiliriz:

  1. Post_type'yi kaydettiğinizde editörün destek paramından kaldırılması

  2. sahte bir metabox ekle

    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' );

Bilginize, bu hala çalışıyor, ancak kutuyu hareket ettirdiğinizde alanın içeriğiyle bazı garip davranışlara neden olur. Kullanıcılar dikkat edin.
Eckstein
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.