提交帖子以供审阅时的确认框

时间:2013-08-12 作者:Christine Cooper

我遇到的一个新作者经常遇到的问题是,他们在提交文章供审查之前忘记完成一些基本任务(尽管我有一个指南可供他们使用)。

是否可以添加一个确认框,该确认框仅在投稿人单击“提交以供审阅”按钮时出现?可能是这样的jQuery框:

enter image description here

我在webplugin archives 但所有这些都会在发布时触发(而不是提交审查),并提示Javascript警报窗口。

2 个回复
最合适的回答,由SO网友:gmazzap 整理而成

一种有用的快速方法是将JavaScript与输出框的Ajax操作结合使用。

创建一个小插件。在插件目录中创建一个文件夹,命名为“SubmitReviewConf”。在此文件夹中创建一个名为SubmitReviewConf.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“Submit for Review”按钮,并将其替换为与WP按钮相同的按钮,但不会触发提交操作tb_show ThickBox脚本提供的函数仅此而已。记住在WP后端激活插件;)

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

如果此功能是一个关键功能,那么如果禁用了JavaScript,您可能会想禁用发布,但作为一个非关键功能,您可以忽略禁用了JavaScript的用户(在这种情况下,WordPress将负责您的安全),因为他们在用户中所占比例很小。

SO网友:Greeso

这样做是可能的。您必须使用wp_insert_post_data 过滤器挂钩。我会给你一个大致的想法,希望这会有所帮助。

例如:

function my_filter_handler($data , $postarr) {
    // do something with the post data

    // You have to check that your post is submitted for review, not the publish post, so you have to have an if statement checking that

    // Then, you have to ensure that you use jQuery that comes with WordPress (using enqueue methods), and not a jQuery you supply.

    return $data;
}

add_filter(\'wp_insert_post_data\', \'my_filter_handler\', \'99\', 2 );

结束

相关推荐

Http_host在函数中更改。php

我从$_SERVER[\'HTTP_HOST\'] 中的变量functions.php 我们的子主题文件。我们正在NGINX上运行WordPress 3.5.2,页面线2.4是我们的父主题,我可以在必要时详细介绍一些插件。我们的虚拟主机已设置为响应:*.salesgenie.com 因为我们有几个私有标签子域,这将改变网站的品牌。www.salesgenie.com 将是通用域,但att.salesgenie.com 是品牌子域的一个示例。我需要能够检测到客户端调用的子域,我正试图使用该子域$_