Como fazer com que ações em massa personalizadas funcionem na mídia / página de upload?

4

Estou adaptando um script que encontrei on-line para adicionar ações em massa personalizadas à tela com a lista de postagens. Tem essa linha:

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

Estou tentando adaptá-lo para a biblioteca de mídia. Vejo que no lugar de edit.php eu deveria usar upload.php , o que me leva a acreditar que preciso encontrar o analógico de mídia para load-edit.php . Parece fácil, mas não consigo nem encontrar o load-edit.php em minha instalação do WP para ver se por acaso pode ser o que estou procurando. Eu encontrei algumas referências on-line para load-*.php (por exemplo, bulk_action personalizado ), mas nada que me diz quais valores * podem receber.

(Eu tentei load-upload.php , mas não está funcionando - embora sempre possa ser outra coisa no meu código que está atrapalhando os trabalhos.)

Então minhas perguntas são duas:

  1. Qual é o análogo de mídia de load-edit.php ?
  2. Onde está load-edit.php (e os outros load-*.php arquivos), ou qual código lida com essas solicitações de arquivos?

A primeira é a minha verdadeira pergunta, mas a segunda ficou sob minha pele.

Algum de vocês especialistas pode me dar alguma orientação? Eu apreciaria muito isso.

EDITAR

Por "não funcionar" eu quis dizer não que ele falha, mas que não estava funcionando como deveria (alterando um atributo de mídia).

O código que eu estou adaptando pode ser baixado na parte inferior da postagem " Add a Ação em massa personalizada do WordPress "por Justin Stern da Fox Run Software. Voltando para verificar cada passo do código, obtive a versão adaptada para funcionar, mas somente se eu comentar a condicional e a verificação de segurança (ambas asterisco abaixo). Quais são os análogos de mídia que devo usar para substituí-los?

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

Agradeço sua ajuda.

EDIT 2

Eu modifiquei o código acima para refletir as informações da resposta aceita. Muito obrigado a Ralf912 !

    
por JohnK 22.03.2013 / 02:03

2 respostas

2

Se você quiser usar seu código, tente o seguinte:

Se você quiser verificar se as mídias são anexos, tente usar $_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();
}

Você não pode verificar um nonce que não foi definido. O nonce bulk-posts está definido em edit.php e esta é a lista de publicações. Em upload.php é o conjunto bulk-media nonce. Então use check_admin_referer('bulk-media');

    
por Ralf912 23.03.2013 / 12:24
3

O WordPress está sem alguns apply_filters e do_action em upload.php . Então você tem que fazer alguns truques desagradáveis.

Primeiramente, precisamos adicionar uma ação de exportação às ações em massa. WP_Media_List_Table é um objeto e esse trabalho é muito fácil. Podemos simplesmente estender a classe e substituir / estender os métodos necessários:

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

    }

}

O primeiro método simplesmente adiciona a ação de exportação. O segundo método retorna export_media se a ação de exportação for escolhida.

Agora, isso se torna desagradável. Não há apply_filter em upload.php e não podemos alterar a classe upload.php use para exibir as mídias. O segundo ponto é que não há add_action para adicionar outra ação se uma ação em massa for selecionada.

Copie upload.php e renomeie-o (por exemplo, extended_upload.php ). Edite seu novo arquivo e remova require_once( './admin.php' ); . Mais tarde, conectamos em load-upload.php , esse gancho é chamado em admin.php . Deixando essa linha, terminará em um lopp sem fim.

O próximo passo é inserir um manipulador para sua ação de exportação. Como você pode ver na classe estendida acima, ::current_action() retorna uma string que será copiada em $doaction . Em extended_upload.php , você encontrará uma instrução switch que lida com a ação. Adicione um caso para lidar com a ação de exportação:

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;

Lembre-se! Todas as ações serão tratadas dentro de uma solicitação ajax. Portanto, nenhuma saída (echo, print, printf, ...) será exibida !!

O último passo a fazer é conectar-se a load-upload.php e dizer que o WordPress usa nosso novo extended_upload.php em vez do original 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!
}

Esta é uma solução muito desagradável e complicada. Toda atualização do WordPress pode destruí-lo e você precisa rastrear todas as alterações em upload.php . Mas essa é a única maneira de recuperar alguns valores (por exemplo, $wp_list_table->detached , que informará se é um anexo ou não).

Talvez não seja uma má ideia escrever um tíquete para filtrar $wp_list_table e adicionar uma ação à instrução 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;
}

Essas duas alterações facilitarão muito a adição de ações em massa e a manipulação delas.

    
por Ralf912 23.03.2013 / 12:04