WordPress开发函数add_meta_box()

WordPress开发函数add_meta_box(),添加一个元框到一个或多个屏幕。 用法: add_met…

WordPress开发函数add_meta_box(),添加一个元框到一个或多个屏幕。

用法:

add_meta_box( string $id, string $title, callable $callback, string|array|WP_Screen $screen = null, string $context = ‘advanced’, string $priority = ‘default’, array $callback_args = null )

参数:

$id

(string) (必需) 元框ID(在元框的’ ID ‘属性中使用)。

$title

(string) (必需) 元框的标题。

$callback

(callable) (必需) 函数,用所需的内容填充框。函数应该回显它的输出。

$screen

(string|array|WP_Screen) (可选) 显示框的屏幕(如帖子类型、“链接”或“评论”)。接受单个屏幕ID、WP_Screen对象或屏幕ID数组。默认是当前屏幕。如果您已经使用了add_menu_page()或add_submenu_page()来创建一个新屏幕(以及screen_id),请确保您的菜单段符合sanitie_key()的限制,否则“屏幕”菜单可能不能正确地在您的页面上呈现。

默认值: null

$context

(string) (可选) 框应该显示在屏幕内的上下文。可用的上下文因屏幕而异。Post edit屏幕上下文包括“普通”、“边”和“高级”。评论屏幕上下文包括“正常”和“边”。菜单元框(手风琴部分)都使用’side’上下文。全球

默认值: ‘advanced’

$priority

(string) (可选) 方框应该显示的上下文中的优先级。接受’high’, ‘core’, ‘default’,或’low’。

默认值: ‘default’

$callback_args

(array) (可选) 数据,应该设置为box数组的$args属性(这是传递给回调函数的第二个参数)。

默认值: null

来源:

文件: wp-admin/includes/template.php

function add_meta_box( $id, $title, $callback, $screen = null, $context = ‘advanced’, $priority = ‘default’, $callback_args = null ) {

global $wp_meta_boxes;

if ( empty( $screen ) ) {

$screen = get_current_screen();

} elseif ( is_string( $screen ) ) {

$screen = convert_to_screen( $screen );

} elseif ( is_array( $screen ) ) {

foreach ( $screen as $single_screen ) {

add_meta_box( $id, $title, $callback, $single_screen, $context, $priority, $callback_args );

}

}

if ( ! isset( $screen->id ) ) {

return;

}

$page = $screen->id;

if ( ! isset( $wp_meta_boxes ) ) {

$wp_meta_boxes = array();

}

if ( ! isset( $wp_meta_boxes[ $page ] ) ) {

$wp_meta_boxes[ $page ] = array();

}

if ( ! isset( $wp_meta_boxes[ $page ][ $context ] ) ) {

$wp_meta_boxes[ $page ][ $context ] = array();

}

foreach ( array_keys( $wp_meta_boxes[ $page ] ) as $a_context ) {

foreach ( array( ‘high’, ‘core’, ‘default’, ‘low’ ) as $a_priority ) {

if ( ! isset( $wp_meta_boxes[ $page ][ $a_context ][ $a_priority ][ $id ] ) ) {

continue;

}

// If a core box was previously removed, don’t add.

if ( ( ‘core’ === $priority || ‘sorted’ === $priority )

&& false === $wp_meta_boxes[ $page ][ $a_context ][ $a_priority ][ $id ]

) {

return;

}

// If a core box was previously added by a plugin, don’t add.

if ( ‘core’ === $priority ) {

/*

* If the box was added with default priority, give it core priority

* to maintain sort order.

*/

if ( ‘default’ === $a_priority ) {

$wp_meta_boxes[ $page ][ $a_context ][‘core’][ $id ] = $wp_meta_boxes[ $page ][ $a_context ][‘default’][ $id ];

unset( $wp_meta_boxes[ $page ][ $a_context ][‘default’][ $id ] );

}

return;

}

// If no priority given and ID already present, use existing priority.

if ( empty( $priority ) ) {

$priority = $a_priority;

/*

* Else, if we’re adding to the sorted priority, we don’t know the title

* or callback. Grab them from the previously added context/priority.

*/

} elseif ( ‘sorted’ === $priority ) {

$title = $wp_meta_boxes[ $page ][ $a_context ][ $a_priority ][ $id ][‘title’];

$callback = $wp_meta_boxes[ $page ][ $a_context ][ $a_priority ][ $id ][‘callback’];

$callback_args = $wp_meta_boxes[ $page ][ $a_context ][ $a_priority ][ $id ][‘args’];

}

// An ID can be in only one priority and one context.

if ( $priority !== $a_priority || $context !== $a_context ) {

unset( $wp_meta_boxes[ $page ][ $a_context ][ $a_priority ][ $id ] );

}

}

}

if ( empty( $priority ) ) {

$priority = ‘low’;

}

if ( ! isset( $wp_meta_boxes[ $page ][ $context ][ $priority ] ) ) {

$wp_meta_boxes[ $page ][ $context ][ $priority ] = array();

}

$wp_meta_boxes[ $page ][ $context ][ $priority ][ $id ] = array(

‘id’ => $id,

‘title’ => $title,

‘callback’ => $callback,

‘args’ => $callback_args,

);

}

