web-dev-qa-db-ja.com

メディアギャラリーアイテムのカスタム一括操作

カスタムの[一括操作]をWP 3.5の新しいメディアギャラリーアイテムに追加しようとしています。私はこの すばらしいチュートリアル から始めました。だから私はそれをメディアギャラリーアイテムで動作するように適応させようとしました。

オリジナルのプラグインコードから始めて、これが私がこれまでに出てきたものです(私の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;
}

コードは何もしないで(perform_export()関数を参照)、「エクスポート後」のメッセージを返しますが、機能していません。新しい一括操作が正しく表示されますが、セキュリティエラーが表示されます( "これを実行しますか?")。セキュリティチェックを無効にした場合

check_admin_referer('bulk-posts');

確認メッセージが表示されません。

私は私の問題は私が使っているこのフックにあるかもしれないと思います(私はフック処理にはかなりのノブです!!)

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

実際の作業を処理するページを保持する$ sendback変数では、次のようになります。

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

どのフックと返送ページを使用すればいいのかを見つけ出す手助けができますか。ありがとう:)

1
Torakiki

Justin Sternの カスタム一括アクションのデモ についても、非常によく似た質問( " カスタム一括アクションをメディア/アップロードページで機能させる方法は? ")がありました。 、それはちょうど答えられました。

私の最大のアドバイスは、一度に適応を進めることです:他のものよりもexportがメディアのために働くことを確認してください。一度に2つのステップをやろうとしないでください。 (これがこのコンピュータ関連のものすべての秘訣です。物事を小さくて扱いやすいものに分割してください。)

最後にあなたの具体的な質問のために:

  • check_admin_referer('bulk-posts')check_admin_referer('bulk-media')に置き換えることで、「これを実行しますか?」という操作をやめます。
  • フックadd_action('load-upload.php', 'custom_bulk_action')は愚かに聞こえるかもしれませんが、それでも結構です。
  • $sendback = admin_url( "upload.php" )は結構です。

パート1のcustom_bulk_admin_footer()とパート3のcustom_bulk_admin_notices()では、置き換えたいと思います

  • 'post' - > 'attachment'

それ以外の場合は交換する必要があります

  • post.php - > upload.php
  • edit - > upload、そして
  • post - > media

パート2、custom_bulk_action()では、より複雑な修正が必要です。下記のコードを使用することをお勧めします(上記のリンクの質問から)。

 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