web-dev-qa-db-ja.com

レビューの投稿を送信するときの確認ボックス

私が新しい作家と一緒に経験する非常に一般的な問題は彼らが彼らの記事をレビューのために提出する前に彼らがいくつかの重要なタスクを完了するのを忘れるということです。

投稿者が[レビュー用に送信]ボタンをクリックしたときにのみ表示される確認ボックスを追加することはできますか?潜在的にこのようなjQueryのボックス:

enter image description here

私は webプラグインアーカイブ 上のいくつかの確認パブリッシュコードに出会いましたが、それらはすべてPublishSubmit for Reviewではない)とプロンプトでトリガーしますJavascriptアラートウィンドウ.

6

便利で早い方法は、ボックスを出力するAjaxアクションと組み合わせてJavaScriptを使用することです。

小さなプラグインを作りましょう。 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がモーダルメッセージを表示するために使用するスクリプト)をエンキューします。

これらのスクリプトは、現在のユーザーが公開された投稿を編集できない場合にのみキューに入れられるため、作成者や それ以上 ユーザーは確認メッセージなしで投稿を公開できます。

2番目の関数は確認ボックスの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. fake submitボタンをクリックすると、ThickBoxスクリプトが提供するtb_show関数を使用して、Ajax URLを使用して関数を起動し、モーダル確認内にHTMLを出力します。
  3. ユーザーがモーダルボックス内の[レビュー用に送信]をクリックすると、WP標準の[レビュー用に送信]ボタンのクリックがシミュレートされ、モーダルウィンドウが削除されます。ユーザーが「キャンセル」をクリックした場合は、モーダルウィンドウを削除し、何もしません。

それで全部です。 WPバックエンドでプラグインを有効にするのを忘れないでください;)

このプラグインを使用するには、JavaScriptをユーザーのブラウザで有効にする必要があります。無効にするとユーザーに確認が表示されなくなりますが、モーダルウィンドウ(ThickBox)はJavaScriptが無効になっていると機能しないJavaScriptスクリプトであることを考慮してください。

この機能が重要な場合は、JavaScriptが無効になっている場合は公開を無効にしますが、重要ではないので、JavaScriptが無効になっているユーザーは無視してかまいません。 )それらがユーザーのごくわずかな割合であると考える。

11
gmazzap

それは可能です。 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 );
0
Greeso