web-dev-qa-db-ja.com

カスタム一括アクションをメディア/アップロードページで機能させる方法

私はオンラインで見つけたスクリプトを、投稿のリストとともにカスタムの一括アクションを画面に追加するように修正しています。この行があります:

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

私はそれをメディアライブラリに合わせようとしています。私はedit.phpの代わりにupload.phpを使うべきであることを私は見ました。それは私が私がload-edit.phpのためのメディアアナログを見つける必要があると信じるように導きました。簡単に聞こえますが、私のWPインストールでload-edit.phpを見つけることさえできないので、偶然にそれが自分が探しているものかどうかを確認することはできません。私はオンラインでload-*.phpへの参照をいくつか見つけました(例: Custom bulk_action )が、*がどんな値をとることができるかを私に教えてくれるものは何もありません。

(私はload-upload.phpを試してみましたが、うまくいきません - それは私のコードの中で常にうまくいくわけではないかもしれませんが)。

だから私の質問は二つです:

  1. load-edit.phpのメディアアナログは何ですか?
  2. load-edit.php(および他のload-*.phpファイル)はどこにありますか、またはどのコードがこれらのファイル要求を処理しますか?

最初の質問は私の本当の質問ですが、2番目の質問は私の下にあります。

そこにいるあなたの専門家の誰かが私にいくらかの指導を与えることができますか?とても感謝しています。

編集

「動作していない」とは、クラッシュしたのではなく、想定したとおりに動作していなかったことを意味します(メディア属性の変更)。

私が適応しているコードは、Fox Run SoftwareのJustin Sternによる「 WordPressのカスタム一括操作の追加 」の投稿の最後にダウンロードすることができます。コードの各ステップを検証するために戻って、適応バージョンを機能させることができました。ただし、条件付きチェックとセキュリティチェックをコメントアウトした場合に限られます(両方とも下のアスタリスク)。これらを置き換えるために使用すべきメディアアナログは何ですか?

 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

私は上記のコードを受け入れられた答えからの情報を反映するように修正しました。 Ralf912 に感謝します。

4
JohnK

あなたのコードを使用したい場合は、これを試してみてください。

メディアが添付ファイルであるかどうかを確認したい場合は、$_REQUEST['detached']を使用してみてください。

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

function export_media_test() {

    if ( ! isset( $_REQUEST['action'] ) )
        return;

    echo 'Export Media';

    if ( isset( $_REQUEST['detached'] ) ) {
        die( 'No attachments' );
    } else {
        die( 'Attachments' );
    }

    exit();
}

設定されていないnonceを確認することはできません。 nonce bulk-postsedit.phpに設定されており、これが投稿リストです。 upload.phpにはbulk-media nonceセットがあります。だからcheck_admin_referer('bulk-media');を使う

2
Ralf912

WordPressのapply_filtersにいくつかのdo_actionupload.phpがありません。だからあなたはいくつかの厄介なトリックをしなければならない。

最初に、一括アクションにエクスポートアクションを追加する必要があります。 WP_Media_List_Tableはオブジェクトであり、この仕事はとても簡単です。単純にクラスを拡張して必要なメソッドをオーバーライド/拡張​​することができます。

require_once( ABSPATH . 'wp-admin/includes/class-wp-list-table.php' );
require_once( ABSPATH . 'wp-admin/includes/class-wp-media-list-table.php' );

class Extended_Media_List_Table extends WP_Media_List_Table
{

    /**
     * Add the export bulk action
     * @return array
     */
    public function get_bulk_actions() {

        // get the original bulk actions    
        $actions = parent::get_bulk_actions();

        // add our own action(s)
        $actions['export'] = __( 'Export' );

        // return the actions    
        return $actions;
    }

    /**
     * Returns the current action
     * @return string
     */
    public function current_action() {

        // check if our action(s) are set and handle them
        if ( isset( $_REQUEST['action'] ) && 'export' === $_REQUEST['action'] ) {
            return 'export_media';
        }

        // let the parent class handle all other actions
        parent::current_action();

    }

}

最初の方法はエクスポートアクションを追加するだけです。エクスポートアクションが選択されている場合、2番目のメソッドはexport_mediaを返します。

今それは厄介になります。 apply_filterupload.phpはなく、メディアを表示するためにupload.phpが使用するクラスを変更することはできません。 2番目のポイントは、一括アクションが選択されている場合に別のアクションを追加するためにフックするadd_actionがないことです。

upload.phpをコピーして名前を変更します(例:extended_upload.php)。新しいファイルを編集してrequire_once( './admin.php' );を削除します。後でload-upload.phpにフックすると、このフックはadmin.phpで呼び出されます。この線を離れると、無限ループになります。

次のステップはエクスポートアクションのためのハンドラを挿入することです。上記の拡張クラスでわかるように、::current_action()$doactionにコピーされる文字列を返します。 extended_upload.phpにはアクションを処理するswitchステートメントがあります。エクスポートアクションを処理するためのケースを追加します。

case 'export_media':
    // handle only attachments
    // $wp_list_table->detached = false ==> attachments
    // $wp_list_table->detached = true ==> not attached files
    if ( true == $wp_list_table->detached )
        return;

    // $_REQUEST['media'] contains an array with the post_ids
    if ( ! empty( $_REQUEST['media'] ) ) {
        foreach ( $_REQUEST['media'] as $postID ) {
            export_image( $postID );
        }
    }
    break;

覚えて!すべてのアクションはajaxリクエスト内で処理されます。そのため、出力(echo、print、printfなど)は表示されません。

最後のステップは、load-upload.phpに接続して、WordPressに元のextended_upload.phpの代わりに新しいupload.phpを使用するように指示することです。

add_action( 'load-upload.php', 'add_bulk_action_export_to_list_media' );
function add_bulk_action_export_to_list_media() {
    require_once 'extended_upload.php';
    // DO NOT RETURN HERE OR THE ORIGINAL upload.php WILL BE LOADED TOO!
}

これは とても厄介です そしてトリッキーな解決策です。すべてのWordPressアップデートはそれを破壊する可能性があり、あなたはupload.phpへのすべての変更を追跡しなければなりません。しかし、これがいくつかの値を取得する唯一の方法です(例:それが添付ファイルであるかどうかを教えてくれる$wp_list_table->detached)。

$wp_list_tableをフィルタリングしてswitchステートメントにアクションを追加するためのチケットを書くことは悪くない考えかもしれません。

$wp_list_table = apply_filters( 'upload_list_table', _get_list_table('WP_Media_List_Table') );

switch ( $doaction ) {
[...]

default:
  global $doaction;
  do_action( 'upload_list_table_actions' );
  break;
}

この2つの変更により、一括アクションを追加して処理することが非常に簡単になります。

3
Ralf912