根据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/类添加样式/js,使其看起来/感觉/行为与标题字段类似我计划在将来的某个时候进行上述改进,但至少上面的代码应该可以帮助其他尝试解决这个问题的人。
看见source code here 为了获得更多灵感(他们选择使用jQuery来移动“子标题”)。