问题描述

我与新作者遇到的一个非常常见的问题是,在提交他们的帖子以进行审查之前,他们忘记完成一些基本任务 (即使我有可用的指南) 。

是否可以添加一个确认框,仅在投稿者点击 「提交审阅」 按钮时出现?有可能这样一个 jQuery 框:

我在 webplugin 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);

});

这个脚本的作用:

  1. 隐藏 WordPress 的 「提交审阅」 按钮,并将其替换为与 WP 一样的按钮,但不会触发提交操作。

  2. 当我们的假提交按钮被点击时,我们使用 Ajax URL 触发我们的函数,并使用 ThickBox 脚本提供的 tb_show 函数在模态确认中输出 HTML 。

  3. 当用户点击模式框内的 「提交审查」 时,我们模拟 WP 标准 「提交审查」 按钮的点击并删除模态窗口。如果用户点击’Cancel’,我们只需删除模态窗口,什么都不做。

就这样。记住在 WP 后端激活插件;)

请注意,此插件需要在用户浏览器上启用 JavaScript 。如果禁用,用户将看不到任何确认,但是认为该模态窗口 (ThickBox) 是一个 JavaScript 脚本,如果禁用 JavaScript 则无法使用。

如果此功能非常关键,如果禁用 JavaScript,您可能需要禁用发布,但是作为 not-critical 功能,您可以忽略禁用 JavaScript 的用户 (在这种情况下,WordPress 会照顾您的安全性) 他们的用户百分比很小。

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。