WordPress Version: 6.4
/**
* WordPress Administration Meta Boxes API.
*
* @package WordPress
* @subpackage Administration
*/
//
// Post-related Meta Boxes.
//
/**
* Displays post submit form fields.
*
* @since 2.7.0
*
* @global string $action
*
* @param WP_Post $post Current post object.
* @param array $args {
* Array of arguments for building the post submit meta box.
*
* @type string $id Meta box 'id' attribute.
* @type string $title Meta box title.
* @type callable $callback Meta box display callback.
* @type array $args Extra meta box arguments.
* }
*/
function post_submit_meta_box($post, $args = array())
{
global $action;
$post_id = (int) $post->ID;
$post_type = $post->post_type;
$post_type_object = get_post_type_object($post_type);
$can_publish = current_user_can($post_type_object->cap->publish_posts);
?>
<div class="submitbox" id="submitpost">
<div id="minor-publishing">
<?php
// Hidden submit button early on so that the browser chooses the right button when form is submitted with Return key.
?>
<div style="display:none;">
<?php
submit_button(__('Save'), '', 'save');
?>
</div>
<div id="minor-publishing-actions">
<div id="save-action">
<?php
if (!in_array($post->post_status, array('publish', 'future', 'pending'), true)) {
$private_style = '';
if ('private' === $post->post_status) {
$private_style = 'style="display:none"';
}
?>
<input <?php
echo $private_style;
?> type="submit" name="save" id="save-post" value="<?php
esc_attr_e('Save Draft');
?>" class="button" />
<span class="spinner"></span>
<?php
} elseif ('pending' === $post->post_status && $can_publish) {
?>
<input type="submit" name="save" id="save-post" value="<?php
esc_attr_e('Save as Pending');
?>" class="button" />
<span class="spinner"></span>
<?php
}
?>
</div>
<?php
if (is_post_type_viewable($post_type_object)) {
?>
<div id="preview-action">
<?php
$preview_link = esc_url(get_preview_post_link($post));
if ('publish' === $post->post_status) {
$preview_button_text = __('Preview Changes');
} else {
$preview_button_text = __('Preview');
}
$preview_button = sprintf(
'%1$s<span class="screen-reader-text"> %2$s</span>',
$preview_button_text,
/* translators: Hidden accessibility text. */
__('(opens in a new tab)')
);
?>
<a class="preview button" href="<?php
echo $preview_link;
?>" target="wp-preview-<?php
echo $post_id;
?>" id="post-preview"><?php
echo $preview_button;
?></a>
<input type="hidden" name="wp-preview" id="wp-preview" value="" />
</div>
<?php
}
/**
* Fires after the Save Draft (or Save as Pending) and Preview (or Preview Changes) buttons
* in the Publish meta box.
*
* @since 4.4.0
*
* @param WP_Post $post WP_Post object for the current post.
*/
do_action('post_submitbox_minor_actions', $post);
?>
<div class="clear"></div>
</div>
<div id="misc-publishing-actions">
<div class="misc-pub-section misc-pub-post-status">
<?php
_e('Status:');
?>
<span id="post-status-display">
<?php
switch ($post->post_status) {
case 'private':
_e('Privately Published');
break;
case 'publish':
_e('Published');
break;
case 'future':
_e('Scheduled');
break;
case 'pending':
_e('Pending Review');
break;
case 'draft':
case 'auto-draft':
_e('Draft');
break;
}
?>
</span>
<?php
if ('publish' === $post->post_status || 'private' === $post->post_status || $can_publish) {
$private_style = '';
if ('private' === $post->post_status) {
$private_style = 'style="display:none"';
}
?>
<a href="#post_status" <?php
echo $private_style;
?> class="edit-post-status hide-if-no-js" role="button"><span aria-hidden="true"><?php
_e('Edit');
?></span> <span class="screen-reader-text">
<?php
/* translators: Hidden accessibility text. */
_e('Edit status');
?>
</span></a>
<div id="post-status-select" class="hide-if-js">
<input type="hidden" name="hidden_post_status" id="hidden_post_status" value="<?php
echo esc_attr(('auto-draft' === $post->post_status) ? 'draft' : $post->post_status);
?>" />
<label for="post_status" class="screen-reader-text">
<?php
/* translators: Hidden accessibility text. */
_e('Set status');
?>
</label>
<select name="post_status" id="post_status">
<?php
if ('publish' === $post->post_status) {
?>
<option<?php
selected($post->post_status, 'publish');
?> value='publish'><?php
_e('Published');
?></option>
<?php
} elseif ('private' === $post->post_status) {
?>
<option<?php
selected($post->post_status, 'private');
?> value='publish'><?php
_e('Privately Published');
?></option>
<?php
} elseif ('future' === $post->post_status) {
?>
<option<?php
selected($post->post_status, 'future');
?> value='future'><?php
_e('Scheduled');
?></option>
<?php
}
?>
<option<?php
selected($post->post_status, 'pending');
?> value='pending'><?php
_e('Pending Review');
?></option>
<?php
if ('auto-draft' === $post->post_status) {
?>
<option<?php
selected($post->post_status, 'auto-draft');
?> value='draft'><?php
_e('Draft');
?></option>
<?php
} else {
?>
<option<?php
selected($post->post_status, 'draft');
?> value='draft'><?php
_e('Draft');
?></option>
<?php
}
?>
</select>
<a href="#post_status" class="save-post-status hide-if-no-js button"><?php
_e('OK');
?></a>
<a href="#post_status" class="cancel-post-status hide-if-no-js button-cancel"><?php
_e('Cancel');
?></a>
</div>
<?php
}
?>
</div>
<div class="misc-pub-section misc-pub-visibility" id="visibility">
<?php
_e('Visibility:');
?>
<span id="post-visibility-display">
<?php
if ('private' === $post->post_status) {
$post->post_password = '';
$visibility = 'private';
$visibility_trans = __('Private');
} elseif (!empty($post->post_password)) {
$visibility = 'password';
$visibility_trans = __('Password protected');
} elseif ('post' === $post_type && is_sticky($post_id)) {
$visibility = 'public';
$visibility_trans = __('Public, Sticky');
} else {
$visibility = 'public';
$visibility_trans = __('Public');
}
echo esc_html($visibility_trans);
?>
</span>
<?php
if ($can_publish) {
?>
<a href="#visibility" class="edit-visibility hide-if-no-js" role="button"><span aria-hidden="true"><?php
_e('Edit');
?></span> <span class="screen-reader-text">
<?php
/* translators: Hidden accessibility text. */
_e('Edit visibility');
?>
</span></a>
<div id="post-visibility-select" class="hide-if-js">
<input type="hidden" name="hidden_post_password" id="hidden-post-password" value="<?php
echo esc_attr($post->post_password);
?>" />
<?php
if ('post' === $post_type) {
?>
<input type="checkbox" style="display:none" name="hidden_post_sticky" id="hidden-post-sticky" value="sticky" <?php
checked(is_sticky($post_id));
?> />
<?php
}
?>
<input type="hidden" name="hidden_post_visibility" id="hidden-post-visibility" value="<?php
echo esc_attr($visibility);
?>" />
<input type="radio" name="visibility" id="visibility-radio-public" value="public" <?php
checked($visibility, 'public');
?> /> <label for="visibility-radio-public" class="selectit"><?php
_e('Public');
?></label><br />
<?php
if ('post' === $post_type && current_user_can('edit_others_posts')) {
?>
<span id="sticky-span"><input id="sticky" name="sticky" type="checkbox" value="sticky" <?php
checked(is_sticky($post_id));
?> /> <label for="sticky" class="selectit"><?php
_e('Stick this post to the front page');
?></label><br /></span>
<?php
}
?>
<input type="radio" name="visibility" id="visibility-radio-password" value="password" <?php
checked($visibility, 'password');
?> /> <label for="visibility-radio-password" class="selectit"><?php
_e('Password protected');
?></label><br />
<span id="password-span"><label for="post_password"><?php
_e('Password:');
?></label> <input type="text" name="post_password" id="post_password" value="<?php
echo esc_attr($post->post_password);
?>" maxlength="255" /><br /></span>
<input type="radio" name="visibility" id="visibility-radio-private" value="private" <?php
checked($visibility, 'private');
?> /> <label for="visibility-radio-private" class="selectit"><?php
_e('Private');
?></label><br />
<p>
<a href="#visibility" class="save-post-visibility hide-if-no-js button"><?php
_e('OK');
?></a>
<a href="#visibility" class="cancel-post-visibility hide-if-no-js button-cancel"><?php
_e('Cancel');
?></a>
</p>
</div>
<?php
}
?>
</div>
<?php
/* translators: Publish box date string. 1: Date, 2: Time. See https://www.php.net/manual/datetime.format.php */
$date_string = __('%1$s at %2$s');
/* translators: Publish box date format, see https://www.php.net/manual/datetime.format.php */
$date_format = _x('M j, Y', 'publish box date format');
/* translators: Publish box time format, see https://www.php.net/manual/datetime.format.php */
$time_format = _x('H:i', 'publish box time format');
if (0 !== $post_id) {
if ('future' === $post->post_status) {
// Scheduled for publishing at a future date.
/* translators: Post date information. %s: Date on which the post is currently scheduled to be published. */
$stamp = __('Scheduled for: %s');
} elseif ('publish' === $post->post_status || 'private' === $post->post_status) {
// Already published.
/* translators: Post date information. %s: Date on which the post was published. */
$stamp = __('Published on: %s');
} elseif ('0000-00-00 00:00:00' === $post->post_date_gmt) {
// Draft, 1 or more saves, no date specified.
$stamp = __('Publish <b>immediately</b>');
} elseif (time() < strtotime($post->post_date_gmt . ' +0000')) {
// Draft, 1 or more saves, future date specified.
/* translators: Post date information. %s: Date on which the post is to be published. */
$stamp = __('Schedule for: %s');
} else {
// Draft, 1 or more saves, date specified.
/* translators: Post date information. %s: Date on which the post is to be published. */
$stamp = __('Publish on: %s');
}
$date = sprintf($date_string, date_i18n($date_format, strtotime($post->post_date)), date_i18n($time_format, strtotime($post->post_date)));
} else {
// Draft (no saves, and thus no date specified).
$stamp = __('Publish <b>immediately</b>');
$date = sprintf($date_string, date_i18n($date_format, strtotime(current_time('mysql'))), date_i18n($time_format, strtotime(current_time('mysql'))));
}
if (!empty($args['args']['revisions_count'])) {
?>
<div class="misc-pub-section misc-pub-revisions">
<?php
/* translators: Post revisions heading. %s: The number of available revisions. */
printf(__('Revisions: %s'), '<b>' . number_format_i18n($args['args']['revisions_count']) . '</b>');
?>
<a class="hide-if-no-js" href="<?php
echo esc_url(get_edit_post_link($args['args']['revision_id']));
?>"><span aria-hidden="true"><?php
_ex('Browse', 'revisions');
?></span> <span class="screen-reader-text">
<?php
/* translators: Hidden accessibility text. */
_e('Browse revisions');
?>
</span></a>
</div>
<?php
}
if ($can_publish) {
// Contributors don't get to choose the date of publish.
?>
<div class="misc-pub-section curtime misc-pub-curtime">
<span id="timestamp">
<?php
printf($stamp, '<b>' . $date . '</b>');
?>
</span>
<a href="#edit_timestamp" class="edit-timestamp hide-if-no-js" role="button">
<span aria-hidden="true"><?php
_e('Edit');
?></span>
<span class="screen-reader-text">
<?php
/* translators: Hidden accessibility text. */
_e('Edit date and time');
?>
</span>
</a>
<fieldset id="timestampdiv" class="hide-if-js">
<legend class="screen-reader-text">
<?php
/* translators: Hidden accessibility text. */
_e('Date and time');
?>
</legend>
<?php
touch_time('edit' === $action, 1);
?>
</fieldset>
</div>
<?php
}
if ('draft' === $post->post_status && get_post_meta($post_id, '_customize_changeset_uuid', true)) {
$message = sprintf(
/* translators: %s: URL to the Customizer. */
__('This draft comes from your <a href="%s">unpublished customization changes</a>. You can edit, but there is no need to publish now. It will be published automatically with those changes.'),
esc_url(add_query_arg('changeset_uuid', rawurlencode(get_post_meta($post_id, '_customize_changeset_uuid', true)), admin_url('customize.php')))
);
wp_admin_notice($message, array('type' => 'info', 'additional_classes' => array('notice-alt', 'inline')));
}
/**
* Fires after the post time/date setting in the Publish meta box.
*
* @since 2.9.0
* @since 4.4.0 Added the `$post` parameter.
*
* @param WP_Post $post WP_Post object for the current post.
*/
do_action('post_submitbox_misc_actions', $post);
?>
</div>
<div class="clear"></div>
</div>
<div id="major-publishing-actions">
<?php
/**
* Fires at the beginning of the publishing actions section of the Publish meta box.
*
* @since 2.7.0
* @since 4.9.0 Added the `$post` parameter.
*
* @param WP_Post|null $post WP_Post object for the current post on Edit Post screen,
* null on Edit Link screen.
*/
do_action('post_submitbox_start', $post);
?>
<div id="delete-action">
<?php
if (current_user_can('delete_post', $post_id)) {
if (!EMPTY_TRASH_DAYS) {
$delete_text = __('Delete permanently');
} else {
$delete_text = __('Move to Trash');
}
?>
<a class="submitdelete deletion" href="<?php
echo get_delete_post_link($post_id);
?>"><?php
echo $delete_text;
?></a>
<?php
}
?>
</div>
<div id="publishing-action">
<span class="spinner"></span>
<?php
if (!in_array($post->post_status, array('publish', 'future', 'private'), true) || 0 === $post_id) {
if ($can_publish) {
if (!empty($post->post_date_gmt) && time() < strtotime($post->post_date_gmt . ' +0000')) {
?>
<input name="original_publish" type="hidden" id="original_publish" value="<?php
echo esc_attr_x('Schedule', 'post action/button label');
?>" />
<?php
submit_button(_x('Schedule', 'post action/button label'), 'primary large', 'publish', false);
?>
<?php
} else {
?>
<input name="original_publish" type="hidden" id="original_publish" value="<?php
esc_attr_e('Publish');
?>" />
<?php
submit_button(__('Publish'), 'primary large', 'publish', false);
?>
<?php
}
} else {
?>
<input name="original_publish" type="hidden" id="original_publish" value="<?php
esc_attr_e('Submit for Review');
?>" />
<?php
submit_button(__('Submit for Review'), 'primary large', 'publish', false);
?>
<?php
}
} else {
?>
<input name="original_publish" type="hidden" id="original_publish" value="<?php
esc_attr_e('Update');
?>" />
<?php
submit_button(__('Update'), 'primary large', 'save', false, array('id' => 'publish'));
?>
<?php
}
?>
</div>
<div class="clear"></div>
</div>
</div>
<?php
}