如何在媒体/上传页面上执行自定义批量操作?

时间:2013-03-22 作者:JohnK

我正在修改我在网上找到的一个脚本,将自定义批量操作添加到带有帖子列表的屏幕上。它有这样一行:

add_action(\'load-edit.php\', \'custom_bulk_action\');
我正在尝试将其改编为媒体库。我看到它代替了edit.php 我应该使用upload.php, 这让我相信我需要找到load-edit.php. 听起来很简单,但我甚至找不到load-edit.php 在我的可湿性粉剂安装,看看是否有机会,它可能是我正在寻找自己。我在网上找到了一些参考资料load-*.php (例如。,Custom bulk_action), 但没什么能告诉我什么是价值观* 可以接受。

(我试过了load-upload.php 但它不起作用——尽管我的代码中可能总是有其他东西把工作搞砸了。)

所以我的问题有两个:

什么是媒体模拟load-edit.php?load-edit.php (和其他load-*.php 或者什么代码处理这些文件请求

你们这些专家能给我一些指导吗?我将非常感激。

编辑“不工作”我的意思不是它崩溃,而是它没有按预期的那样工作(更改媒体属性)。

我正在修改的代码可以在帖子底部下载“Add a WordPress Custom Bulk Action“作者:Fox Run Software的贾斯汀·斯特恩(Justin Stern)。回去验证代码的每一步,我得到了适合的版本,但前提是我注释掉了条件检查和安全检查(下面都用星号标出)。我应该使用什么样的媒体模拟来代替这些?

 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!

2 个回复
最合适的回答,由SO网友:Ralf912 整理而成

如果要使用代码,请尝试以下操作:

如果要检查媒体是否为附件,可以尝试使用$_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。暂时的bulk-posts 设置为edit.php, 这是帖子列表。在里面upload.phpbulk-media 临时集合。So使用check_admin_referer(\'bulk-media\');

SO网友:Ralf912

WordPress缺少一些apply_filtersdo_action 在里面upload.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();

    }

}
第一个方法只是添加导出操作。第二个方法返回export_media 如果选择了导出操作。

现在情况变得很糟糕。没有apply_filter 在里面upload.php 我们不能改变班级upload.php 用于显示媒体。第二点是,没有add_action 若选择了批量操作,则挂接以添加另一个操作。

复制upload.php 并将其重命名(例如。extended_upload.php). 编辑新文件并删除require_once( \'./admin.php\' );. 后来我们开始load-upload.php, 这个钩子被调用admin.php. 离开这条线,将以无休止的lopp结束。

下一步是为导出操作插入处理程序。正如您在上面的扩展类中所看到的,::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!
}
这是一个very nasty 和棘手的解决方案。每次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;
}
这两个更改将使添加批量操作和处理它们变得非常容易。

结束