更新日志:

WordPress开发函数add_meta_box() (https://www.wpmee.com/) WordPress开发教程 第1张

用户贡献的笔记

(由Codex – 6年前贡献)

这是一个如何在类内部添加元框的例子

/**

* Calls the class on the post edit screen.

*/

function call_someClass() {

new someClass();

}

if ( is_admin() ) {

add_action( ‘load-post.php’, ‘call_someClass’ );

add_action( ‘load-post-new.php’, ‘call_someClass’ );

}

/**

* The Class.

*/

class someClass {

/**

* Hook into the appropriate actions when the class is constructed.

*/

public function __construct() {

add_action( ‘add_meta_boxes’, array( $this, ‘add_meta_box’ ) );

add_action( ‘save_post’, array( $this, ‘save’ ) );

}

/**

* Adds the meta box container.

*/

public function add_meta_box( $post_type ) {

// Limit meta box to certain post types.

$post_types = array( ‘post’, ‘page’ );

if ( in_array( $post_type, $post_types ) ) {

add_meta_box(

‘some_meta_box_name’,

__( ‘Some Meta Box Headline’, ‘textdomain’ ),

array( $this, ‘render_meta_box_content’ ),

$post_type,

‘advanced’,

‘high’

);

}

}

/**

* Save the meta when the post is saved.

*

* @param int $post_id The ID of the post being saved.

*/

public function save( $post_id ) {

/*

* We need to verify this came from the our screen and with proper authorization,

* because save_post can be triggered at other times.

*/

// Check if our nonce is set.

if ( ! isset( $_POST[‘myplugin_inner_custom_box_nonce’] ) ) {

return $post_id;

}

$nonce = $_POST[‘myplugin_inner_custom_box_nonce’];

// Verify that the nonce is valid.

if ( ! wp_verify_nonce( $nonce, ‘myplugin_inner_custom_box’ ) ) {

return $post_id;

}

/*

* If this is an autosave, our form has not been submitted,

* so we don’t want to do anything.

*/

if ( defined( ‘DOING_AUTOSAVE’ ) && DOING_AUTOSAVE ) {

return $post_id;

}

// Check the user’s permissions.

if ( ‘page’ == $_POST[‘post_type’] ) {

if ( ! current_user_can( ‘edit_page’, $post_id ) ) {

return $post_id;

}

} else {

if ( ! current_user_can( ‘edit_post’, $post_id ) ) {

return $post_id;

}

}

/* OK, it’s safe for us to save the data now. */

// Sanitize the user input.

$mydata = sanitize_text_field( $_POST[‘myplugin_new_field’] );

// Update the meta field.

update_post_meta( $post_id, ‘_my_meta_value_key’, $mydata );

}

/**

* Render Meta Box content.

*

* @param WP_Post $post The post object.

*/

public function render_meta_box_content( $post ) {

// Add an nonce field so we can check for it later.

wp_nonce_field( ‘myplugin_inner_custom_box’, ‘myplugin_inner_custom_box_nonce’ );

// Use get_post_meta to retrieve an existing value from the database.

$value = get_post_meta( $post->ID, ‘_my_meta_value_key’, true );

// Display the form, using the current value.

?>

<label for=”myplugin_new_field”>

<?php _e( ‘Description for this field’, ‘textdomain’ ); ?>

</label>

<input type=”text” id=”myplugin_new_field” name=”myplugin_new_field” value=”<?php echo esc_attr( $value ); ?>” size=”25″ />

<?php

}

}

(德鲁·杰恩斯7年前贡献)

/**

* Register meta box(es).

*/

function wpdocs_register_meta_boxes() {

add_meta_box( ‘meta-box-id’, __( ‘My Meta Box’, ‘textdomain’ ), ‘wpdocs_my_display_callback’, ‘post’ );

}

add_action( ‘add_meta_boxes’, ‘wpdocs_register_meta_boxes’ );

/**

* Meta box display callback.

*

* @param WP_Post $post Current post object.

*/

function wpdocs_my_display_callback( $post ) {

// Display code/markup goes here. Don’t forget to include nonces!

}

/**

* Save meta box content.

*

* @param int $post_id Post ID

*/

function wpdocs_save_meta_box( $post_id ) {

// Save logic goes here. Don’t forget to include nonce checks!

}

add_action( ‘save_post’, ‘wpdocs_save_meta_box’ );

(由wpdevco在5年前贡献)

/**

* Register a meta box using a class.

*/

class WPDocs_Custom_Meta_Box {

/**

* Constructor.

*/

public function __construct() {

if ( is_admin() ) {

add_action( ‘load-post.php’, array( $this, ‘init_metabox’ ) );

add_action( ‘load-post-new.php’, array( $this, ‘init_metabox’ ) );

}

}

/**

* Meta box initialization.

*/

public function init_metabox() {

add_action( ‘add_meta_boxes’, array( $this, ‘add_metabox’ ) );

add_action( ‘save_post’, array( $this, ‘save_metabox’ ), 10, 2 );

}

/**

* Adds the meta box.

*/

public function add_metabox() {

add_meta_box(

‘my-meta-box’,

__( ‘My Meta Box’, ‘textdomain’ ),

array( $this, ‘render_metabox’ ),

‘post’,

‘advanced’,

‘default’

);

}

/**

* Renders the meta box.

*/

public function render_metabox( $post ) {

// Add nonce for security and authentication.

wp_nonce_field( ‘custom_nonce_action’, ‘custom_nonce’ );

}

/**

* Handles saving the meta box.

*

* @param int $post_id Post ID.

* @param WP_Post $post Post object.

* @return null

*/

public function save_metabox( $post_id, $post ) {

// Add nonce for security and authentication.

$nonce_name = isset( $_POST[‘custom_nonce’] ) ? $_POST[‘custom_nonce’] : ”;

$nonce_action = ‘custom_nonce_action’;

// Check if nonce is valid.

if ( ! wp_verify_nonce( $nonce_name, $nonce_action ) ) {

return;

}

// Check if user has permissions to save data.

if ( ! current_user_can( ‘edit_post’, $post_id ) ) {

return;

}

// Check if not an autosave.

if ( wp_is_post_autosave( $post_id ) ) {

return;

}

// Check if not a revision.

if ( wp_is_post_revision( $post_id ) ) {

return;

}

}

}

new WPDocs_Custom_Meta_Box();

(由Codex – 6年前贡献)

回调参数

$callback_args数组将作为第二个参数传递给回调函数。第一个参数是post的$post对象。

/**

* This function adds a meta box with a callback function of my_metabox_callback()

*/

function add_wpdocs_meta_box() {

$var1 = ‘this’;

$var2 = ‘that’;

add_meta_box(

‘metabox_id’,

__( ‘Metabox Title’, ‘textdomain’ ),

‘wpdocs_metabox_callback’,

‘page’,

‘normal’,

‘low’,

array( ‘foo’ => $var1, ‘bar’ => $var2 )

);

}

/**

* Get post meta in a callback

*

* @param WP_Post $post The current post.

* @param array $metabox With metabox id, title, callback, and args elements.

*/

function wpdocs_metabox_callback( $post, $metabox ) {

// Output last time the post was modified.

echo ‘Last Modified: ‘ . $post->post_modified;

// Output ‘this’.

echo $metabox[‘args’][‘foo’];

// Output ‘that’.

echo $metabox[‘args’][‘bar’];

// Output value of custom field.

echo get_post_meta( $post->ID, ‘wpdocs_custom_field’, true );

}

(由obiPlabon贡献- 5年前)

这是注册菜单屏幕metabox的方法:)

