Làm cách nào tôi có thể đặt hộp meta tùy chỉnh phía trên trình chỉnh sửa nhưng bên dưới phần tiêu đề trên trang chỉnh sửa bài đăng?


30

Tôi có một hộp meta tùy chỉnh cho loại bài đăng tùy chỉnh mà khách hàng của tôi muốn đặt giữa phần tiêu đề / permalink và trình chỉnh sửa bài đăng trong bảng quản trị. Điều này có thể không và nếu có thì có hook / filter / etc mà tôi sẽ cần sử dụng không?


Câu hỏi rất giống nhau ở đây: wordpress.stackexchange.com/questions/35416/iêng
Simon East

Câu trả lời:


51
  • Chỉ cần thêm một hộp meta bằng cách sử dụng bối cảnh nâng caomức độ ưu tiên cao
  • Sau đó, chốt vào edit_form_after_titlemóc
  • In các hộp meta của bạn ra khỏi đó, sau đó loại bỏ nó để nó không xuất hiện hai lần.

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

Một trang web tôi đang làm việc để đăng ký một số metaboxes bằng cách sử dụng register_meta_box_cbtham số của register_post_typehàm. Tôi đã thử mã của bạn nhưng metaboxes không di chuyển lên trên trình chỉnh sửa. Điều này có thể được sử dụng trong trường hợp của tôi? Cảm ơn
leemon

Tôi khuyên bạn nên sử dụng một tùy chỉnh $context, thay vì advancedsử dụng một cái gì đó như my_before_editor, để bạn không di chuyển tất cả các hộp meta trong advancedngữ cảnh, bạn đặc biệt nhắm mục tiêu các hộp meta cụ thể của mình .. xem developer.wordpress.org/reference/fiances/add_meta_box
farinspace

14

Đây là cách bạn có thể di chuyển các hộp meta cụ thể phía trên trình soạn thảo, nhưng trước khi tôi đăng mã, tôi chỉ muốn cảm ơn Andrew và mhulse. Các bạn đá!

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- là chìa khóa trong trường hợp của tôi. Cảm ơn bạn về thông tin.
Hồi giáo Mayeenul

Đây là câu trả lời hữu ích nhất cho tôi. Cảm ơn bạn!
marvinpoo

12

Để cung cấp một ví dụ mã đầy đủ dựa trên câu trả lời của Andrew ... Tôi cần một cách để đưa "Bộ bài" (còn gọi là tiêu đề phụ) vào bài đăng của mình; Tôi muốn trường boong xuất hiện sau thanh tiêu đề chính.

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

Rõ ràng, đoạn mã trên có thể sử dụng một số công việc khác, nhưng nó sẽ giúp những người khác cố gắng làm điều tương tự (câu trả lời của Andrew làm sáng tỏ, nhưng tôi nghĩ rằng nó có thể hữu ích để thực sự cung cấp một ví dụ hoạt động).

Câu trả lời này cũng có ích .

Những cải tiến có thể được thực hiện:

  1. Tạo OOP / lớp (es).
  2. Thêm kiểu / js để làm cho nó trông / cảm nhận / hành xử giống như trường tiêu đề.

Tôi dự định thực hiện các cải tiến ở một thời điểm nào đó trong tương lai, nhưng ít nhất mã trên sẽ giúp những người khác cố gắng tìm ra điều này.

Xem mã nguồn ở đây để có thêm cảm hứng (họ đã chọn sử dụng jQuery để di chuyển "tiêu đề phụ").


Trong trường hợp nó giúp bất kỳ ai đi vào cùng một đường dẫn: Tôi đã hỏi một câu hỏi ở đây có một số mã tương tự / tương tự (tôi đã chọn sử dụng trường "tiêu đề" để giữ và lọc tiêu đề phụ).
mhulse

6

Thay vì di chuyển mọi thứ trong phần nâng cao lên trên cùng, tại sao bạn không tạo phần mới và di chuyển phần đó lên trên cùng:

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

Bây giờ tất cả những gì bạn cần làm là đăng ký hộp meta sử dụng topcho phần và highmức độ ưu tiên.

Nó hoạt động trên WordPress 4.4.2 đối với tôi. Tôi chưa thử nghiệm điều này trên các phiên bản WP khác.


1

Có một cách khác, bằng cách này, chúng ta có thể đặt trình soạn thảo vào bất kỳ vị trí nào:

  1. Xóa trình chỉnh sửa khỏi param param khi bạn đăng ký post_type

  2. thêm một metabox giả

    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, điều này vẫn hoạt động, nhưng khi bạn di chuyển hộp, nó gây ra một số hành vi kỳ lạ với nội dung của trường. Người dùng hãy cẩn thận.
Eckstein
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.