问题描述
我与新作者遇到的一个非常常见的问题是,在提交他们的帖子以进行审查之前,他们忘记完成一些基本任务 (即使我有可用的指南) 。
是否可以添加一个确认框,仅在投稿者点击 「提交审阅」 按钮时出现?有可能这样一个 jQuery 框:
我在 web 和 plugin archives 上遇到了几个确认发布代码,但所有这些都会触发发布 (不提交审阅) 并提示 Javascript 警报窗口。
最佳解决思路
一个有用的快捷方式是使用 JavaScript 与输出框的 Ajax 操作结合使用。
创建一个小插件。在 plugins 目录下创建一个文件夹,命名为’SubmitReviewConf’ 。在此文件夹中创建一个名为 SubmitReviewConf.php
的 PHP 文件。
在这个文件中,放这个代码:
<?php
/**
* Plugin Name: Submit for Review Confirmation Message
* Description: Confirmation Message for Submit for Review Action
* Author: G.M.
*/
function add_my_admin_assets( $hook ) {
// Only once variable force the box to be shown only one time. Can be from theme or plugin via filter.
// Default is true
$only_once = apply_filters( 'submit_review_conf_onlyonce', 1 );
//
if ( $only_once && $hook == 'post.php' ) $post = get_post( $_GET['post'] );
$enqueue = $only_once ? ($hook == 'post-new.php' || ( $hook == 'post.php' && $post->post_status != 'pending') ) : ($hook == 'post-new.php' || $hook == 'post.php');
if ( isset($post) && get_post_meta( $post->ID, '_skip_SubmitReviewConf', true ) ) return;
$postid = '';
if ( isset($_GET['post']) && is_object($post) ) $postid = $post->ID;
if ( $enqueue && ! current_user_can( 'edit_published_posts' ) ) {
wp_enqueue_style( 'thickbox' );
wp_enqueue_script( 'SubmitReviewConf', plugins_url( 'SubmitReviewConf.js', __FILE__ ), array( 'jquery','thickbox' ), null );
wp_localize_script( 'SubmitReviewConf', 'SubmitReviewConfData', array( 'only_once' => $only_once, 'postid' => $postid ) );
}
}
add_action( 'admin_enqueue_scripts', 'add_my_admin_assets', 30 );
function clean_up_SubmitReviewConf_meta( $post ) {
delete_post_meta( $post->ID, '_skip_SubmitReviewConf' );
}
add_action( 'pending_to_publish', 'clean_up_SubmitReviewConf_meta', 30 );
function confirmation_msg_out() {
if ( isset( $_GET['only_once'] ) && isset( $_GET['postid'] ) ) update_post_meta( $_GET['postid'], '_skip_SubmitReviewConf', '1' );
// SET HTML FOR THE CONFIRMATION MESSAGE IN THIS FUNCTION
?>
<div id="confirmation_msg_out">
<ul>
<li><?php _e('Did you ... '); ?></li>
<li><?php _e('Did you ... '); ?></li>
<li><?php _e('Did you ... '); ?></li>
</ul>
<input id="confirmation_msg_submit" class="button button-primary button-large" value="<?php _e('Submit for Review') ?>" name="submitforreview"></input>
<a id="confirmation_msg_submit_cancel" class="button button-large" href="#"><?php _e('Cancel') ?></a>
</div>
<?php
die();
}
add_action( 'wp_ajax_output_review_confirm', 'confirmation_msg_out' );
这个小插件只包含 2 个功能。 (编辑:在注释中的 OP 请求后,变为 3)
第一个排列自定义脚本 (稍后将解释什么) 和’thickbox’ 脚本 (脚本 WordPress 用于显示模态消息) 。
只有当前用户无法编辑已发布的帖子时,这些脚本才会排队,因此作者和更高级的用户可以发布没有确认消息的帖子。
第二个功能输出确认框的 HTML 。这个功能被挂接到一个 Ajax 动作 output_review_confirm
中。
现在在同一个文件夹的 PHP 文件中,我们创建我们的 JavaScript 文件,并命名为 SubmitReviewConf.js
。
在这个文件中:
jQuery().ready( function($) {
var $publish = $('#publish');
var only_once = SubmitReviewConfData.only_once;
function remove_confirm_publish_button() {
$('#confirm-publish-button').remove();
$publish.show();
}
$(document).on('click', '#confirm-publish-button', function(e) {
e.preventDefault();
if ( only_once ) remove_confirm_publish_button();
var tb_show_url = ajaxurl + '?action=output_review_confirm';
if (only_once) tb_show_url += "&only_once=1";
if ( SubmitReviewConfData.postid != '' ) tb_show_url += "&postid=" +
SubmitReviewConfData.postid;
tb_show('', tb_show_url);
});
$(document).on('click', '#confirmation_msg_submit', function(e) {
e.preventDefault();
tb_remove();
$publish.click();
});
$(document).on('click', '#confirmation_msg_submit_cancel', function(e) {
e.preventDefault();
tb_remove();
});
var newbutton = '<input id="confirm-publish-button" class="button button-primary button-large" type="button" value="' +
$publish.val() + '"></input>';
$publish.hide().after(newbutton);
});
这个脚本的作用:
-
隐藏 WordPress 的 「提交审阅」 按钮,并将其替换为与 WP 一样的按钮,但不会触发提交操作。
-
当我们的假提交按钮被点击时,我们使用 Ajax URL 触发我们的函数,并使用 ThickBox 脚本提供的 tb_show 函数在模态确认中输出 HTML 。
-
当用户点击模式框内的 「提交审查」 时,我们模拟 WP 标准 「提交审查」 按钮的点击并删除模态窗口。如果用户点击’Cancel’,我们只需删除模态窗口,什么都不做。
就这样。记住在 WP 后端激活插件;)
请注意,此插件需要在用户浏览器上启用 JavaScript 。如果禁用,用户将看不到任何确认,但是认为该模态窗口 (ThickBox) 是一个 JavaScript 脚本,如果禁用 JavaScript 则无法使用。
如果此功能非常关键,如果禁用 JavaScript,您可能需要禁用发布,但是作为 not-critical 功能,您可以忽略禁用 JavaScript 的用户 (在这种情况下,WordPress 会照顾您的安全性) 他们的用户百分比很小。
参考文献
注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。