function op_register_menu_meta_box() {

add_meta_box(

‘op-menu-meta-box-id’,

esc_html__( ‘Op Menu MetaBox Title’, ‘text-domain’ ),

‘op_render_menu_meta_box’,

‘nav-menus’,

‘side’,

‘core’

);

}

add_action( ‘load-nav-menus.php’, ‘op_register_menu_meta_box’ );

function op_render_menu_meta_box() {

// Metabox content

echo ‘<strong>Hi, I am MetaBox.</strong>’;

}

(2年前由yitwaail提供)

在我看来,这个页面应该引用$callback_args的` __block_editor_compatible_meta_box `和` __back_compat_meta_box `选项,如本文所述:https://make.wordpress.org/core/2018/11/07/meta-box-compatibility-flags/

(由大卫贡献- 5年前)

一个经常被遗忘但也非常重要的事实是,任何save_post处理程序都应该检查多站点切换上下文。这里有一个这样的守卫的例子:

<?php

namespace DevWpNoteMetaBox;

add_action( ‘save_post’, __NAMESPACE_ . ‘save_fields’, 10, 3 );

function save_fields( $post_id, WP_Post $post, $update ) {

// check nonce …

// check autosave …

// check user capabilities …

// check if there was a multisite switch before

if ( is_multisite() && ms_is_switched() ) {

return $post_id;

}

// handle your meta box input …

}

