Bagaimana saya bisa menempatkan kotak meta khusus di atas editor tetapi di bawah bagian judul pada halaman edit posting?

30

Saya memiliki kotak meta khusus untuk jenis posting khusus yang ingin ditempatkan oleh klien saya antara bagian judul / permalink dan editor posting di panel admin. Apakah ini mungkin dan jika demikian apakah ada hook / filter / etc yang perlu saya gunakan?

cstrouse
sumber
Pertanyaan yang sangat mirip di sini: wordpress.stackexchange.com/questions/35416/…
Simon East

Jawaban:

51
  • Cukup tambahkan kotak meta menggunakan konteks lanjutan , dan prioritas tinggi
  • Kemudian, kaitkan ke edit_form_after_titlepengait
  • Cetak kotak meta Anda di sana, lalu hapus sehingga tidak muncul dua kali.

    // 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']);
    });
    
Andrew
sumber
Situs yang sedang saya kerjakan mendaftar beberapa metabox menggunakan register_meta_box_cbparameter register_post_typefungsi. Saya sudah mencoba kode Anda tetapi metabox tidak bergerak di atas editor. Bisakah ini digunakan dalam kasus saya? Terima kasih
leemon
Saya akan merekomendasikan menggunakan kustom $context, alih-alih advanced, menggunakan sesuatu seperti my_before_editor, sehingga Anda tidak memindahkan semua kotak meta dalam advancedkonteks, Anda secara khusus menargetkan kotak meta spesifik Anda .. lihat developer.wordpress.org/reference/functions/add_meta_box
farinspace
14

Inilah cara Anda dapat memindahkan kotak meta tertentu di atas editor, tetapi sebelum saya mengirim kode saya hanya ingin mengucapkan terima kasih kepada Andrew dan mhulse. Kalian keren!

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');
adamj
sumber
1
change to something other then normal, advanced or side-adalah kunci dalam kasus saya. Terimakasih atas infonya.
Mayeenul Islam
Ini adalah jawaban yang paling membantu saya. Terima kasih!
marvinpoo
12

Untuk memberikan contoh kode lengkap berdasarkan jawaban Andrew ... Saya membutuhkan cara untuk memasukkan "Deck" (alias subjudul) ke posting saya; Saya ingin bidang dek muncul setelah bilah judul utama.

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

Jelas, kode di atas dapat menggunakan beberapa pekerjaan lagi, tetapi seharusnya membantu orang lain yang mencoba melakukan hal yang sama (jawaban Andrew bersinar, tapi saya pikir mungkin akan membantu untuk benar-benar memberikan contoh yang berfungsi).

Jawaban ini juga membantu .

Perbaikan yang bisa dilakukan:

  1. Buat OOP / kelas.
  2. Tambahkan gaya / js agar terlihat / terasa / berperilaku seperti bidang judul.

Saya berencana untuk melakukan perbaikan di atas di beberapa titik di masa depan, tetapi setidaknya kode di atas akan membantu orang lain mencoba untuk mencari tahu ini.

Lihat kode sumber di sini untuk inspirasi lebih lanjut (mereka memilih untuk menggunakan jQuery untuk memindahkan "subtitle").

mhulse
sumber
Dalam kasus ini membantu siapa pun turun jalan yang sama: Saya sudah mengajukan pertanyaan di sini yang memiliki beberapa kode terkait / serupa (saya memilih untuk menggunakan bidang "judul" untuk menahan dan menyaring subjudul).
mhulse
6

Alih-alih memindahkan segala sesuatu di bagian lanjutan ke atas, mengapa tidak membuat bagian baru dan memindahkannya ke atas:

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

Sekarang yang perlu Anda lakukan adalah mendaftarkan kotak meta menggunakan topuntuk bagian dan highuntuk prioritas.

Ini bekerja pada WordPress 4.4.2 untuk saya. Saya belum menguji ini pada versi WP lainnya.

titanic_fanatic
sumber
1

Ada cara lain, dengan cara kita dapat menempatkan editor pada posisi apa pun:

  1. Hapus editor dari param dukungan ketika Anda mendaftar post_type

  2. tambahkan metabox palsu

    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' );
Hix.botay
sumber
FYI, ini masih berfungsi, tetapi ketika Anda memindahkan kotak itu menyebabkan beberapa perilaku aneh dengan isi bidang. Pengguna berhati-hatilah.
Eckstein