ฉันมีเมตาบ็อกที่กำหนดเองสำหรับประเภทโพสต์ที่กำหนดเองที่ลูกค้าของฉันต้องการวางไว้ระหว่างส่วนชื่อ / Permalink และเครื่องมือแก้ไขโพสต์ในแผงผู้ดูแลระบบ เป็นไปได้และถ้าเป็นเช่นนั้นมีตะขอ / ตัวกรอง / ฯลฯ ที่ฉันจะต้องใช้?
ฉันมีเมตาบ็อกที่กำหนดเองสำหรับประเภทโพสต์ที่กำหนดเองที่ลูกค้าของฉันต้องการวางไว้ระหว่างส่วนชื่อ / Permalink และเครื่องมือแก้ไขโพสต์ในแผงผู้ดูแลระบบ เป็นไปได้และถ้าเป็นเช่นนั้นมีตะขอ / ตัวกรอง / ฯลฯ ที่ฉันจะต้องใช้?
คำตอบ:
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
ฟังก์ชัน ฉันลองใช้รหัสของคุณแล้ว แต่ metaboxes ไม่ได้เลื่อนไปอยู่เหนือเครื่องมือแก้ไข สามารถใช้ในกรณีของฉันได้ไหม ขอบคุณ
$context
แทนที่จะadvanced
ใช้สิ่งที่ชอบmy_before_editor
เพื่อที่คุณจะไม่ย้ายกล่องเมตาทั้งหมดในadvanced
บริบทคุณกำหนดเป้าหมายกล่องเมตาเฉพาะของคุณโดยเฉพาะ .. ดูdeveloper.wordpress.org/reference/functions/add_meta_box
นี่คือวิธีที่คุณสามารถย้ายกล่องเมตาเฉพาะด้านบนตัวแก้ไข แต่ก่อนที่ฉันจะโพสต์รหัสฉันแค่อยากจะขอบคุณแอนดรูว์และมูลูส พวกคุณร็อค!
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');
change to something other then normal, advanced or side
- เป็นกุญแจสำคัญในกรณีของฉัน ขอบคุณสำหรับข้อมูล.
เพื่อให้ตัวอย่างโค้ดแบบเต็มตามคำตอบของแอนดรูว์ ... ฉันต้องการวิธีในการรวม "เด็ค" (หรือหัวเรื่องย่อย) ในโพสต์ของฉัน ฉันต้องการให้ฟิลด์เด็คปรากฏหลังแถบชื่อเรื่องหลัก
/**
* 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');
เห็นได้ชัดว่ารหัสข้างต้นสามารถใช้งานได้มากกว่านี้ แต่ควรช่วยให้ผู้อื่นพยายามทำสิ่งเดียวกัน (คำตอบของแอนดรูว์ส่องแสง แต่ฉันคิดว่ามันอาจเป็นประโยชน์ในการยกตัวอย่างการทำงานจริง)
การปรับปรุงที่สามารถทำได้:
ฉันวางแผนที่จะทำการปรับปรุงข้างต้นในบางจุดในอนาคต แต่อย่างน้อยโค้ดด้านบนจะช่วยให้ผู้อื่นพยายามเข้าใจสิ่งนี้
ดูซอร์สโค้ดที่นี่เพื่อรับแรงบันดาลใจเพิ่มเติม (พวกเขาเลือกใช้ jQuery เพื่อย้าย "sub-title")
แทนที่จะย้ายทุกอย่างในส่วนขั้นสูงไปด้านบนทำไมไม่สร้างส่วนใหม่และย้ายไปด้านบน:
// 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 รุ่นอื่น
มีวิธีอื่นโดยวิธีที่เราสามารถวางบรรณาธิการไปที่ตำแหน่งใด ๆ :
ลบตัวแก้ไขจากส่วนสนับสนุนเมื่อคุณลงทะเบียน post_type
เพิ่ม metabox ปลอม
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' );