这确保了与其他使用switch_to_blog()的插件在处理save_post钩子时的兼容性。如果他们在其他站点上再次调用wp_insert_post(),您的代码将覆盖错误的内容而不进行此检查。

(由Rubel Miah于4年前贡献)

//Register Meta Box

function rm_register_meta_box() {

add_meta_box( ‘rm-meta-box-id’, esc_html__( ‘RM MetaBox Title’, ‘text-domain’ ), ‘rm_meta_box_callback’, ‘post’, ‘advanced’, ‘high’ );

}

add_action( ‘add_meta_boxes’, ‘rm_register_meta_box’);

//Add field

function rm_meta_box_callback( $meta_id ) {

$outline = ‘<label for=”title_field” style=”width:150px; display:inline-block;”>’. esc_html__(‘Title Field’, ‘text-domain’) .'</label>’;

$title_field = get_post_meta( $meta_id->ID, ‘title_field’, true );

$outline .= ‘<input type=”text” name=”title_field” id=”title_field” class=”title_field” value=”‘. esc_attr($title_field) .’” style=”width:300px;”/>’;

echo $outline;

}

(由Md.Mehedi Hasan贡献- 1年前)

例子:

//Register Meta box

add_action(‘add_meta_boxes’,function (){

add_meta_box(‘csm-id’,’Social link’,’cm_field_cb’,’post’,’side’);

});

//Meta callback function

function cm_field_cb($post){

$cs_meta_val=get_post_meta($post->ID);

?>

<input type=”url” name=”cs-meta-name”

value=”<?php if( isset ( $cs_meta_val[‘cs-meta-name’])) echo $cs_meta_val[‘cs-meta-name’][0] ?>” >

<?php

}

//save meta value with save post hook

add_action(‘save_post’,function($post_id){

if(isset($_POST[‘cs-meta-name’])){

update_post_meta($post_id,’cs-meta-name’,$_POST[‘cs-meta-name’]);

}

});

// show meta value after post content

add_filter(‘the_content’,function($content){

$meta_val=get_post_meta(get_the_ID(),’cs-meta-name’,true);

return $cotent.$meta_val;

});

  (由Kuba Mikita于4年前贡献)

这就是在save_post操作中处理metabox数据的方式。

function save_metabox_callback( $post_id ) {

if ( ! isset( $_POST[‘nonce’] ) ) {

return;

}

if ( ! wp_verify_nonce( $_POST[‘nonce’], ‘nonce_value’ ) ) {

return;

}

if ( defined( ‘DOING_AUTOSAVE’ ) && DOING_AUTOSAVE ) {

return;

}

if ( ! current_user_can( ‘edit_post’, $post_id ) ) {

return;

}

if ( isset( $_POST[‘post_type’] ) && ‘page’ === $_POST[‘post_type’] ) {

// do stuff

}

// Check if $_POST field(s) are available

// Sanitize

// Save

}

add_action( ‘save_post’, ‘save_metabox_callback’ );

(由Vincent Dubroeucq贡献- 1年前)

在metabox上的评论有轻微的缺陷

如果您需要向注释编辑屏幕添加一个metabox,您必须为$context参数传入值’ normal ‘。

// This will NOT work

add_meta_box(

‘my_comment_metabox_1’, // ID

__(‘My comment metabox 1’ ), // Title

‘prefix_comment_metabox’, // Callback

‘comment’ // Screen

);

// This WILL work. Same call, but with ‘normal’ for context instead of default ‘advanced’

add_meta_box(

‘my_comment_metabox_2’, // ID

__(‘My comment metabox 2’ ), // Title

‘prefix_comment_metabox’, // Callback

‘comment’, // Screen

‘normal’ // Context

);

类别:WordPress函数讲解

本文收集自互联网,转载请注明来源。
如有侵权,请联系 wper_net@163.com 删除。

评论 (0)COMMENT

登录 账号发表你的看法,还没有账号?立即免费 注册