web-dev-qa-db-fra.com

Action groupée personnalisée pour les éléments de la galerie multimédia

J'essaie d'ajouter des "actions en bloc" personnalisées à WP 3.5 nouveaux éléments de la médiathèque. J'ai commencé à partir de cet excellent tutoriel qui fait exactement ce dont j'ai besoin, mais avec des messages réguliers; J'ai donc essayé de l'adapter pour qu'il fonctionne avec les éléments de la galerie multimédia.

En commençant par le code du plugin original, voici ce que je suis arrivé jusqu'à maintenant (dans mon functions.php):

/*
Plugin Name: Custom Bulk Action Demo
Plugin URI: http://www.foxrunsoftware.net/articles/wordpress/add-custom-bulk-action/
Description: A working demonstration of a custom bulk action
Author: Justin Stern
Author URI: http://www.foxrunsoftware.net
Version: 0.1

    Copyright: © 2012 Justin Stern (email : [email protected])
    License: GNU General Public License v3.0
    License URI: http://www.gnu.org/licenses/gpl-3.0.html
*/

    if(is_admin()) {
        // admin actions/filters
        add_action('admin_footer', 'custom_bulk_admin_footer');
        add_action('load-upload.php', 'custom_bulk_action');
        add_action('admin_notices', 'custom_bulk_admin_notices');
    }

/**
 * Step 1: add the custom Bulk Action to the select menus
 */
function custom_bulk_admin_footer() {
    global $pagenow;

    if($pagenow == 'upload.php') {
        ?>
            <script type="text/javascript">
                jQuery(document).ready(function() {
                    jQuery('<option>').val('appr_1').text('<?php _e('Approva per album privato')?>').appendTo("select[name='action']");                        
                    jQuery('<option>').val('appr_1').text('<?php _e('Approva per album privato')?>').appendTo("select[name='action2']");
                });
            </script>
        <?php
    }
}


/**
 * Step 2: handle the custom Bulk Action
 * 
 * Based on the post http://wordpress.stackexchange.com/questions/29822/custom-bulk-action
 */
function custom_bulk_action() {
    global $typenow,$pagenow;
    $post_type = $typenow;

    //if($post_type == 'post') {
    if($pagenow == 'upload.php') {

        // get the action
        $wp_list_table = _get_list_table('WP_Media_List_Table');  // depending on your resource type this could be WP_Users_List_Table, WP_Comments_List_Table, etc
        $action = $wp_list_table->current_action();

        $allowed_actions = array("appr_1","appr_2");
        if(!in_array($action, $allowed_actions)) return;

        // security check
        check_admin_referer('bulk-posts');

        // make sure ids are submitted.  depending on the resource type, this may be 'media' or 'ids'
        if(isset($_REQUEST['post'])) {
            $post_ids = array_map('intval', $_REQUEST['post']);
        }

        if(empty($post_ids)) return;

        // this is based on wp-admin/edit.php
        $sendback = remove_query_arg( array('exported', 'untrashed', 'deleted', 'ids'), wp_get_referer() );
        if ( ! $sendback )
            //$sendback = admin_url( "edit.php?post_type=$post_type" );
            $sendback = admin_url( "post.php" );

        $pagenum = $wp_list_table->get_pagenum();
        $sendback = add_query_arg( 'paged', $pagenum, $sendback );

        switch($action) {
            case 'appr_1':

                // if we set up user permissions/capabilities, the code might look like:
                //if ( !current_user_can($post_type_object->cap->export_post, $post_id) )
                //  wp_die( __('You are not allowed to export this post.') );

                $exported = 0;
                foreach( $post_ids as $post_id ) {

                    if ( !$this->perform_export($post_id) )
                        wp_die( __('Error exporting post.') );

                    $exported++;
                }

                $sendback = add_query_arg( array('exported' => $exported, 'ids' => join(',', $post_ids) ), $sendback );
            break;

            default: return;
        }

        $sendback = remove_query_arg( array('action', 'action2', 'tags_input', 'post_author', 'comment_status', 'ping_status', '_status',  'post', 'bulk_edit', 'post_view'), $sendback );

        wp_redirect($sendback);
        exit();
    }
}


/**
 * Step 3: display an admin notice on the Posts page after exporting
 */
function custom_bulk_admin_notices() {
    global $post_type, $pagenow;

    if($pagenow == 'upload.php' && isset($_REQUEST['exported']) && (int) $_REQUEST['exported']) {
        $message = sprintf( _n( 'Post exported.', '%s posts exported.', $_REQUEST['exported'] ), number_format_i18n( $_REQUEST['exported'] ) );
        echo "<div class=\"updated\"><p>{$message}</p></div>";
    }
}

