如何在编辑帖子页面上将自定义元框放在编辑器上方、标题部分下方?

时间:2011-12-15 作者:cstrouse

我有一个自定义元框,用于自定义帖子类型,我的客户希望将其放置在标题/永久链接部分和管理面板中的帖子编辑器之间。这是否可能,如果可能,是否有我需要使用的挂钩/过滤器/等?

5 个回复
最合适的回答,由SO网友:Andrew 整理而成

只需使用高级上下文和高优先级添加元框,然后锁定到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\']);
});

SO网友:adamj

以下是您可以移动的方式specific 编辑器上方的元框,但在我发布代码之前,我只想感谢Andrew和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\');

SO网友:mhulse

根据Andrew的回答提供完整的代码示例。。。我需要一种方法,在我的帖子中加入一个“甲板”(又名副标题);我希望甲板字段出现在主标题栏之后。

/**
 * 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\');
显然,上面的代码可能需要更多的工作,但它应该可以帮助其他尝试做同样事情的人(Andrew的回答很清楚,但我认为提供一个实际可行的示例可能会有所帮助)。

This answer also helped.

可以进行的改进:

制作OOP/类我计划在将来的某个时候进行上述改进,但至少上面的代码应该可以帮助其他尝试解决这个问题的人。

看见source code here 为了获得更多灵感(他们选择使用jQuery来移动“子标题”)。

SO网友:titanic_fanatic

与其将高级部分中的所有内容移到顶部,不如创建一个新部分并将其移到顶部:

// 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版本上测试过这个。

SO网友:Hix.botay

还有一种方法,我们可以将编辑器置于任何位置:

注册post\\U类型时从支持参数中删除编辑器

添加一个假的元数据库

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

结束

相关推荐

从Metabox保存数据不起作用

我已经使用了添加metabox的教程。但我的数据不会保存在框中。我在编辑链接页面中有元框,但当我将任何数据放入框中并按下更新按钮时,它不会保存数据。那么实际上,我想知道我什么时候把数据放进框中,我可以使用$\\u POST[]获取数据吗?如果是,请帮助我,使我的代码部分出错。。// backwards compatible add_action( \'admin_init\', \'blc_add_custom_link_box\', 1 ); /*