web-dev-qa-db-fra.com

Boîte de confirmation lors de la soumission d'un post pour révision

Un problème très courant que je rencontre avec les nouveaux auteurs est qu’ils oublient de terminer quelques tâches essentielles avant de soumettre leur message à la relecture (même si j’ai un guide à leur disposition).

Est-il possible d'ajouter une boîte de confirmation qui apparaît uniquement lorsqu'un contributeur clique sur le bouton "Soumettre pour révision"? Potentiellement une boîte jQuery comme ceci:

enter image description here

Je suis tombé sur quelques codes de publication confirmés sur les Web _ et archives de plug-ins , mais qui déclenchent tous sur Publish (not Submit for Review ) et ouvre une fenêtre d’alerte Javascript.

6
Christine Cooper

Un moyen rapide et utile consiste à utiliser JavaScript en combinaison avec une action Ajax qui génère la boîte.

Créez un petit plugin. Créez un dossier dans le répertoire plugins, en le nommant 'SubmitReviewConf'. Dans ce dossier, créez un fichier PHP nommé SubmitReviewConf.php.

Dans ce fichier, mettez ce code:

<?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' );

Ce petit plugin ne contient que 2 fonctions. (Edit: après une requête OP dans les commentaires, il est devenu 3)

La première met en file d'attente un script personnalisé (qu'est-ce qui est expliqué plus tard) et le script 'thickbox' (le script utilisé par WordPress pour afficher des messages modaux).

Ces scripts sont mis en file d'attente uniquement si l'utilisateur actuel ne peut pas modifier les publications publiées. Par conséquent, les auteurs et supérieur les utilisateurs peuvent publier des publications sans message de confirmation.

La deuxième fonction génère le code HTML pour la boîte de confirmation. Cette fonction est liée à une action Ajax, output_review_confirm.

Maintenant, dans le même dossier que PHP fichiers, créons notre fichier JavaScript et appelons-le SubmitReviewConf.js.

Dans ce fichier, mettez:

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);

});

Ce que fait ce script:

  1. Masque le bouton "Soumettre à la révision" de WordPress et le remplace par un bouton qui semble être identique à celui de WP, mais ne déclenche pas l'action d'envoi.
  2. Lorsque nous cliquons sur notre bouton fake submit, nous utilisons l'URL Ajax pour déclencher notre fonction et générer le code HTML à l'intérieur de la confirmation modale, à l'aide de la fonction tb_show fournie par le script ThickBox.
  3. Lorsque l'utilisateur clique sur "Soumettre pour révision" dans la zone modale, nous simulons un clic sur le bouton WP standard "Soumettre pour révision" et supprimons la fenêtre modale. Si l'utilisateur clique sur 'Annuler', nous supprimons simplement la fenêtre modale sans rien faire.

C'est tout. N'oubliez pas d'activer le plugin dans WP backend;)

Notez que ce plugin nécessite l'activation de JavaScript sur le navigateur de l'utilisateur. Si cette option est désactivée, l'utilisateur ne verra aucune confirmation, mais considérons que la fenêtre modale (ThickBox) est un script JavaScript qui ne peut pas fonctionner si JavaScript est désactivé.

Si cette fonctionnalité était critique, vous voudrez probablement désactiver la publication si JavaScript est désactivé, mais comme il s'agit d'une fonctionnalité non critique, vous pouvez simplement ignorer les utilisateurs dont JavaScript est désactivé (WordPress se chargera de votre sécurité, dans ce cas ) considérant qu’ils ne représentent qu’un très faible pourcentage des utilisateurs.

11
gmazzap

Il est possible de le faire. Vous devez utiliser le hook de filtre wp_insert_post_data. Je vais vous donner l'idée générale, espérons que cela aide.

Un exemple serait:

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