function perform_export($post_id) {
    // do something
    return true;
}

Le code ne devrait rien faire (voir la fonction perform_export ()) et renvoyer un message "Post-exporté", mais ne fonctionne pas. Les nouvelles actions en bloc s'affichent correctement, mais une erreur de sécurité se produit ("Êtes-vous sûr de vouloir faire cela?"). Et si je désactive le contrôle de sécurité

check_admin_referer('bulk-posts');

Je ne vois pas le message de confirmation.

Je pense que mes problèmes pourraient être liés à ce crochet que j'utilise (je suis assez noob pour la manipulation des crochets !!)

add_action('load-upload.php', 'custom_bulk_action');

et dans la variable $ sendback qui contient la page qui gère le travail réel:

$sendback = admin_url( "post.php" );

Pouvez-vous m'aider à choisir les crochets et la page d'envoi que je devrais utiliser? Merci :)

1
Torakiki

J'avais une question très similaire (" Comment créer des actions groupées personnalisées sur le média/la page de téléchargement? ") à propos de Justin Stern Démo d'action en bloc personnalisée , à laquelle vous venez de répondre.

Mon plus grand conseil est de prendre l’adaptation une étape à la fois : assurez-vous que export travaille avant tout pour les médias. N'essayez pas de faire deux étapes à la fois. (C'est le secret de tout ce matériel informatique: divisez les objets en petits morceaux gérables.)

Pour vos questions spécifiques à la fin:

  • Remplacer check_admin_referer('bulk-posts') par check_admin_referer('bulk-media') supprimera "Êtes-vous sûr de vouloir faire cela?".
  • Le hook add_action('load-upload.php', 'custom_bulk_action') peut sembler idiot, mais ça va.
  • $sendback = admin_url( "upload.php" ) va bien.

Dans la partie 1, custom_bulk_admin_footer(), et la partie 3, custom_bulk_admin_notices(), vous souhaitez remplacer

  • 'post' -> 'attachment'.

Ailleurs, vous devez remplacer

  • post.php -> upload.php,
  • edit -> upload, et
  • post -> media.

La partie 2, custom_bulk_action(), nécessite des adaptations plus complexes. Je vous recommande d'utiliser le code ci-dessous (tiré de la question liée ci-dessus).

 add_action('load-upload.php', array(&$this, 'custom_bulk_action'));


function custom_bulk_action() {

//  ***if($post_type == 'attachment') {  REPLACE WITH:
    if ( !isset( $_REQUEST['detached'] ) ) {

    // get the action
    $wp_list_table = _get_list_table('WP_Media_List_Table');  
    $action = $wp_list_table->current_action();

    echo "\naction = $action\n</pre>";

    $allowed_actions = array("export");
    if(!in_array($action, $allowed_actions)) return;

    // security check
//  ***check_admin_referer('bulk-posts'); REPLACE WITH:
    check_admin_referer('bulk-media'); 

    // make sure ids are submitted.  depending on the resource type, this may be 'media' or 'ids'
    if(isset($_REQUEST['media'])) {
      $post_ids = array_map('intval', $_REQUEST['media']);
    }

    if(empty($post_ids)) return;

    // this is based on wp-admin/edit.php
    $sendback = remove_query_arg( array('exported', 'untrashed', 'deleted', 'ids'), wp_get_referer() );
    if ( ! $sendback )
      $sendback = admin_url( "upload.php?post_type=$post_type" );

    $pagenum = $wp_list_table->get_pagenum();
    $sendback = add_query_arg( 'paged', $pagenum, $sendback );

    switch($action) {
      case 'export':

        // if we set up user permissions/capabilities, the code might look like:
        //if ( !current_user_can($post_type_object->cap->export_post, $post_id) )
        //  wp_die( __('You are not allowed to export this post.') );

        $exported = 0;
        foreach( $post_ids as $post_id ) {

          if ( !$this->perform_export($post_id) )
            wp_die( __('Error exporting post.') );
          $exported++;
        }

        $sendback = add_query_arg( array('exported' => $exported, 'ids' => join(',', $post_ids) ), $sendback );
      break;

      default: return;
    }

    $sendback = remove_query_arg( array('action', 'action2', 'tags_input', 'post_author', 'comment_status', 'ping_status', '_status',  'post', 'bulk_edit', 'post_view'), $sendback );

    wp_redirect($sendback);
    exit();
  }
}
2
JohnK