WordPress缺少一些apply_filters
和do_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;
}
这两个更改将使添加批量操作和处理它们变得非常容易。