meta box on new admin page

时间:2017-12-01 作者:mrtnmgs

我使用创建了主题主页设置的新页面add_pages_page(). 在我想使用的页面上wp.media 允许用户从库中选择一个或多个图像(或上载新图像)。我认为应该使用元框,但我无法让框显示出来。下面是我如何尝试添加元框的:

function register_homepage_subpage() {
  add_pages_page( \'Customize Homepage\', \'Homepage\', \'manage_options\', \'my_homepage\', \'my_homepage_callback\' );
}
add_action( \'admin_menu\', \'register_homepage_subpage\' );

function my_homepage_callback() {
  banner_meta_box();
}

function banner_meta_box() {
    $screen_id = get_current_screen()->id;
    add_meta_box("banner-meta-box", __("Banner Options", "textdomain"), "banner_meta_box_callback", $screen-id);
}
add_action( \'add_meta_boxes\', \'banner_meta_box\' );

function banner_meta_box_callback() {
  echo "<h2>My Title</h2>"; // this doesn\'t display
}
This answer 建议元框只用于让我困惑的帖子类型
我不知道我的“menu slug是否符合sanitize\\u key()的限制”,如图所示here.
或者我正在使用wrong hook?
感谢阅读+帮助:)

2 个回复
最合适的回答,由SO网友:LWS-Mo 整理而成

您正在尝试使用创建新的管理页add_pages_page(). 元框仅用于现有帖子类型,不用于管理页面。您需要像在普通管理页面上一样创建字段。

您应该先阅读官方法典:Creating Options Pages

要简单地开始,请看以下示例:

function register_homepage_subpage() {
    add_pages_page( \'Customize Homepage\', \'Homepage\', \'manage_options\', \'my_homepage\', \'my_homepage_callback\' );

    //call to register settings function, to create our settings group
    add_action( \'admin_init\', \'register_homepage_settings\' );
}
add_action( \'admin_menu\', \'register_homepage_subpage\' );
我们创建您的管理页面,就像您在代码中所做的那样。我们还添加了add_action 调用另一个将注册新管理设置的函数:

function register_homepage_settings() {
    //register our settings
    register_setting( \'my-homepage-settings-group\', \'my_option\' );
}
之后,您现在可以启动回调函数:

function my_homepage_callback() { ?>
    <div class="wrap">
        <h1>My Title</h1>

        <form method="post" action="options.php">

            <?php // get registered fields and section
            settings_fields( \'my-homepage-settings-group\' ); 
            do_settings_sections( \'my-homepage-settings-group\' ); ?>

            <table class="form-table">
                <tr valign="top">
                    <th scope="row">My Field</th>
                    <td><input type="text" name="my_option" value="<?php echo esc_attr( get_option(\'my_option\') ); ?>" /></td>
                </tr>
            </table>

            <?php submit_button(); ?>
        </form>

    </div>
<?php }
我们需要form 在该函数中创建,并且submit_button(); 以便能够保存新字段。

我们使用获得注册设置settings_fields( \'my-homepage-settings-group\' );.

添加此代码后,您应该会在管理页面上看到一个标题和一个新的文本字段。您可以输入数据并将其保存。

要创建媒体上传/图像选择字段,您需要更多的代码和jQuery。

首先,您需要一个新按钮来打开wp。媒体窗口。在回调函数中,添加一个新按钮directly after (稍后这一点很重要)我们的文本字段:

...
<td>
    <input type="text" name="my_option" value="<?php echo esc_attr( get_option(\'my_option\') ); ?>" />
    <input type="button" class="button upload_image_button" value="Add Image" />
</td>
...
然后我们必须将默认wp_enqueue_media(); 还有另一个JS文件,它将保存我们的wp代码。媒体窗口。

function prfx_admin_enqueue() {
    // enqueue default WP media uploader
    wp_enqueue_media();

    // enqueue our media uploader script
    wp_enqueue_script( \'prfx-media-script\', plugins_url(\'scripts.js\', __FILE__) );
}
add_action( \'admin_enqueue_scripts\', \'prfx_admin_enqueue\' );
现在我们需要创建scripts.js 文件及其内容:

jQuery(document).ready(function($){
    // if button with class upload_image_button is clicked
    $( \'.upload_image_button\' ).on(\'click\', function() {

        var mediaUploader;
        var button = $(this); // the button with the class uploaded_image_button

        // If the uploader object has already been created, reopen the dialog
        if (mediaUploader) {
            mediaUploader.open();
            return;
        }

        // Extend the wp.media object
        mediaUploader = wp.media.frames.file_frame = wp.media({
            title: \'Choose Image\', // title text
            button: { text: \'Add Image\' }, // but7on text
            library: { type: \'image\' }, // type
            multiple: false // only one selection
        });

        // When a file is selected, grab the URL and set it as the text field\'s value
        mediaUploader.on(\'select\', function() {
            var attachment = mediaUploader.state().get(\'selection\').first().toJSON();

            // find the text input field (previous element from button) and add the new value (URL from media)
            $(button).prev().val(attachment.url);
        });

        // Open the uploader dialog
        mediaUploader.open();

        return false;
    });
});
如果现在单击“新建”按钮,将打开一个正常的WP介质窗口。如果选择图像并单击“添加图像”,则图像中的URL应作为新值添加到文本字段中。

SO网友:Scruffy Paws

您可以在其他非post\\u类型的管理页面上实现元框,但需要手动调用do_meta_boxes() 您希望它们输出到哪里。您还需要确保add_meta_box() 操作在之前运行。

您可以在/wp-admin/edit-form-comment.php...

do_action( \'add_meta_boxes\', \'comment\', $comment );
do_action( \'add_meta_boxes_comment\', $comment );
do_meta_boxes( null, \'normal\', $comment );
他们跑了两个do_actions() 但如果需要,您可以使用一个,它可以是自定义的do_action( \'add_meta_boxes_banner\', $someArgumentIfNeeded ). 基本上,使用当前代码add_meta_box 由于自定义页未运行do_action() 为了它。

对于JS可排序性和展开/折叠,您还需要确保将post排队。js。你需要发帖。js和邮箱。js(后者将与post.js一起提供),您可以像这样排队。。。

wp_enqueue_script( \'post\' );
并将输出打包到类的某个位置metabox-holder 在父级上div 要修复一些损坏的样式。。。

结束