web-dev-qa-db-fra.com

Actions groupées personnalisées dans WP 3.7.1

J'essaie donc d'obtenir une action en bloc personnalisée dans Wordpress 3.7.1 et, jusqu'à présent, pas de chance. La base que j'utilise est http://www.skyverge.com/blog/add-custom-bulk-action , et cela ne va pas ici:

$wp_list_table = _get_list_table('WP_Posts_List_Table');
$action = $wp_list_table->current_action();

L'action elle-même est ajoutée à jQuery et s'affiche.

Lorsque j'utilise une invite pour afficher la valeur $action, elle est toujours vide, ce qui signifie que le reste du script ne se déclenche pas. Une idée ici? Le code entier:

<?php
/*
Plugin Name: FoxRunSoftware 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 (!class_exists('FRS_Custom_Bulk_Action')) {

    class FRS_Custom_Bulk_Action {

        public function __construct() {

            if(is_admin()) {
                // admin actions/filters
                add_action('admin_footer-edit.php', array(&$this, 'custom_bulk_admin_footer'));
                add_action('load-edit.php',         array(&$this,     'custom_bulk_action'));
            add_action('admin_notices',         array(&$this, 'custom_bulk_admin_notices'));
        }
    }


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

        if($post_type == 'post') {
            ?>
                <script type="text/javascript">
                    jQuery(document).ready(function() {
                        jQuery('<option>').val('export').text('<?php _e('Export')?>').appendTo("select[name='action']");
                        jQuery('<option>').val('export').text('<?php _e('Export')?>').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;
        $post_type = $typenow;

        if($post_type == 'post') {

            // get the action
            $wp_list_table = _get_list_table('WP_Posts_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("export");
            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" );

            $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();
        }
    }


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

        if($pagenow == 'edit.php' && $post_type == 'post' && 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 whatever work needs to be done
        return true;
    }
}
}

new FRS_Custom_Bulk_Action();

Eh bien, il y a quelques informations supplémentaires, il me semble que WP_List_Table ne fait que renvoyer des valeurs vides. Ce qui suit est le contenu de $ wp_list_table, des idées ?:

object(WP_Posts_List_Table)#8848 (10) { 
    ["hierarchical_display"]=> NULL 
    ["comment_pending_count"]=> NULL 
    ["user_posts_count"]=> NULL 
    ["sticky_posts_count"]=> int(0) 
    ["items"]=> NULL 
    ["_args"]=> array(4) { 
        ["plural"]=> string(5) "posts" 
        ["singular"]=> string(0) "" 
        ["ajax"]=> bool(false) 
        ["screen"]=> object(WP_Screen)#8846 (16) { 
            ["action"]=> string(0) "" 
            ["base"]=> string(4) "edit" 
            ["columns":"WP_Screen":private]=> int(0) 
            ["id"]=> string(15) "edit-shop_order" 
            ["in_admin":protected]=> string(4) "site" 
            ["is_network"]=> bool(false) 
            ["is_user"]=> bool(false) 
            ["parent_base"]=> NULL 
            ["parent_file"]=> NULL 
            ["post_type"]=> string(10) "shop_order" 
            ["taxonomy"]=> string(0) "" 
            ["_help_tabs":"WP_Screen":private]=> array(0) { } 
            ["_help_sidebar":"WP_Screen":private]=> string(0) "" 
            ["_options":"WP_Screen":private]=> array(0) { } 
            ["_show_screen_options":"WP_Screen":private]=> NULL 
            ["_screen_settings":"WP_Screen":private]=> NULL 
        } 
    } 
    ["_pagination_args"]=> array(0) { } 
    ["screen"]=> object(WP_Screen)#8846 (16) { 
        ["action"]=> string(0) "" 
        ["base"]=> string(4) "edit" 
        ["columns":"WP_Screen":private]=> int(0) 
        ["id"]=> string(15) "edit-shop_order" 
        ["in_admin":protected]=> string(4) "site" 
        ["is_network"]=> bool(false) 
        ["is_user"]=> bool(false) 
        ["parent_base"]=> NULL 
        ["parent_file"]=> NULL 
        ["post_type"]=> string(10) "shop_order" 
        ["taxonomy"]=> string(0) "" 
        ["_help_tabs":"WP_Screen":private]=> array(0) { } 
        ["_help_sidebar":"WP_Screen":private]=> string(0) "" 
        ["_options":"WP_Screen":private]=> array(0) { } 
        ["_show_screen_options":"WP_Screen":private]=> NULL 
        ["_screen_settings":"WP_Screen":private]=> NULL 
    } 
    ["_actions"]=> NULL ["_pagination"]=> NULL 
}
3
Marcel de Hoog

$action est vide car il existe une redirection à partir de wp-admin/edit.php.

La sortie que vous voyez se trouve donc après la redirection.

Utilisez, die() après echo $action pour voir la sortie avant la redirection.

0
sakibmoon

En regardant la page que vous avez mentionnée, je remarque qu’il manque un code dans un extrait de code. Dans le premier extrait de code après La solution , l'extrait de code suivant:

add_action('admin_footer-edit.php', 'custom_bulk_admin_footer');

function custom_bulk_admin_footer() {

  global $post_type;

  if($post_type == 'post') {

    ?>

Puis l'auteur déclare Comme vous pouvez le constater, nous utilisons ici le javascript pour injecter notre nouvel élément d'action en bloc dans les deux menus déroulants de sélection d'actions en bloc de la page d'édition Posts . Seulement ... il n'y a pas de javascript dans cet extrait de code.

En regardant la source de la page, cependant, je trouve ceci:

add_action('admin_footer-edit.php', 'custom_bulk_admin_footer');



function custom_bulk_admin_footer() {

  global $post_type;

  if($post_type == 'post') {

    ?>

    <script type="text/javascript">

      jQuery(document).ready(function() {

        jQuery('<option>').val('export').text('<?php _e('Export')?>').appendTo("select[name='action']");

        jQuery('<option>').val('export').text('<?php _e('Export')?>').appendTo("select[name='action2']");

      });

    </script>

    <?php

  }

}

... qui réellement inclut le code JS (mais pas comme vous devriez le faire dans WordPress - voir wp_enqueue_script() pour plus d'informations à ce sujet.

0
Pat J