Як я можу помістити власну метаполею над редактором, але під заголовком розділу на сторінці редагування публікації?


30

У мене є власне мета-вікно для користувацького типу публікації, яке мій клієнт хоче розмістити між розділом заголовка / постійної посилання та редактором публікацій на панелі адміністратора. Чи можливо це, і якщо так, чи є гачок / фільтр / тощо, які мені потрібно буде використовувати?


Тут дуже схоже запитання: wordpress.stackexchange.com/questions/35416/…
Simon East

Відповіді:


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функції. Я спробував ваш код, але метабокси не переміщуються над редактором. Чи можна це використовувати в моєму випадку? Спасибі
лимон

Я б рекомендував використовувати користувальницький $context, а не advancedвикористовувати щось на зразок my_before_editor, щоб ви не переміщували всі метаполе в advancedконтексті, ви спеціально орієнтувались на конкретні
метаполя

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- був ключем у моєму випадку. Дякуємо за інформацію.
Mayeenul Islam

Це була найкорисніша відповідь для мене. Дякую!
marvinpoo

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 для переміщення "підзаголовка").


У випадку, якщо це допомагає тому, хто йде по тому ж шляху: я тут задав запитання, яке має якийсь пов'язаний / подібний код (я вирішив використовувати поле "title" для утримання та фільтрації підзаголовка).
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пріоритету.

Він працює для WordPress 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 та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.