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:
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.
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:
tb_show
fournie par le script ThickBox.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.
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 );