Files
wordpress-preseed/wp-content/plugins/media-library-assistant/includes/class-mla-main.php
2019-10-24 00:12:05 +02:00

2567 lines
98 KiB
PHP

<?php
/**
* Top-level functions for the Media Library Assistant
*
* @package Media Library Assistant
* @since 0.1
*/
// The Meta Boxes functions are't automatically available to plugins.
if ( !function_exists( 'post_categories_meta_box' ) ) {
require_once( ABSPATH . 'wp-admin/includes/meta-boxes.php' );
}
/**
* Class MLA (Media Library Assistant) provides several enhancements to the handling
* of images and files held in the WordPress Media Library.
*
* @package Media Library Assistant
* @since 0.1
*/
class MLA {
/**
* Current date for Development Version, empty for production versions
*
* @since 2.10
*
* @var string
*/
const MLA_DEVELOPMENT_VERSION = '';
/**
* Object name for localizing JavaScript - MLA List Table
*
* @since 0.20
*
* @var string
*/
const JAVASCRIPT_INLINE_EDIT_OBJECT = 'mla_inline_edit_vars';
/**
* Holds screen ids to match help text to corresponding screen
*
* @since 0.1
*
* @var array
*/
private static $page_hooks = array();
/**
* Accumulates error messages from name conflict tests
*
* @since 1.14
*/
private static $mla_language_support_error_messages = '';
/**
* Displays name conflict error messages at the top of the Dashboard
*
* @since 2.11
*/
public static function mla_name_conflict_reporting_action () {
$messages = self::$mla_language_support_error_messages;
echo '<div class="error"><p><strong>The Media Library Assistant cannot activate multi-language support.</strong> Another plugin or theme has declared conflicting class, function or constant names:</p>'."\r\n";
echo "<ul>{$messages}</ul>\r\n";
echo '<p>You must resolve these conflicts before multi-language support can be activated.</p></div>'."\r\n";
}
/**
* Initialization function, similar to __construct()
*
* This function contains add_action and add_filter calls
* to set up the Ajax handlers, enqueue JavaScript and CSS files, and
* set up the Assistant submenu.
*
* @since 0.1
*
* @return void
*/
public static function initialize( ) {
global $sitepress, $polylang;
if ( 'checked' == MLACore::mla_get_option( 'enable_featured_image_generation' ) ) {
if ( class_exists( 'MLA_Thumbnail' ) ) {
self::$mla_language_support_error_messages .= "<li>class MLA_Thumbnail</li>";
} else {
require_once( MLA_PLUGIN_PATH . 'includes/class-mla-thumbnail-generation.php' );
MLA_Thumbnail::initialize();
}
}
/*
* Check for WPML/Polylang presence before loading language support class,
* then immediately initialize it since we're already in the "init" action.
*/
if ( is_object( $sitepress ) ) {
if ( class_exists( 'MLA_WPML' ) ) {
self::$mla_language_support_error_messages .= "<li>class MLA_WPML</li>";
}
if ( class_exists( 'MLA_WPML_List_Table' ) ) {
self::$mla_language_support_error_messages .= "<li>class MLA_WPML_List_Table</li>";
}
if ( class_exists( 'MLA_WPML_Table' ) ) {
self::$mla_language_support_error_messages .= "<li>class MLA_WPML_Table</li>";
}
if ( empty( self::$mla_language_support_error_messages ) ) {
require_once( MLA_PLUGIN_PATH . 'includes/class-mla-wpml-support.php' );
MLA_WPML::initialize();
}
} elseif ( is_object( $polylang ) ) {
if ( class_exists( 'MLA_Polylang' ) ) {
self::$mla_language_support_error_messages .= "<li>class MLA_Polylang</li>";
}
if ( empty( self::$mla_language_support_error_messages ) ) {
require_once( MLA_PLUGIN_PATH . 'includes/class-mla-polylang-support.php' );
MLA_Polylang::initialize();
}
}
if ( ! empty( self::$mla_language_support_error_messages ) ) {
add_action( 'admin_notices', 'MLA::mla_name_conflict_reporting_action' );
}
add_action( 'admin_init', 'MLA::mla_admin_init_action' );
add_action( 'admin_enqueue_scripts', 'MLA::mla_admin_enqueue_scripts_action' );
add_action( 'admin_menu', 'MLA::mla_admin_menu_action' );
add_filter( 'set-screen-option', 'MLA::mla_set_screen_option_filter', 10, 3 ); // $status, $option, $value
add_filter( 'screen_options_show_screen', 'MLA::mla_screen_options_show_screen_filter', 10, 2 ); // $show_screen, $this
}
/**
* Load the plugin's Ajax handler or process Edit Media update actions
*
* @since 0.20
*
* @return void
*/
public static function mla_admin_init_action() {
//static $count = 0;
//error_log( __LINE__ . ' MLA::mla_admin_init_action $count = ' . var_export( $count++, true ), 0 );
//error_log( __LINE__ . ' MLA::mla_admin_init_action referer = ' . var_export( wp_get_referer(), true ), 0 );
//error_log( __LINE__ . ' MLA::mla_admin_init_action $_REQUEST = ' . var_export( $_REQUEST, true ), 0 );
//error_log( __LINE__ . ' MLA::mla_admin_init_action $_POST = ' . var_export( $_POST, true ), 0 );
//error_log( __LINE__ . ' MLA::mla_admin_init_action $_GET = ' . var_export( $_GET, true ), 0 );
// Process secure file download requests
if ( isset( $_REQUEST['mla_download_file'] ) && isset( $_REQUEST['mla_download_type'] ) ) {
check_admin_referer( MLACore::MLA_ADMIN_NONCE_ACTION, MLACore::MLA_ADMIN_NONCE_NAME );
self::_process_mla_download_file( $_REQUEST, true );
exit();
}
// Process example plugin download requests from the Documentation tab
if ( isset( $_REQUEST['mla_download_example_plugin'] ) ) {
check_admin_referer( MLACore::MLA_ADMIN_NONCE_ACTION, MLACore::MLA_ADMIN_NONCE_NAME );
$request = array (
'mla_download_file' => str_replace( '\\', '/', MLA_PLUGIN_PATH . 'examples/plugins/' . stripslashes( $_REQUEST['mla_download_example_plugin'] ) ),
'mla_download_type' => 'text/plain',
);
self::_process_mla_download_file( $request, false );
exit();
}
// Process error log download requests from the Debug tab
if ( isset( $_REQUEST['mla_download_error_log'] ) ) {
check_admin_referer( MLACore::MLA_ADMIN_NONCE_ACTION, MLACore::MLA_ADMIN_NONCE_NAME );
// Find the appropriate error log file
$error_log_name = MLACore::mla_get_option( MLACoreOptions::MLA_DEBUG_FILE );
if ( empty( $error_log_name ) ) {
$error_log_name = ini_get( 'error_log' );
} else {
$first = substr( $error_log_name, 0, 1 );
if ( ( '/' != $first ) && ( '\\' != $first ) ) {
$error_log_name = '/' . $error_log_name;
}
$error_log_name = WP_CONTENT_DIR . $error_log_name;
}
if ( file_exists ( $error_log_name ) ) {
$request = array (
'mla_download_file' => addslashes( $error_log_name ),
'mla_download_type' => 'text/plain',
);
self::_process_mla_download_file( $request, false );
}
exit();
}
$bulk_action = '';
if ( isset( $_REQUEST['action'] ) && 'download-zip' == $_REQUEST['action']) {
$bulk_action = 'download-zip';
} elseif ( isset( $_REQUEST['action2'] ) && 'download-zip' == $_REQUEST['action2']) {
$bulk_action = 'download-zip';
}
if ( 'download-zip' == $bulk_action ) {
// Exits after redirect unless it returns an error
$_REQUEST['mla_zip_archive_error_message'] = self::_process_zip_archive_download( $_REQUEST );
MLACore::mla_debug_add( __LINE__ . " MLA::_process_zip_archive_download message = " . var_export( $_REQUEST['mla_zip_archive_error_message'], true ), MLACore::MLA_DEBUG_CATEGORY_ANY );
return;
}
// Process row-level actions from the Edit Media screen
if ( !empty( $_REQUEST['mla_admin_action'] ) ) {
if ( isset( $_REQUEST['mla-set-parent-ajax-nonce'] ) ) {
check_admin_referer( 'mla_find_posts', 'mla-set-parent-ajax-nonce' );
} else {
check_admin_referer( MLACore::MLA_ADMIN_NONCE_ACTION, MLACore::MLA_ADMIN_NONCE_NAME );
}
if ( apply_filters( 'mla_list_table_admin_action', true, $_REQUEST['mla_admin_action'], ( isset( $_REQUEST['mla_item_ID'] ) ? $_REQUEST['mla_item_ID'] : 0 ) ) ) {
switch ( $_REQUEST['mla_admin_action'] ) {
case MLACore::MLA_ADMIN_SINGLE_CUSTOM_FIELD_MAP:
if ( 'checked' == MLACore::mla_get_option( MLACoreOptions::MLA_ALLOW_CUSTOM_FIELD_MAPPING ) ) {
do_action( 'mla_begin_mapping', 'single_custom', $_REQUEST['mla_item_ID'] );
$updates = MLAOptions::mla_evaluate_custom_field_mapping( $_REQUEST['mla_item_ID'], 'single_attachment_mapping' );
do_action( 'mla_end_mapping' );
if ( !empty( $updates ) ) {
$item_content = MLAData::mla_update_single_item( $_REQUEST['mla_item_ID'], $updates );
}
$message = '101';
} else {
$message = '103';
}
$view_args = isset( $_REQUEST['mla_source'] ) ? array( 'mla_source' => $_REQUEST['mla_source']) : array();
wp_redirect( add_query_arg( $view_args, admin_url( 'post.php' ) . '?post=' . $_REQUEST['mla_item_ID'] . '&action=edit&message=' . $message ), 302 );
exit;
case MLACore::MLA_ADMIN_SINGLE_MAP:
if ( 'checked' == MLACore::mla_get_option( MLACoreOptions::MLA_ALLOW_IPTC_EXIF_MAPPING ) ) {
$item = get_post( $_REQUEST['mla_item_ID'] );
do_action( 'mla_begin_mapping', 'single_iptc_exif', $_REQUEST['mla_item_ID'] );
$updates = MLAOptions::mla_evaluate_iptc_exif_mapping( $item, 'iptc_exif_mapping' );
do_action( 'mla_end_mapping' );
$page_content = MLAData::mla_update_single_item( $_REQUEST['mla_item_ID'], $updates );
$message = '102';
} else {
$message = '104';
}
$view_args = isset( $_REQUEST['mla_source'] ) ? array( 'mla_source' => $_REQUEST['mla_source']) : array();
wp_redirect( add_query_arg( $view_args, admin_url( 'post.php' ) . '?post=' . $_REQUEST['mla_item_ID'] . '&action=edit&message=' . $message ), 302 );
exit;
default:
do_action( 'mla_list_table_custom_admin_action', $_REQUEST['mla_admin_action'], ( isset( $_REQUEST['mla_item_ID'] ) ? $_REQUEST['mla_item_ID'] : 0 ) );
// ignore the rest
} // switch ($_REQUEST['mla_admin_action'])
} // apply_filters mla_list_table_admin_action
} // (!empty($_REQUEST['mla_admin_action'])
if ( is_admin() ) {
if ( defined('DOING_AJAX') && DOING_AJAX ) {
add_action( 'wp_ajax_' . MLACore::JAVASCRIPT_INLINE_EDIT_SLUG, 'MLA::mla_inline_edit_ajax_action' );
}
}
}
/**
* Print optional in-lne styles for Media/Assistant submenu table
*
* @since 2.13
*/
public static function mla_admin_print_styles_action() {
echo "<style type='text/css'>\n";
// Optional - limit width of the views list
$width_value = MLACore::mla_get_option( MLACoreOptions::MLA_TABLE_VIEWS_WIDTH );
if ( !empty( $width_value ) ) {
if ( is_numeric( $width_value ) ) {
$width_value .= 'px';
}
echo " ul.subsubsub {\n";
echo " width: {$width_value};\n";
echo " max-width: {$width_value};\n";
echo " }\n";
}
echo " img.mla_media_thumbnail {\n";
// Optional - change the size of the thumbnail/icon images
$icon_value = MLACore::mla_get_option( MLACoreOptions::MLA_TABLE_ICON_SIZE );
$set_column_width = !empty( $icon_value ) && is_numeric( $icon_value ) && ( 64 < $icon_value );
if ( 'checked' == MLACore::mla_get_option( MLACoreOptions::MLA_ENABLE_MLA_ICONS ) ) {
if ( empty( $icon_value ) ) {
$icon_value = 64;
} else {
if ( is_numeric( $icon_value ) ) {
$icon_value = absint( $icon_value );
}
}
$icon_width = $icon_height = $icon_value . 'px';
echo " height: auto;\n";
echo " max-width: {$icon_width};\n";
echo " max-height: {$icon_height};\n";
} else {
if ( empty( $icon_value ) ) {
if ( MLATest::$wp_4dot3_plus ) {
$icon_value = 60;
} else {
$icon_value = 80;
}
}
$icon_width = absint( $icon_value ) . 'px';
echo " max-width: {$icon_width};\n";
if ( MLATest::$wp_4dot3_plus ) {
echo " max-height: auto;\n";
} else {
$icon_height = ( absint( .75 * (float) $icon_value ) ) . 'px';
echo " max-height: {$icon_height};\n";
}
}
echo " }\n";
if ( MLATest::$wp_4dot3_plus ) {
// Emulate WordPress styles in list-tables.css
echo " table.attachments .column-primary strong {\n";
echo " display: block;\n";
echo " margin-bottom: .2em;\n";
echo " font-size: 14px;\n";
echo " }\n";
echo " table.attachments .column-primary .media-icon {\n";
echo " float: left;\n";
echo " margin: 0 9px 0 0;\n";
echo " font-size: 14px;\n";
echo " }\n";
echo " table.attachments .column-primary div.row-actions {\n";
echo " clear: both;\n";
echo " }\n";
// Explicit primary column width including icon and some margin
if ( $set_column_width ) {
$column_width = ( $icon_value + 30 ) . 'px';
echo " table.attachments th.column-primary {\n";
echo " width: {$column_width};\n";
echo " }\n";
}
echo " table.attachments td.column-primary {\n";
echo " position: relative;\n";
if ( $set_column_width ) {
echo " width: {$column_width};\n";
}
echo " }\n";
} else {
/*
* Override defaults in /wp-admin/load-styles.php
*/
echo " .fixed td.column-icon, .fixed th.column-icon {\n";
echo " width: {$icon_width};\n";
echo " }\n";
/*
* Separate ID_parent column
*/
echo " td.column-ID_parent, th.column-ID_parent {\n";
echo " width: 100px;\n";
echo " max-width: 100px;\n";
echo " }\n";
}
echo "</style>\n";
}
/**
* Load the plugin's Style Sheet and Javascript files
*
* @since 0.1
*
* @param string Name of the page being loaded
*
* @return void
*/
public static function mla_admin_enqueue_scripts_action( $page_hook ) {
global $wp_locale;
$suffix = defined('SCRIPT_DEBUG') && SCRIPT_DEBUG ? '' : '.min';
if ( 'checked' != MLACore::mla_get_option( MLACoreOptions::MLA_SCREEN_DISPLAY_LIBRARY ) ) {
wp_register_style( MLACore::STYLESHEET_SLUG . '-nolibrary', MLA_PLUGIN_URL . 'css/mla-nolibrary.css', false, MLACore::CURRENT_MLA_VERSION );
wp_enqueue_style( MLACore::STYLESHEET_SLUG . '-nolibrary' );
}
if ( 'edit-tags.php' == $page_hook ) {
wp_register_style( MLACore::STYLESHEET_SLUG, MLA_PLUGIN_URL . 'css/mla-edit-tags-style.css', false, MLACore::CURRENT_MLA_VERSION );
wp_enqueue_style( MLACore::STYLESHEET_SLUG );
return;
}
if ( 'media_page_' . MLACore::ADMIN_PAGE_SLUG != $page_hook ) {
return;
}
// Add the styles for variable-size icon and WP 4.3 primary column display
add_action( 'admin_print_styles', 'MLA::mla_admin_print_styles_action' );
if ( $wp_locale->is_rtl() ) {
wp_register_style( MLACore::STYLESHEET_SLUG, MLA_PLUGIN_URL . 'css/mla-style-rtl.css', false, MLACore::CURRENT_MLA_VERSION );
} else {
wp_register_style( MLACore::STYLESHEET_SLUG, MLA_PLUGIN_URL . 'css/mla-style.css', false, MLACore::CURRENT_MLA_VERSION );
}
wp_enqueue_style( MLACore::STYLESHEET_SLUG );
wp_register_style( MLACore::STYLESHEET_SLUG . '-set-parent', MLA_PLUGIN_URL . 'css/mla-style-set-parent.css', false, MLACore::CURRENT_MLA_VERSION );
wp_enqueue_style( MLACore::STYLESHEET_SLUG . '-set-parent' );
wp_enqueue_script( MLACore::JAVASCRIPT_INLINE_EDIT_SLUG, MLA_PLUGIN_URL . "js/mla-inline-edit-scripts{$suffix}.js",
array( 'wp-lists', 'suggest', 'jquery' ), MLACore::CURRENT_MLA_VERSION, false );
if ( MLACore::mla_supported_taxonomies( 'checklist-add-term' ) ) {
wp_enqueue_script( MLACore::JAVASCRIPT_INLINE_EDIT_SLUG . '-add-term', MLA_PLUGIN_URL . "js/mla-add-term-scripts{$suffix}.js",
array( 'wp-ajax-response', 'jquery', MLACore::JAVASCRIPT_INLINE_EDIT_SLUG ), MLACore::CURRENT_MLA_VERSION, false );
}
wp_enqueue_script( MLACore::JAVASCRIPT_INLINE_EDIT_SLUG . '-set-parent', MLA_PLUGIN_URL . "js/mla-set-parent-scripts{$suffix}.js",
array( 'wp-lists', 'suggest', 'jquery', MLACore::JAVASCRIPT_INLINE_EDIT_SLUG ), MLACore::CURRENT_MLA_VERSION, false );
MLAModal::mla_add_terms_search_scripts();
$fields = array( 'post_title', 'post_name', 'post_excerpt', 'post_content', 'image_alt', 'jj', 'mm', 'aa', 'hh', 'mn', 'ss', 'post_parent', 'post_parent_title', 'menu_order', 'post_author' );
$custom_fields = MLACore::mla_custom_field_support( 'quick_edit' );
$custom_fields = array_merge( $custom_fields, MLACore::mla_custom_field_support( 'bulk_edit' ) );
foreach ( $custom_fields as $slug => $details ) {
$fields[] = $slug;
}
$fields = apply_filters( 'mla_list_table_inline_fields', $fields );
$script_variables = array(
'fields' => $fields,
'ajaxFailError' => __( 'An ajax.fail error has occurred. Please reload the page and try again.', 'media-library-assistant' ),
'ajaxDoneError' => __( 'An ajax.done error has occurred. Please reload the page and try again.', 'media-library-assistant' ),
'error' => __( 'Error while saving the changes.', 'media-library-assistant' ),
'ntdelTitle' => __( 'Remove From Bulk Edit', 'media-library-assistant' ),
'noTitle' => __( '(no title)', 'media-library-assistant' ),
'bulkTitle' => __( 'Bulk Edit items', 'media-library-assistant' ),
'bulkWaiting' => __( 'Waiting', 'media-library-assistant' ),
'bulkComplete' => __( 'Complete', 'media-library-assistant' ),
'bulkUnchanged' => __( 'Unchanged', 'media-library-assistant' ),
'bulkSuccess' => __( 'Succeeded', 'media-library-assistant' ),
'bulkFailure' => __( 'Failed', 'media-library-assistant' ),
'bulkCanceled' => __( 'CANCELED', 'media-library-assistant' ),
'bulkChunkSize' => MLACore::mla_get_option( MLACoreOptions::MLA_BULK_CHUNK_SIZE ),
'comma' => _x( ',', 'tag_delimiter', 'media-library-assistant' ),
'useSpinnerClass' => false,
'ajax_action' => MLACore::JAVASCRIPT_INLINE_EDIT_SLUG,
'ajax_nonce' => wp_create_nonce( MLACore::MLA_ADMIN_NONCE_ACTION, MLACore::MLA_ADMIN_NONCE_NAME ),
'deleteAcpBulkEdit' => false,
);
if ( version_compare( get_bloginfo( 'version' ), '4.2', '>=' ) ) {
$script_variables['useSpinnerClass'] = true;
}
if ( 'checked' == MLACore::mla_get_option( MLACoreOptions::MLA_BULK_EDITOR ) ) {
$script_variables['quickTagsInit'] = array( 'post_content' => array( 'id' => 'post_content', 'buttons' => 'strong,em,link,block,del,ins,img,ul,ol,li,code,close', 'active' => true, ) );
}
if ( function_exists( 'ACP' ) && ( version_compare( ACP()->get_version(), '4.5', '>=' ) ) ) {
if ( version_compare( ACP()->get_version(), '4.5.4', '<' ) ) {
$script_variables['deleteAcpBulkEdit'] = true;
}
}
wp_localize_script( MLACore::JAVASCRIPT_INLINE_EDIT_SLUG, self::JAVASCRIPT_INLINE_EDIT_OBJECT, $script_variables );
}
/**
* Add the submenu pages
*
* Add a submenu page in the "Media" section,
* add settings page in the "Settings" section.
* add settings link in the Plugins section entry for MLA.
*
* @since 0.1
*
* @return void
*/
public static function mla_admin_menu_action( ) {
global $submenu;
add_action( 'load-upload.php', 'MLA::mla_load_media_action' );
// Disable the MLA Download ZIP Example plugin, if necessary
if ( isset( $_REQUEST['page'] ) && 'mla-menu' === $_REQUEST['page'] ) {
$bulk_action = '';
if ( isset( $_REQUEST['action'] ) && 'download-zip' === $_REQUEST['action']) {
$bulk_action = 'download-zip';
} elseif ( isset( $_REQUEST['action2'] ) && 'download-zip' === $_REQUEST['action2']) {
$bulk_action = 'download-zip';
}
if ( 'download-zip' === $bulk_action ) {
if ( is_plugin_active( 'mla-zip-archive-example/mla-zip-archive-example.php' ) ) {
deactivate_plugins( 'mla-zip-archive-example/mla-zip-archive-example.php', true );
}
if ( is_plugin_active( 'mla-zip-archive-example.php' ) ) {
deactivate_plugins( 'mla-zip-archive-example.php', true );
}
}
}
$page_title = MLACore::mla_get_option( MLACoreOptions::MLA_SCREEN_PAGE_TITLE );
if ( empty( $page_title ) ) {
$page_title = MLACore::mla_get_option( MLACoreOptions::MLA_SCREEN_PAGE_TITLE, true );
}
$menu_title = MLACore::mla_get_option( MLACoreOptions::MLA_SCREEN_MENU_TITLE );
if ( empty( $menu_title ) ) {
$menu_title = MLACore::mla_get_option( MLACoreOptions::MLA_SCREEN_MENU_TITLE, true );
}
$hook = add_submenu_page( 'upload.php', $page_title, $menu_title, 'upload_files', MLACore::ADMIN_PAGE_SLUG, 'MLA::mla_render_admin_page' );
add_action( 'load-' . $hook, 'MLA::mla_add_menu_options' );
add_action( 'load-' . $hook, 'MLA::mla_add_help_tab' );
self::$page_hooks[ $hook ] = $hook;
$taxonomies = get_object_taxonomies( 'attachment', 'objects' );
if ( !empty( $taxonomies ) ) {
foreach ( $taxonomies as $tax_name => $tax_object ) {
/*
* The page_hook we need for taxonomy edits is slightly different
*/
$hook = 'edit-' . $tax_name;
self::$page_hooks[ $hook ] = 't_' . $tax_name;
} // foreach $taxonomies
/*
* Load here, not 'load-edit-tags.php', to put our tab after the defaults
*/
add_action( 'admin_head-edit-tags.php', 'MLA::mla_add_help_tab' );
}
/*
* If we are suppressing the Media/Library submenu, force Media/Assistant to come first
*/
if ( 'checked' != MLACore::mla_get_option( MLACoreOptions::MLA_SCREEN_DISPLAY_LIBRARY ) ) {
$menu_position = 4;
} else {
$menu_position = (integer) MLACore::mla_get_option( MLACoreOptions::MLA_SCREEN_ORDER );
}
if ( $menu_position && !empty( $submenu['upload.php'] ) ) {
foreach ( $submenu['upload.php'] as $menu_order => $menu_item ) {
if ( MLACore::ADMIN_PAGE_SLUG == $menu_item[2] ) {
$menu_item[2] = 'upload.php?page=' . MLACore::ADMIN_PAGE_SLUG;
$submenu['upload.php'][$menu_position] = $menu_item;
unset( $submenu['upload.php'][$menu_order] );
ksort( $submenu['upload.php'] );
break;
}
}
}
add_filter( 'parent_file', 'MLA::mla_parent_file_filter', 10, 1 );
}
/**
* Redirect to Media/Assistant if Media/Library is hidden or a trash/delete
* returns from Media/Edit Media initiated from Media/Assistant
*
* @since 1.60
*
* @return void
*/
public static function mla_load_media_action( ) {
$mla_source = isset( $_REQUEST['mla_source'] ) && in_array( $_REQUEST['mla_source'], array ( 'trash', 'delete' ) );
if ( $mla_source || ( 'checked' != MLACore::mla_get_option( MLACoreOptions::MLA_SCREEN_DISPLAY_LIBRARY ) ) ) {
// Allow "grid" view even if the list view is suppressed
if ( isset( $_REQUEST['mode'] ) && 'grid' === $_REQUEST['mode'] ) {
return;
}
$query_args = '?page=' . MLACore::ADMIN_PAGE_SLUG;
// Compose a message if returning from the Edit Media screen
if ( ! empty( $_GET['deleted'] ) && $deleted = absint( $_GET['deleted'] ) ) {
$query_args .= '&mla_admin_message=' . urlencode( sprintf( _n( 'Item permanently deleted.', '%d items permanently deleted.', $deleted, 'media-library-assistant' ), number_format_i18n( $_GET['deleted'] ) ) );
}
if ( ! empty( $_GET['trashed'] ) && $trashed = absint( $_GET['trashed'] ) ) {
/* translators: 1: post ID */
$query_args .= '&mla_admin_message=' . urlencode( sprintf( __( 'Item %1$d moved to Trash.', 'media-library-assistant' ), $_GET['ids'] ) );
}
wp_redirect( admin_url( 'upload.php' ) . $query_args, 302 );
exit;
}
}
/**
* Add the "XX Entries per page" filter to the Screen Options tab
*
* @since 0.1
*
* @return void
*/
public static function mla_add_menu_options( ) {
$option = 'per_page';
$args = array(
'label' => __( 'Entries per page', 'media-library-assistant' ),
'default' => 10,
'option' => MLA_OPTION_PREFIX . 'entries_per_page'
);
add_screen_option( $option, $args );
}
/**
* Add contextual help tabs to all the MLA pages
*
* @since 0.1
*
* @return void
*/
public static function mla_add_help_tab( ) {
$screen = get_current_screen();
// Is this one of our pages?
if ( !array_key_exists( $screen->id, self::$page_hooks ) ) {
return;
}
if ( 'edit-tags' == $screen->base && 'attachment' != $screen->post_type ) {
return;
}
$file_suffix = $screen->id;
// Use a generic page for edit taxonomy screens
if ( 't_' == substr( self::$page_hooks[ $file_suffix ], 0, 2 ) ) {
$taxonomy = substr( self::$page_hooks[ $file_suffix ], 2 );
switch ( $taxonomy ) {
case 'attachment_category':
case 'attachment_tag':
break;
default:
$tax_object = get_taxonomy( $taxonomy );
if ( $tax_object->hierarchical ) {
$file_suffix = 'edit-hierarchical-taxonomy';
} else {
$file_suffix = 'edit-flat-taxonomy';
}
} // $taxonomy switch
} // is taxonomy
$template_array = apply_filters( 'mla_list_table_help_template', NULL, 'help-for-' . $file_suffix . '.tpl', $file_suffix );
if ( is_null( $template_array ) ) {
$template_array = MLACore::mla_load_template( 'help-for-' . $file_suffix . '.tpl' );
}
if ( empty( $template_array ) ) {
return;
}
// Don't add sidebar to the WordPress category and post_tag screens
if ( ! ( 'edit-tags' == $screen->base && in_array( $screen->taxonomy, array( 'post_tag', 'category' ) ) ) ) {
if ( !empty( $template_array['sidebar'] ) ) {
$page_values = array( 'settingsURL' => admin_url('options-general.php') );
$content = MLAData::mla_parse_template( $template_array['sidebar'], $page_values );
$screen->set_help_sidebar( $content );
}
}
unset( $template_array['sidebar'] );
// Provide explicit control over tab order
$tab_array = array();
foreach ( $template_array as $id => $content ) {
$match_count = preg_match( '#\<!-- title="(.+)" order="(.+)" --\>#', $content, $matches, PREG_OFFSET_CAPTURE );
if ( $match_count > 0 ) {
$tab_array[ $matches[ 2 ][ 0 ] ] = array(
'id' => $id,
'title' => $matches[ 1 ][ 0 ],
'content' => $content
);
} else {
/* translators: 1: ERROR tag 2: function name 3: template key */
MLACore::mla_debug_add( sprintf( _x( '%1$s: %2$s discarding "%3$s"; no title/order', 'error_log', 'media-library-assistant' ), __( 'ERROR', 'media-library-assistant' ), 'mla_add_help_tab', $id ), MLACore::MLA_DEBUG_CATEGORY_ANY );
}
}
ksort( $tab_array, SORT_NUMERIC );
foreach ( $tab_array as $indx => $value ) {
// Don't add duplicate tabs to the WordPress category and post_tag screens
if ( 'edit-tags' == $screen->base && in_array( $screen->taxonomy, array( 'post_tag', 'category' ) ) ) {
if ( 'mla-attachments-column' != $value['id'] ) {
continue;
}
}
$page_values = array( 'settingsURL' => admin_url('options-general.php') );
$value = MLAData::mla_parse_template( $value, $page_values );
$screen->add_help_tab( $value );
}
}
/**
* Only show screen options on the table-list screen
*
* @since 0.1
*
* @param boolean True to display "Screen Options", false to suppress them
* @param string Name of the page being loaded
*
* @return boolean True to display "Screen Options", false to suppress them
*/
public static function mla_screen_options_show_screen_filter( $show_screen, $this_screen ) {
return $show_screen;
}
/**
* Save the "Entries per page" option set by this user
*
* @since 0.1
*
* @param mixed false or value returned by previous filter
* @param string Name of the option being changed
* @param string New value of the option
*
* @return mixed New value if this is our option, otherwise original status
*/
public static function mla_set_screen_option_filter( $status, $option, $value ) {
MLACore::mla_debug_add( __LINE__ . " MLA::mla_set_screen_option_filter( {$option} ) status = " . var_export( $status, true ), MLACore::MLA_DEBUG_CATEGORY_ANY );
MLACore::mla_debug_add( __LINE__ . " MLA::mla_set_screen_option_filter( {$option} ) value = " . var_export( $value, true ), MLACore::MLA_DEBUG_CATEGORY_ANY );
MLACore::mla_debug_add( __LINE__ . " MLA::mla_set_screen_option_filter( {$option} ) wp_filter = " . MLACore::mla_decode_wp_filter('set-screen-option'), MLACore::MLA_DEBUG_CATEGORY_ANY );
if ( ( MLA_OPTION_PREFIX . 'entries_per_page' ) == $option ) {
return $value;
}
return $status;
}
/**
* Cleanup menus for Edit Tags/Categories page
*
* Fixes the submenu bolding when going to the Edit Media screen.
*
* @since 0.1
*
* @param array The top-level menu page
*
* @return string The updated top-level menu page
*/
public static function mla_parent_file_filter( $parent_file ) {
global $submenu_file, $submenu, $hook_suffix;
// Make sure the "Assistant" submenu line is bolded if it's been moved
if ( 'media_page_' . MLACore::ADMIN_PAGE_SLUG == $hook_suffix ) {
if ( 'checked' != MLACore::mla_get_option( MLACoreOptions::MLA_SCREEN_DISPLAY_LIBRARY ) ) {
$menu_position = 4;
} else {
$menu_position = (integer) MLACore::mla_get_option( MLACoreOptions::MLA_SCREEN_ORDER );
}
if ( $menu_position ) {
$submenu_file = 'upload.php?page=' . MLACore::ADMIN_PAGE_SLUG;
}
}
// Make sure the "Assistant" submenu line is bolded if the Media/Library submenu is hidden
if ( 'checked' != MLACore::mla_get_option( MLACoreOptions::MLA_SCREEN_DISPLAY_LIBRARY ) &&
'upload.php' == $parent_file && ( empty( $submenu_file ) || 'upload.php' == $submenu_file ) ) {
$submenu_file = 'upload.php?page=' . MLACore::ADMIN_PAGE_SLUG;
}
// Make sure the "Assistant" submenu line is bolded when we go to the Edit Media page
if ( isset( $_REQUEST['mla_source'] ) ) {
$submenu_file = 'upload.php?page=' . MLACore::ADMIN_PAGE_SLUG;
}
return $parent_file;
}
/**
* Process secure file download
*
* @since 2.00
*
* @param array $request The download parameters mla_download_file and mla_download_type; mla_download_disposition is optional.
* @param boolean $test_path True to restrict downloads to the "uploads" area, false to download anywhere.
*
* @return void echos file contents and calls exit();
*/
private static function _process_mla_download_file( $request, $test_path ) {
$message = '';
if ( isset( $request['mla_download_file'] ) && isset( $request['mla_download_type'] ) ) {
if( ini_get( 'zlib.output_compression' ) ) {
ini_set( 'zlib.output_compression', 'Off' );
}
$file_name = stripslashes( $request['mla_download_file'] );
$match_name = str_replace( '\\', '/', $file_name );
if ( $test_path ) {
$upload_dir = wp_upload_dir();
$allowed_path = str_replace( '\\', '/', $upload_dir['basedir'] );
}
if ( $test_path && ( 0 !== strpos( $match_name, $allowed_path ) ) ) {
$message = __( 'ERROR', 'media-library-assistant' ) . ': ' . __( 'download path out of bounds.', 'media-library-assistant' );
} elseif ( false !== strpos( $match_name, '..' ) ) {
$message = __( 'ERROR', 'media-library-assistant' ) . ': ' . __( 'download path invalid.', 'media-library-assistant' );
}
} else {
$message = __( 'ERROR', 'media-library-assistant' ) . ': ' . __( 'download argument(s) not set.', 'media-library-assistant' );
}
if ( empty( $message ) ) {
header('Pragma: public'); // required
header('Expires: 0'); // no cache
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Last-Modified: '.gmdate ( 'D, d M Y H:i:s', filemtime ( $file_name ) ).' GMT');
header('Cache-Control: private',false);
header('Content-Type: '.$request['mla_download_type']);
header('Content-Disposition: attachment; filename="'.basename( $file_name ).'"');
header('Content-Transfer-Encoding: binary');
header('Content-Length: '.filesize( $file_name )); // provide file size
header('Connection: close');
readfile( $file_name );
if ( isset( $request['mla_download_disposition'] ) && 'delete' == $request['mla_download_disposition'] ) {
@unlink( $file_name );
}
} else {
echo '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">';
echo '<html xmlns="http://www.w3.org/1999/xhtml">';
echo '<head>';
echo '<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />';
echo '<title>Download Error</title>';
echo '</head>';
echo '';
echo '<body>';
echo $message;
echo '</body>';
echo '</html> ';
}
exit();
}
/**
* Process the 'download-zip' bulk action
*
* @since 2.79
*
* @param array Form elements, e.g., from $_REQUEST
*
* @return array success/failure message and NULL content
*/
private static function _process_zip_archive_download( $request ) {
// Make sure we have ZIP support
if ( !class_exists( 'ZipArchive' ) ) {
return __( 'ERROR', 'media-library-assistant' ) . ': ' . __( 'no ZipArchive support.', 'media-library-assistant' );
}
// Create unique local names in case the same file name appears in multiple year/month/ directories.
$file_names = array();
foreach ( $request['cb_attachment'] as $index => $post_id ) {
$file_name = get_attached_file( $post_id );
$path_info = pathinfo( $file_name );
$local_name = $path_info['basename'];
$suffix = 0;
while( array_key_exists( $local_name, $file_names ) ) {
$suffix++;
$local_name = $path_info['filename'] . $suffix . '.' . $path_info['extension'];
}
$file_names[ $local_name ] = $file_name;
}
// Create the ZIP archive
$upload_dir = wp_upload_dir();
$prefix = ( defined( MLA_OPTION_PREFIX ) ) ? MLA_OPTION_PREFIX : 'mla_';
$date = date("Ymd_B");
$archive_name = $upload_dir['basedir'] . '/' . "{$prefix}_options_{$date}.zip";
// Clean up an obsolete file
if ( file_exists( $archive_name ) ) {
@unlink( $archive_name );
}
$zip = new ZipArchive();
if ( true !== $zip->open( $archive_name, ZIPARCHIVE::CREATE ) ) {
/* translators: 1: ZIP archive file name */
$text = sprintf( __( 'The ZIP archive ( %1$s ) could not be created.', 'media-library-assistant' ), $archive_name );
return array(
'message' => __( 'ERROR', 'media-library-assistant' ) . ': ' . $text,
'body' => ''
);
}
foreach( $file_names as $local_name => $file_name ) {
if ( true !== $zip->addFile( $file_name, $local_name ) ) {
/* translators: 1: ZIP archive file name */
$text = sprintf( __( 'The file ( %1$s ) could not be added to the ZIP archive.', 'media-library-assistant' ), $file_name );
return __( 'ERROR', 'media-library-assistant' ) . ': ' . $text;
}
}
if ( true !== $zip->close() ) {
/* translators: 1: ZIP archive file name */
$text = sprintf( __( 'The ZIP archive ( %1$s ) could not be closed.', 'media-library-assistant' ), $archive_name );
return __( 'ERROR', 'media-library-assistant' ) . ': ' . $text;
}
$download_args = array( 'page' => MLACore::ADMIN_PAGE_SLUG, 'mla_download_file' => urlencode( $archive_name ), 'mla_download_type' => 'application/zip', 'mla_download_disposition' => 'delete' );
wp_redirect( add_query_arg( $download_args, wp_nonce_url( 'upload.php', MLACore::MLA_ADMIN_NONCE_ACTION, MLACore::MLA_ADMIN_NONCE_NAME ) ), 302 );
exit;
}
/**
* Process bulk edit area fields, which may contain a Content Template
*
* @since 1.80
*
* @param integer Current post ID
* @param string Field value as entered
*
* @return string Empty, or new value for the field
*/
private static function _process_bulk_value( $post_id, $bulk_value ) {
$new_value = stripslashes( trim( $bulk_value ) );
if ( 'template:[+empty+]' == $new_value ) {
return NULL;
} elseif ( 'template:' == substr( $new_value, 0, 9 ) ) {
$data_value = array(
'data_source' => 'template',
'meta_name' => substr( $new_value, 9 ),
'keep_existing' => false,
'format' => 'raw',
'option' => 'text' );
$new_value = MLAOptions::mla_get_data_source( $post_id, 'single_attachment_mapping', $data_value );
if ( ' ' == $new_value ) {
$new_value = '';
}
} elseif ( ! empty( $new_value ) ) {
// preserve leading/trailing whitespace on non-empty entered values
return $bulk_value;
}
return $new_value;
}
/**
* Prepare Bulk Edit field-level updates
*
* @since 2.11
*
* @param integer $post_id Current post ID
* @param array $request Form elements, e.g., from $_REQUEST
* @param array $custom_field_map Form id to field name mapping
*
* @return array Non-empty form elements
*/
public static function mla_prepare_bulk_edits( $post_id, $request, $custom_field_map ) {
/*
* Copy the edit form contents to $new_data
* Trim text values for testing purposes only
*/
$new_data = array() ;
if ( isset( $request['post_title'] ) ) {
$test_value = self::_process_bulk_value( $post_id, $request['post_title'] );
if ( ! empty( $test_value ) ) {
$new_data['post_title'] = $test_value;
} elseif ( is_null( $test_value ) ) {
$new_data['post_title'] = '';
}
}
if ( isset( $request['post_excerpt'] ) ) {
$test_value = self::_process_bulk_value( $post_id, $request['post_excerpt'] );
if ( ! empty( $test_value ) ) {
$new_data['post_excerpt'] = $test_value;
} elseif ( is_null( $test_value ) ) {
$new_data['post_excerpt'] = '';
}
}
if ( isset( $request['post_content'] ) ) {
$test_value = self::_process_bulk_value( $post_id, $request['post_content'] );
if ( ! empty( $test_value ) ) {
$new_data['post_content'] = $test_value;
} elseif ( is_null( $test_value ) ) {
$new_data['post_content'] = '';
}
}
/*
* image_alt requires a separate key because some attachment types
* should not get a value, e.g., text or PDF documents
*/
if ( isset( $request['image_alt'] ) ) {
$test_value = self::_process_bulk_value( $post_id, $request['image_alt'] );
if ( ! empty( $test_value ) ) {
$new_data['bulk_image_alt'] = $test_value;
} elseif ( is_null( $test_value ) ) {
$new_data['bulk_image_alt'] = '';
}
}
if ( isset( $request['post_date'] ) ) {
$test_value = self::_process_bulk_value( $post_id, $request['post_date'] );
if ( ! empty( $test_value ) ) {
// User input is in local time, not UTC
$tz = get_option( 'timezone_string' );
if ( !$tz ) {
$tz = get_option( 'gmt_offset' );
if ( !$tz ) {
$tz = 'UTC';
}
}
$datetime = date_create( $test_value, new DateTimeZone( $tz ) );
if ( $datetime ) {
$new_text = $datetime->format( 'Y-m-d H:i:s' );
$new_data['post_date'] = $new_text;
$new_data['post_date_gmt'] = get_gmt_from_date( $new_text );
} else {
// strtotime() will "Parse about any English textual datetime description into a Unix timestamp"
$timestamp = strtotime( $test_value );
if( false !== $timestamp ) {
// date() "Returns a string formatted according to the format string using the integer timestamp"
$new_text = date( 'Y-m-d H:i:s', $timestamp );
$new_data['post_date'] = $new_text;
$new_data['post_date_gmt'] = get_gmt_from_date( $new_text );
}
}
} elseif ( is_null( $test_value ) ) {
// empty post_date value is not acceptable
}
}
if ( isset( $request['post_parent'] ) ) {
if ( is_numeric( $request['post_parent'] ) ) {
$new_data['post_parent'] = $request['post_parent'];
}
}
if ( isset( $request['post_author'] ) ) {
if ( -1 != $request['post_author'] ) {
$new_data['post_author'] = $request['post_author'];
}
}
if ( isset( $request['comment_status'] ) ) {
if ( -1 != $request['comment_status'] ) {
$new_data['comment_status'] = $request['comment_status'];
}
}
if ( isset( $request['ping_status'] ) ) {
if ( -1 != $request['ping_status'] ) {
$new_data['ping_status'] = $request['ping_status'];
}
}
// Custom field support
$custom_fields = array();
if ( is_array( $custom_field_map ) ) {
foreach ( $custom_field_map as $slug => $details ) {
if ( isset( $request[ $slug ] ) ) {
$test_value = self::_process_bulk_value( $post_id, $request[ $slug ] );
if ( ! empty( $test_value ) ) {
$custom_fields[ $details['name'] ] = $test_value;
} elseif ( is_null( $test_value ) ) {
if ( $details['no_null'] ) {
$custom_fields[ $details['name'] ] = NULL;
} else {
$custom_fields[ $details['name'] ] = '';
}
}
}
} // foreach
}
if ( ! empty( $custom_fields ) ) {
$new_data[ 'custom_updates' ] = $custom_fields;
}
// Taxonomy Support
$tax_inputs = array();
$tax_actions = array();
MLACore::mla_debug_add( __LINE__ . " MLA::mla_prepare_bulk_edits( {$post_id} ) tax_input = " . var_export( $request['tax_input'], true ), MLACore::MLA_DEBUG_CATEGORY_AJAX );
if ( isset( $request['tax_input'] ) && is_array( $request['tax_input'] ) ) {
foreach ( $request['tax_input'] as $taxonomy => $terms ) {
if ( ! empty( $request['tax_action'] ) ) {
$tax_action = $request['tax_action'][ $taxonomy ];
} else {
$tax_action = 'replace';
}
MLACore::mla_debug_add( __LINE__ . " MLA::mla_prepare_bulk_edits( {$post_id}, {$taxonomy}, {$tax_action} ) terms = " . var_export( $terms, true ), MLACore::MLA_DEBUG_CATEGORY_AJAX );
// Ignore empty updates
if ( $hierarchical = is_array( $terms ) ) {
// Make sure term_id values are integers, not strings, for flat-checklist
$terms = array_map( 'absint', $terms );
if ( false !== ( $index = array_search( 0, $terms ) ) ) {
unset( $terms[ $index ] );
}
} else {
// Parse out individual terms
$comma = _x( ',', 'tag_delimiter', 'media-library-assistant' );
if ( ',' !== $comma ) {
$tags = str_replace( $comma, ',', $terms );
}
$fragments = explode( ',', trim( $terms, " \n\t\r\0\x0B," ) );
$terms = array();
foreach( $fragments as $fragment ) {
// WordPress encodes special characters, e.g., "&" as HTML entities in term names
if ( MLATest::$wp_3dot5 ) {
$fragment = _wp_specialchars( trim( stripslashes_deep( $fragment ) ) );
} else {
$fragment = _wp_specialchars( trim( wp_unslash( $fragment ) ) );
}
if ( ! empty( $fragment ) ) {
$terms[] = $fragment;
}
} // foreach fragment
$terms = array_unique( $terms );
}
MLACore::mla_debug_add( __LINE__ . " MLA::mla_prepare_bulk_edits( {$post_id}, {$taxonomy}, {$tax_action} ) terms = " . var_export( $terms, true ), MLACore::MLA_DEBUG_CATEGORY_AJAX );
if ( empty( $terms ) && 'replace' != $tax_action ) {
continue;
}
$post_terms = get_object_term_cache( $post_id, $taxonomy );
if ( false === $post_terms ) {
$post_terms = wp_get_object_terms( $post_id, $taxonomy );
wp_cache_add( $post_id, $post_terms, $taxonomy . '_relationships' );
}
$current_terms = array();
foreach( $post_terms as $new_term ) {
if ( $hierarchical ) {
$current_terms[ $new_term->term_id ] = $new_term->term_id;
} else {
$current_terms[ $new_term->name ] = $new_term->name;
}
}
MLACore::mla_debug_add( __LINE__ . " MLA::mla_prepare_bulk_edits( {$post_id}, {$taxonomy}, {$tax_action} ) current_terms = " . var_export( $current_terms, true ), MLACore::MLA_DEBUG_CATEGORY_AJAX );
if ( 'add' == $tax_action ) {
// Add new terms; remove existing terms
foreach ( $terms as $index => $new_term ) {
if ( isset( $current_terms[ $new_term ] ) ) {
unset( $terms[ $index ] );
}
}
$do_update = ! empty( $terms );
} elseif ( 'remove' == $tax_action ) {
// Remove only the existing terms
foreach ( $terms as $index => $new_term ) {
if ( ! isset( $current_terms[ $new_term ] ) ) {
unset( $terms[ $index ] );
}
}
$do_update = ! empty( $terms );
} else {
/*
* Replace all terms; if the new terms match the term
* cache, we can skip the update
*/
foreach ( $terms as $new_term ) {
if ( isset( $current_terms[ $new_term ] ) ) {
unset( $current_terms[ $new_term ] );
} else {
$current_terms[ $new_term ] = $new_term;
break; // not a match; stop checking
}
}
$do_update = ! empty( $current_terms );
}
MLACore::mla_debug_add( __LINE__ . " MLA::mla_prepare_bulk_edits( {$post_id}, {$taxonomy}, {$tax_action} ) do_update = " . var_export( $do_update, true ), MLACore::MLA_DEBUG_CATEGORY_AJAX );
MLACore::mla_debug_add( __LINE__ . " MLA::mla_prepare_bulk_edits( {$post_id}, {$taxonomy}, {$tax_action} ) new terms = " . var_export( $terms, true ), MLACore::MLA_DEBUG_CATEGORY_AJAX );
if ( $do_update ) {
$tax_inputs[ $taxonomy ] = $terms;
$tax_actions[ $taxonomy ] = $tax_action;
}
} // foreach taxonomy
}
$new_data[ 'tax_input' ] = $tax_inputs;
$new_data[ 'tax_action' ] = $tax_actions;
return $new_data;
}
/**
* Holds [+index+] and [+found_rows+] values for MLAData_Source::_evaluate_data_source
*
* @since 2.52
*
* @var array
*/
public static $bulk_edit_data_source = array();
/**
* Process bulk action for one or more attachments
*
* @since 2.00
*
* @param string Bulk action slug: delete, edit, restore, trash, custom action
* @param array Form elements, e.g., from $_REQUEST
*
* @return array messages and page content: ( 'message', 'body', 'unchanged', 'success', 'failure', 'item_results' )
*/
public static function mla_process_bulk_action( $bulk_action, $request = NULL ) {
$page_content = array( 'message' => '', 'body' => '', 'unchanged' => 0, 'success' => 0, 'failure' => 0, 'item_results' => array() );
$custom_field_map = MLACore::mla_custom_field_support( 'bulk_edit' );
// Check for failed ZIP Archive download request
if ( !empty( $_REQUEST['mla_zip_archive_error_message'] ) ) {
$page_content['message'] = $_REQUEST['mla_zip_archive_error_message'];
return $page_content;
}
/*
* do_cleanup will remove the bulk edit elements from the $_REQUEST super array.
* It is passed in the $request so it can be filtered.
*/
if ( NULL == $request ) {
$request = $_REQUEST;
$request['mla_bulk_action_do_cleanup'] = true;
} else {
$request['mla_bulk_action_do_cleanup'] = false;
}
$request = apply_filters( 'mla_list_table_bulk_action_initial_request', $request, $bulk_action, $custom_field_map );
MLACore::mla_debug_add( __LINE__ . " MLA::mla_process_bulk_action request = " . var_export( $request, true ), MLACore::MLA_DEBUG_CATEGORY_AJAX );
if ( isset( $request['cb_attachment'] ) ) {
if ( !empty( $request['cb_offset'] ) ) {
self::$bulk_edit_data_source['cb_offset'] = absint( $request['cb_offset'] );
self::$bulk_edit_data_source['cb_count'] = absint( $request['cb_count'] );
self::$bulk_edit_data_source['cb_index'] = self::$bulk_edit_data_source['cb_offset'];
} else {
self::$bulk_edit_data_source['cb_offset'] = 0;
self::$bulk_edit_data_source['cb_count'] = count( $request['cb_attachment'] );
self::$bulk_edit_data_source['cb_index'] = 0;
}
$item_content = apply_filters( 'mla_list_table_begin_bulk_action', NULL, $bulk_action );
if ( is_null( $item_content ) ) {
$prevent_default = false;
} else {
$prevent_default = isset( $item_content['prevent_default'] ) ? $item_content['prevent_default'] : false;
}
if ( $prevent_default ) {
if ( isset( $item_content['message'] ) ) {
$page_content['message'] = $item_content['message'];
}
if ( isset( $item_content['body'] ) ) {
$page_content['body'] = $item_content['body'];
}
return $page_content;
}
if ( !empty( $request['bulk_custom_field_map'] ) ) {
do_action( 'mla_begin_mapping', 'bulk_custom', NULL );
} elseif ( !empty( $request['bulk_map'] ) ) {
do_action( 'mla_begin_mapping', 'bulk_iptc_exif', NULL );
}
foreach ( $request['cb_attachment'] as $index => $post_id ) {
self::$bulk_edit_data_source['cb_index']++;
if ( ! current_user_can( 'edit_post', $post_id ) ) {
$page_content['message'] .= __( 'ERROR', 'media-library-assistant' ) . ': ' . __( 'You are not allowed to edit Attachment: ', 'media-library-assistant' ) . $post_id . '<br>';
continue;
}
$request = apply_filters( 'mla_list_table_bulk_action_item_request', $request, $bulk_action, $post_id, $custom_field_map );
$item_content = apply_filters( 'mla_list_table_bulk_action', NULL, $bulk_action, $post_id );
if ( is_null( $item_content ) ) {
$prevent_default = false;
$custom_message = '';
} else {
$prevent_default = isset( $item_content['prevent_default'] ) ? $item_content['prevent_default'] : false;
$custom_message = isset( $item_content['message'] ) ? $item_content['message'] : '';
}
if ( ! $prevent_default ) {
switch ( $bulk_action ) {
case 'delete':
$item_content = self::_delete_single_item( $post_id );
break;
case 'edit':
if ( !empty( $request['bulk_custom_field_map'] ) ) {
$updates = MLAOptions::mla_evaluate_custom_field_mapping( $post_id, 'single_attachment_mapping' );
$item_content = MLAData::mla_update_single_item( $post_id, $updates );
break;
}
if ( !empty( $request['bulk_map'] ) ) {
$item = get_post( $post_id );
$updates = MLAOptions::mla_evaluate_iptc_exif_mapping( $item, 'iptc_exif_mapping' );
$item_content = MLAData::mla_update_single_item( $post_id, $updates );
break;
}
$new_data = self::mla_prepare_bulk_edits( $post_id, $request, $custom_field_map );
MLACore::mla_debug_add( __LINE__ . " MLA::mla_process_bulk_action( {$post_id} ) new_data = " . var_export( $new_data, true ), MLACore::MLA_DEBUG_CATEGORY_AJAX );
$tax_input = $new_data['tax_input'];
$tax_action = $new_data['tax_action'];
unset( $new_data['tax_input'] );
unset( $new_data['tax_action'] );
$item_content = MLAData::mla_update_single_item( $post_id, $new_data, $tax_input, $tax_action );
MLACore::mla_debug_add( __LINE__ . " MLA::mla_process_bulk_action( {$post_id} ) item_content = " . var_export( $item_content, true ), MLACore::MLA_DEBUG_CATEGORY_AJAX );
break;
case 'restore':
$item_content = self::_restore_single_item( $post_id );
break;
case 'trash':
$item_content = self::_trash_single_item( $post_id );
break;
default:
$item_content = apply_filters( 'mla_list_table_custom_bulk_action', NULL, $bulk_action, $post_id );
if ( is_null( $item_content ) ) {
$prevent_default = false;
/* translators: 1: ERROR tag 2: bulk action */
$custom_message = sprintf( __( '%1$s: Unknown bulk action %2$s', 'media-library-assistant' ), __( 'ERROR', 'media-library-assistant' ), $bulk_action );
} else {
$prevent_default = isset( $item_content['prevent_default'] ) ? $item_content['prevent_default'] : false;
}
} // switch $bulk_action
} // ! $prevent_default
// Custom action can set $prevent_default, so test again.
if ( ! $prevent_default ) {
if ( ! empty( $custom_message ) ) {
$no_changes = sprintf( __( 'Item %1$d, no changes detected.', 'media-library-assistant' ), $post_id );
if ( $no_changes == $item_content['message'] ) {
$item_content['message'] = $custom_message;
} else {
$item_content['message'] = $custom_message . '<br>' . $item_content['message'];
}
}
$page_content['item_results'][ $post_id ] = array( 'result' => 'unknown', 'message' => $item_content['message'] );
if ( ! empty( $item_content['message'] ) ) {
$page_content['message'] .= $item_content['message'] . '<br>';
if ( false !== strpos( $item_content['message'], __( 'no changes detected', 'media-library-assistant' ) ) ) {
$page_content['unchanged'] += 1;
$page_content['item_results'][ $post_id ]['result'] = 'unchanged';
} elseif ( false !== strpos( $item_content['message'], __( 'ERROR', 'media-library-assistant' ) ) ) {
$page_content['failure'] += 1;
$page_content['item_results'][ $post_id ]['result'] = 'failure';
} else {
$page_content['success'] += 1;
$page_content['item_results'][ $post_id ]['result'] = 'success';
}
}
} // ! $prevent_default
} // foreach cb_attachment
if ( !empty( $request['bulk_custom_field_map'] ) || !empty( $request['bulk_map'] ) ) {
do_action( 'mla_end_mapping' );
}
$item_content = apply_filters( 'mla_list_table_end_bulk_action', NULL, $bulk_action );
if ( isset( $item_content['message'] ) ) {
$page_content['message'] .= $item_content['message'];
}
if ( isset( $item_content['body'] ) ) {
$page_content['body'] = $item_content['body'];
}
if ( $request['mla_bulk_action_do_cleanup'] ) {
unset( $_REQUEST['post_title'] );
unset( $_REQUEST['post_excerpt'] );
unset( $_REQUEST['post_content'] );
unset( $_REQUEST['image_alt'] );
unset( $_REQUEST['comment_status'] );
unset( $_REQUEST['ping_status'] );
unset( $_REQUEST['post_parent'] );
unset( $_REQUEST['post_author'] );
unset( $_REQUEST['tax_input'] );
unset( $_REQUEST['tax_action'] );
foreach ( MLACore::mla_custom_field_support( 'bulk_edit' ) as $slug => $details ) {
unset( $_REQUEST[ $slug ] );
}
unset( $_REQUEST['cb_attachment'] );
}
} else { // isset cb_attachment
/* translators: 1: action name, e.g., edit */
$page_content['message'] = sprintf( __( 'Bulk Action %1$s - no items selected.', 'media-library-assistant' ), $bulk_action );
}
if ( $request['mla_bulk_action_do_cleanup'] ) {
unset( $_REQUEST['action'] );
unset( $_REQUEST['bulk_custom_field_map'] );
unset( $_REQUEST['bulk_map'] );
unset( $_REQUEST['bulk_edit'] );
unset( $_REQUEST['action2'] );
}
MLACore::mla_debug_add( __LINE__ . " MLA::mla_process_bulk_action returning page_content = " . var_export( $page_content, true ), MLACore::MLA_DEBUG_CATEGORY_AJAX );
return $page_content;
}
/**
* Clear the Media/Assistant submenu Filter-by variables
*
* @since 2.13
*
* @param array $preserves Filters to be retained
*
* @return void
*/
public static function mla_clear_filter_by( $preserves = array() ) {
$filters = array( 'author', 'heading_suffix', 'ids', 'mla-metakey', 'mla-metavalue', 'mla-tax', 'mla-term', 'parent' );
$filters = apply_filters( 'mla_list_table_clear_filter_by_filters', $filters, $preserves );
$preserves = apply_filters( 'mla_list_table_clear_filter_by_preserves', $preserves, $filters );
foreach ( $filters as $filter ) {
if ( ! in_array( $filter, $preserves ) ) {
unset( $_REQUEST[ $filter ] );
}
}
do_action( 'mla_list_table_clear_filter_by' );
}
/**
* Render the "Assistant" subpage in the Media section, using the list_table package
*
* @since 0.1
*
* @return void
*/
public static function mla_render_admin_page( ) {
// Prevent _wp_http_referer recursion with method="get", preserve WPML/Polylang language selection
$_SERVER['REQUEST_URI'] = parse_url( admin_url( 'upload.php' ), PHP_URL_PATH ) . '?page=mla-menu';
$query = array();
parse_str( strval( $_SERVER[ 'QUERY_STRING' ] ), $query );
if ( !empty( $query['lang'] ) ) {
$_SERVER['REQUEST_URI'] .= '&lang=' . $query['lang'];
}
/*
* WordPress class-wp-list-table.php doesn't look in hidden fields to set
* the month filter dropdown or sorting parameters
*/
if ( isset( $_REQUEST['m'] ) ) {
$_GET['m'] = $_REQUEST['m'];
}
if ( isset( $_REQUEST['order'] ) ) {
$_GET['order'] = $_REQUEST['order'];
}
if ( isset( $_REQUEST['orderby'] ) ) {
$_GET['orderby'] = $_REQUEST['orderby'];
}
// bulk_refresh simply refreshes the page, ignoring other bulk actions
if ( ! empty( $_REQUEST['bulk_refresh'] ) ) {
unset( $_REQUEST['action'] );
unset( $_POST['action'] );
unset( $_GET['action'] );
unset( $_REQUEST['action2'] );
unset( $_POST['action2'] );
unset( $_GET['action2'] );
}
$bulk_action = self::_current_bulk_action();
$page_title = MLACore::mla_get_option( MLACoreOptions::MLA_SCREEN_PAGE_TITLE );
if ( empty( $page_title ) ) {
$page_title = MLACore::mla_get_option( MLACoreOptions::MLA_SCREEN_PAGE_TITLE, true );
}
echo "<div class=\"wrap\">\n";
echo "<h1 class=\"wp-heading-inline\">{$page_title}"; // trailing </h1> is action-specific
if ( !current_user_can( 'upload_files' ) ) {
echo ' - ' . __( 'ERROR', 'media-library-assistant' ) . "</h1>\n";
wp_die( __( 'You do not have permission to manage attachments.', 'media-library-assistant' ) );
}
$heading_tail = "</h1>\n<a href=\"media-new.php\" class=\"page-title-action\">" . esc_html_x('Add New', 'file') . "</a>\n<hr class=\"wp-header-end\">\n";
$page_content = array(
'message' => '',
'body' => ''
);
if ( !empty( $_REQUEST['mla_admin_message'] ) ) {
$page_content['message'] = $_REQUEST['mla_admin_message'];
}
/*
* The category taxonomy (edit screens) is a special case because
* post_categories_meta_box() changes the input name
*/
if ( !isset( $_REQUEST['tax_input'] ) ) {
$_REQUEST['tax_input'] = array();
}
if ( isset( $_REQUEST['post_category'] ) ) {
$_REQUEST['tax_input']['category'] = $_REQUEST['post_category'];
unset ( $_REQUEST['post_category'] );
}
// Process bulk actions that affect an array of items
if ( $bulk_action && ( $bulk_action != 'none' ) ) {
// bulk_refresh simply refreshes the page, ignoring other bulk actions
if ( empty( $_REQUEST['bulk_refresh'] ) ) {
$item_content = self::mla_process_bulk_action( $bulk_action );
$page_content['message'] .= $item_content['message'] . '<br>';
}
} // $bulk_action
if ( isset( $_REQUEST['clear_filter_by'] ) ) {
self::mla_clear_filter_by();
}
// Empty the Trash?
if ( isset( $_REQUEST['delete_all'] ) ) {
global $wpdb;
$ids = $wpdb->get_col( $wpdb->prepare( "SELECT ID FROM $wpdb->posts WHERE post_type=%s AND post_status = %s", 'attachment', 'trash' ) );
$delete_count = 0;
foreach ( $ids as $post_id ) {
$item_content = self::_delete_single_item( $post_id );
if ( false !== strpos( $item_content['message'], __( 'ERROR', 'media-library-assistant' ) ) ) {
$page_content['message'] .= $item_content['message'] . '<br>';
} else {
$delete_count++;
}
}
if ( $delete_count ) {
/* translators: 1: number of items */
$page_content['message'] .= sprintf( _nx( '%s item deleted.', '%s items deleted.', $delete_count, 'deleted items', 'media-library-assistant' ), number_format_i18n( $delete_count ) );
} else {
$page_content['message'] .= __( 'No items deleted.', 'media-library-assistant' );
}
}
// Process row-level actions that affect a single item
if ( !empty( $_REQUEST['mla_admin_action'] ) ) {
check_admin_referer( MLACore::MLA_ADMIN_NONCE_ACTION, MLACore::MLA_ADMIN_NONCE_NAME );
$page_content = apply_filters( 'mla_list_table_single_action', NULL, $_REQUEST['mla_admin_action'], ( isset( $_REQUEST['mla_item_ID'] ) ? $_REQUEST['mla_item_ID'] : 0 ) );
if ( is_null( $page_content ) ) {
$prevent_default = false;
$custom_message = '';
} else {
$prevent_default = isset( $page_content['prevent_default'] ) ? $page_content['prevent_default'] : false;
$custom_message = isset( $page_content['message'] ) ? $page_content['message'] : '';
}
if ( ! $prevent_default ) {
switch ( $_REQUEST['mla_admin_action'] ) {
case MLACore::MLA_ADMIN_SINGLE_DELETE:
$page_content = self::_delete_single_item( $_REQUEST['mla_item_ID'] );
break;
case MLACore::MLA_ADMIN_SINGLE_RESTORE:
$page_content = self::_restore_single_item( $_REQUEST['mla_item_ID'] );
break;
case MLACore::MLA_ADMIN_SINGLE_TRASH:
$page_content = self::_trash_single_item( $_REQUEST['mla_item_ID'] );
break;
case MLACore::MLA_ADMIN_SET_PARENT:
$new_data = array( 'post_parent' => $_REQUEST['found_post_id'] );
foreach( $_REQUEST['children'] as $child ) {
$item_content = MLAData::mla_update_single_item( $child, $new_data );
$page_content['message'] .= $item_content['message'] . '<br>';
}
unset( $_REQUEST['parent'] );
unset( $_REQUEST['children'] );
unset( $_REQUEST['mla-set-parent-ajax-nonce'] );
unset( $_REQUEST['mla_set_parent_search_text'] );
unset( $_REQUEST['found_post_id'] );
unset( $_REQUEST['mla-set-parent-submit'] );
break;
case MLACore::MLA_ADMIN_TERMS_SEARCH:
/*
* This will be handled as a database query argument,
* but validate the arguments here
*/
$mla_terms_search = isset( $_REQUEST['mla_terms_search'] ) ? $_REQUEST['mla_terms_search'] : array( 'phrases' => '', 'taxonomies' => array() );
if ( ! is_array( $mla_terms_search ) || empty( $mla_terms_search['phrases'] ) || empty( $mla_terms_search['taxonomies'] ) ) {
unset( $_REQUEST['mla_terms_search'] );
$page_content = array(
'message' => __( 'Empty Terms Search; ignored', 'media-library-assistant' ),
'body' => ''
);
} else {
unset( $_REQUEST['mla_terms_search']['submit'] );
}
break;
default:
$page_content = apply_filters( 'mla_list_table_custom_single_action', NULL, $_REQUEST['mla_admin_action'], ( isset( $_REQUEST['mla_item_ID'] ) ? $_REQUEST['mla_item_ID'] : 0 ) );
if ( is_null( $page_content ) ) {
$page_content = array(
/* translators: 1: row-level action, e.g., single_item_delete, single_item_edit */
'message' => sprintf( __( 'Unknown mla_admin_action - "%1$s"', 'media-library-assistant' ), $_REQUEST['mla_admin_action'] ),
'body' => ''
);
} // Unknown mla_admin_action
} // switch ($_REQUEST['mla_admin_action'])
} // ! $prevent_default
if ( ! empty( $custom_message ) ) {
$page_content['message'] = $custom_message . $page_content['message'];
}
} // (!empty($_REQUEST['mla_admin_action'])
// Don't let WPML copy these to language-specific URLs
foreach ( array( 'action', 'action2', 'cb_attachment', 'clear_filter_by', 'delete_all', 'mla_admin_action' ) as $argument ) {
unset( $_REQUEST[ $argument ] );
unset( $_POST[ $argument ] );
unset( $_GET[ $argument ] );
}
// Avoid "headers already sent" error with JoomUnited's WP Media Folders
if (isset($_REQUEST['s']) && $_REQUEST['s'] === '') {
unset( $_REQUEST['s'] );
unset( $_POST['s'] );
unset( $_GET['s'] );
}
if ( !empty( $page_content['body'] ) ) {
if ( !empty( $page_content['message'] ) ) {
if ( false !== strpos( $page_content['message'], __( 'ERROR', 'media-library-assistant' ) ) ) {
$messages_class = 'mla_errors';
} else {
$messages_class = 'mla_messages';
}
echo " <div class=\"{$messages_class}\"><p>\n";
echo ' ' . $page_content['message'] . "\n";
echo " </p></div>\n"; // id="message"
}
echo $page_content['body'];
} else {
// Display Attachments list
if ( !empty( $_REQUEST['heading_suffix'] ) ) {
echo ' - ' . esc_html( $_REQUEST['heading_suffix'] ) . $heading_tail;
} elseif ( !empty( $_REQUEST['mla_terms_search'] ) ) {
echo ' - ' . __( 'term search results for', 'media-library-assistant' ) . ' "' . esc_html( stripslashes( trim( $_REQUEST['mla_terms_search']['phrases'] ) ) ) . "\"" . $heading_tail;
} elseif ( !empty( $_REQUEST['s'] ) ) {
if ( empty( $_REQUEST['mla_search_fields'] ) ) {
echo ' - ' . __( 'post/parent results for', 'media-library-assistant' ) . ' "' . esc_html( stripslashes( trim( $_REQUEST['s'] ) ) ) . "\"" . $heading_tail;
} else {
echo ' - ' . __( 'search results for', 'media-library-assistant' ) . ' "' . esc_html( stripslashes( trim( $_REQUEST['s'] ) ) ) . "\"" . $heading_tail;
}
} else {
echo $heading_tail;
}
if ( !empty( $page_content['message'] ) ) {
if ( false !== strpos( $page_content['message'], __( 'ERROR', 'media-library-assistant' ) ) ) {
$messages_class = 'mla_errors';
} else {
$messages_class = 'mla_messages';
}
echo " <div class=\"{$messages_class}\"><p>\n";
echo ' ' . $page_content['message'] . "\n";
echo " </p></div>\n"; // id="message"
}
// Create an instance of our package class...
$MLAListTable = apply_filters( 'mla_list_table_new_instance', NULL );
if ( is_null( $MLAListTable ) ) {
$MLAListTable = new MLA_List_Table();
}
// Fetch, prepare, sort, and filter our data...
$MLAListTable->prepare_items();
$MLAListTable->views();
$view_arguments = MLA_List_Table::mla_submenu_arguments();
if ( isset( $view_arguments['lang'] ) ) { // from WPML/Polylang
$form_url = 'upload.php?page=' . MLACore::ADMIN_PAGE_SLUG . '&lang=' . $view_arguments['lang'];
} else {
$form_url = 'upload.php?page=' . MLACore::ADMIN_PAGE_SLUG;
}
// Forms are NOT created automatically, wrap the table in one to use features like bulk actions
echo "\n" . '<form action="' . admin_url( $form_url ) . '" method="get" id="mla-filter">' . "\n";
// Include the Search Media box
require_once MLA_PLUGIN_PATH . 'includes/mla-main-search-box-template.php';
// We also need to ensure that the form posts back to our current page and remember all the view arguments
echo sprintf( '<input type="hidden" name="page" value="%1$s" />', $_REQUEST['page'] ) . "\n";
// Pass the WPML/Polylang language in the form
if ( isset( $view_arguments['lang'] ) ) {
echo sprintf( '<input type="hidden" name="lang" value="%1$s" />', $view_arguments['lang'] ) . "\n";
}
foreach ( $view_arguments as $key => $value ) {
if ( 'meta_query' == $key ) {
$value = stripslashes( $_REQUEST['meta_query'] );
}
/*
* Search box elements are already set up in the above "search-box"
* 'lang' has already been added to the form action attribute
*/
if ( in_array( $key, array( 's', 'mla_search_connector', 'mla_search_fields', 'lang' ) ) ) {
continue;
}
if ( is_array( $value ) ) {
foreach ( $value as $element_key => $element_value )
echo sprintf( '<input type="hidden" name="%1$s[%2$s]" value="%3$s" />', $key, $element_key, esc_attr( $element_value ) ) . "\n";
} else {
echo sprintf( '<input type="hidden" name="%1$s" value="%2$s" />', $key, esc_attr( $value ) ) . "\n";
}
}
// Now we can render the completed list table
$MLAListTable->display();
echo "</form><!-- id=mla-filter -->\n";
/*
* Insert the hidden form and table for inline edits (quick & bulk)
*/
echo self::_build_inline_edit_form( $MLAListTable );
echo "<div id=\"ajax-response\"></div>\n";
echo "<br class=\"clear\" />\n";
echo "</div><!-- class=wrap -->\n";
} // display attachments list
}
/**
* Ajax handler for bulk editing and mapping
*
* @since 2.00
*
* @return void echo json results or error message, then die()
*/
private static function _bulk_edit_ajax_handler() {
/*
* The category taxonomy (edit screens) is a special case because
* post_categories_meta_box() changes the input name
*/
if ( !isset( $_REQUEST['tax_input'] ) ) {
$_REQUEST['tax_input'] = array();
}
if ( isset( $_REQUEST['post_category'] ) ) {
$_REQUEST['tax_input']['category'] = $_REQUEST['post_category'];
unset ( $_REQUEST['post_category'] );
}
/*
* Convert bulk_action to the old button name/value variables
*/
switch ( $_REQUEST['bulk_action'] ) {
case 'bulk_custom_field_map':
$_REQUEST['bulk_custom_field_map'] = __( 'Map Custom Field metadata', 'media-library-assistant' );
break;
case 'bulk_map':
$_REQUEST['bulk_map'] = __( 'Map IPTC/EXIF metadata', 'media-library-assistant' );
break;
case 'bulk_edit':
$_REQUEST['bulk_edit'] = __( 'Update', 'media-library-assistant' );
}
$item_content = (object) self::mla_process_bulk_action( 'edit' );
wp_send_json_success( $item_content );
}
/**
* Ajax handler for inline editing
*
* Adapted for Quick Edit from wp_ajax_inline_save in /wp-admin/includes/ajax-actions.php
*
* @since 0.20
*
* @return void echo HTML <tr> markup for updated row or error message, then die()
*/
public static function mla_inline_edit_ajax_action() {
set_current_screen( $_REQUEST['screen'] );
check_ajax_referer( MLACore::MLA_ADMIN_NONCE_ACTION, MLACore::MLA_ADMIN_NONCE_NAME );
if ( ! empty( $_REQUEST['bulk_action'] ) ) {
self::_bulk_edit_ajax_handler(); // calls wp_send_json_success and die()
}
if ( empty( $_REQUEST['post_ID'] ) ) {
echo __( 'ERROR', 'media-library-assistant' ) . ': ' . __( 'No post ID found', 'media-library-assistant' );
die();
} else {
$post_id = $_REQUEST['post_ID'];
}
if ( ! current_user_can( 'edit_post', $post_id ) ) {
wp_die( __( 'ERROR', 'media-library-assistant' ) . ': ' . __( 'You are not allowed to edit this Attachment.', 'media-library-assistant' ) );
}
// Custom field support
$custom_fields = array();
foreach ( MLACore::mla_custom_field_support( 'quick_edit' ) as $slug => $details ) {
if ( isset( $_REQUEST[ $slug ] ) ) {
$value = trim( $_REQUEST[ $slug ] );
unset ( $_REQUEST[ $slug ] );
// '(Array)' indicates an existing array value in the field, which we preserve
if ( 'array' == $details['option'] ) {
$value = explode( ',', $value );
} elseif ( '(Array)' == $value ) {
continue;
}
if ( $details['no_null'] && empty( $value ) ) {
$custom_fields[ $details['name'] ] = NULL;
} else {
$custom_fields[ $details['name'] ] = $value;
}
}
}
if ( ! empty( $custom_fields ) ) {
$_REQUEST[ 'custom_updates' ] = $custom_fields;
}
// The category taxonomy is a special case because post_categories_meta_box() changes the input name
if ( !isset( $_REQUEST['tax_input'] ) ) {
$_REQUEST['tax_input'] = array();
}
if ( isset( $_REQUEST['post_category'] ) ) {
$_REQUEST['tax_input']['category'] = $_REQUEST['post_category'];
unset ( $_REQUEST['post_category'] );
}
if ( ! empty( $_REQUEST['tax_input'] ) ) {
// Flat taxonomy strings must be cleaned up and duplicates removed
$tax_output = array();
foreach ( $_REQUEST['tax_input'] as $tax_name => $tax_value ) {
if ( is_array( $tax_value ) ) {
// Make sure term_id values are integers, not strings, for flat-checklist
$tax_value = array_map( 'absint', $tax_value );
} else {
$comma = _x( ',', 'tag_delimiter', 'media-library-assistant' );
if ( ',' != $comma ) {
$tax_value = str_replace( $comma, ',', $tax_value );
}
$tax_value = preg_replace( '#\s*,\s*#', ',', $tax_value );
$tax_value = preg_replace( '#,+#', ',', $tax_value );
$tax_value = preg_replace( '#[,\s]+$#', '', $tax_value );
$tax_value = preg_replace( '#^[,\s]+#', '', $tax_value );
if ( ',' != $comma ) {
$tax_value = str_replace( ',', $comma, $tax_value );
}
$tax_array = array();
$dedup_array = explode( $comma, $tax_value );
foreach ( $dedup_array as $tax_value )
$tax_array [$tax_value] = $tax_value;
$tax_value = implode( $comma, $tax_array );
} // ! array( $tax_value )
$tax_output[$tax_name] = $tax_value;
} // foreach tax_input
$_REQUEST['tax_input'] = $tax_output;
} // ! empty( $_REQUEST['tax_input'] )
$item_content = apply_filters( 'mla_list_table_inline_action', NULL, $post_id );
if ( is_null( $item_content ) ) {
$prevent_default = false;
$custom_message = '';
} else {
$prevent_default = isset( $item_content['prevent_default'] ) ? $item_content['prevent_default'] : false;
$custom_message = isset( $item_content['message'] ) ? $page_content['message'] : '';
}
if ( ! $prevent_default ) {
MLACore::mla_debug_add( __LINE__ . " MLA::mla_inline_edit_ajax_action( {$post_id} ) \$_REQUEST = " . var_export( $_REQUEST, true ), MLACore::MLA_DEBUG_CATEGORY_AJAX );
$new_date = sprintf( "%04d-%02d-%02d %02d:%02d:%02d", $_REQUEST['aa'], $_REQUEST['mm'], $_REQUEST['jj'], $_REQUEST['hh'], $_REQUEST['mn'], $_REQUEST['ss'] );
if ( wp_checkdate( $_REQUEST['mm'], $_REQUEST['jj'], $_REQUEST['aa'], $new_date ) ) {
$_REQUEST['post_date'] = $new_date;
$_REQUEST['post_date_gmt'] = get_gmt_from_date( $new_date );
}
$results = MLAData::mla_update_single_item( $post_id, $_REQUEST, $_REQUEST['tax_input'] );
MLACore::mla_debug_add( __LINE__ . " MLA::mla_inline_edit_ajax_action( {$post_id} ) results = " . var_export( $results, true ), MLACore::MLA_DEBUG_CATEGORY_AJAX );
}
$new_item = (object) MLAData::mla_get_attachment_by_id( $post_id );
MLACore::mla_debug_add( __LINE__ . " MLA::mla_inline_edit_ajax_action( {$post_id} ) new_item = " . var_export( $new_item, true ), MLACore::MLA_DEBUG_CATEGORY_AJAX );
// Create an instance of our package class and echo the new HTML
$MLAListTable = apply_filters( 'mla_list_table_new_instance', NULL );
if ( is_null( $MLAListTable ) ) {
$MLAListTable = new MLA_List_Table();
}
$MLAListTable->single_row( $new_item );
die(); // this is required to return a proper result
}
/**
* Compose a Post Type Options list with current selection
*
* @since 1.90
*
* @param array template parts
* @param string current selection or 'all' (default)
*
* @return string HTML markup with select field options
*/
private static function _compose_post_type_select( &$templates, $selection = 'all' ) {
$option_template = $templates['post-type-select-option'];
$option_values = array (
'selected' => ( 'all' == $selection ) ? 'selected="selected"' : '',
'value' => 'all',
'text' => '&mdash; ' . __( 'All Post Types', 'media-library-assistant' ) . ' &mdash;'
);
$options = MLAData::mla_parse_template( $option_template, $option_values );
$post_types = get_post_types( array( 'public' => true ), 'objects' );
unset( $post_types['attachment'] );
foreach ( $post_types as $key => $value ) {
$option_values = array (
'selected' => ( $key == $selection ) ? 'selected="selected"' : '',
'value' => $key,
'text' => $value->labels->name
);
$options .= MLAData::mla_parse_template( $option_template, $option_values );
} // foreach post_type
$select_template = $templates['post-type-select'];
$select_values = array (
'options' => $options,
);
$select = MLAData::mla_parse_template( $select_template, $select_values );
return $select;
} // _compose_post_type_select
/**
* Build the hidden form for the "Set Parent" popup modal window
*
* @since 1.90
*
* @param boolean true to return complete form, false to return mla-set-parent-div
*
* @return string HTML <form> markup for hidden form
*/
public static function mla_set_parent_form( $return_form = true ) {
$set_parent_template = MLACore::mla_load_template( 'admin-set-parent-form.tpl' );
if ( ! is_array( $set_parent_template ) ) {
/* translators: 1: ERROR tag 2: function name 3: non-array value */
MLACore::mla_debug_add( sprintf( _x( '%1$s: %2$s non-array "%3$s"', 'error_log', 'media-library-assistant' ), __( 'ERROR', 'media-library-assistant' ), 'MLA::_build_inline_edit_form', var_export( $set_parent_template, true ) ), MLACore::MLA_DEBUG_CATEGORY_ANY );
return '';
}
$page_values = array(
'Select Parent' => __( 'Select Parent', 'media-library-assistant' ),
'Search' => __( 'Search', 'media-library-assistant' ),
'post_type_dropdown' => self::_compose_post_type_select( $set_parent_template, 'all' ),
'For' => __( 'For', 'media-library-assistant' ),
'Previous' => '&laquo;',
'Next' => '&raquo;',
'count' => '50',
'paged' => '1',
'found' => '0',
'Title' => __( 'Title', 'media-library-assistant' ),
'Type' => __( 'Type', 'media-library-assistant' ),
'Date' => __( 'Date', 'media-library-assistant' ),
'Status' => __( 'Status', 'media-library-assistant' ),
'Unattached' => __( 'Unattached', 'media-library-assistant' ),
'mla_find_posts_nonce' => wp_nonce_field( 'mla_find_posts', 'mla-set-parent-ajax-nonce', false, false ),
);
ob_start();
submit_button( __( 'Cancel', 'media-library-assistant' ), 'button-secondary cancel alignleft', 'mla-set-parent-cancel', false );
$page_values['mla_set_parent_cancel'] = ob_get_clean();
ob_start();
submit_button( __( 'Update', 'media-library-assistant' ), 'button-primary alignright', 'mla-set-parent-submit', false );
$page_values['mla_set_parent_update'] = ob_get_clean();
$set_parent_div = MLAData::mla_parse_template( $set_parent_template['mla-set-parent-div'], $page_values );
if ( ! $return_form ) {
return $set_parent_div;
}
$page_values = array(
'mla_set_parent_url' => esc_url( add_query_arg( array_merge( MLA_List_Table::mla_submenu_arguments( false ), array( 'page' => MLACore::ADMIN_PAGE_SLUG ) ), admin_url( 'upload.php' ) ) ),
'mla_set_parent_action' => MLACore::MLA_ADMIN_SET_PARENT,
'wpnonce' => wp_nonce_field( MLACore::MLA_ADMIN_NONCE_ACTION, MLACore::MLA_ADMIN_NONCE_NAME, true, false ),
'mla_set_parent_div' => $set_parent_div,
);
$set_parent_form = MLAData::mla_parse_template( $set_parent_template['mla-set-parent-form'], $page_values );
return $set_parent_form;
}
/**
* Generate HTML form elements for editing uploaded on date
*
* Adapted from /wp-admin/includes/template.php function touch_time()
*
* @since 2.71
*
* @global WP_Locale $wp_locale for month name abbreviations
*
* @return string HTML markup for the Uploaded on edit form
*/
private static function _generate_time_edit_form() {
global $wp_locale;
$current = current_time('timestamp');
$jj = gmdate( 'd', $current );
$mm = gmdate( 'm', $current );
$aa = gmdate( 'Y', $current );
$hh = gmdate( 'H', $current );
$mn = gmdate( 'i', $current );
$ss = gmdate( 's', $current );
$month = '<label><span class="screen-reader-text">' . __( 'Month' ) . '</span><select name="mm" ' . ">\n";
for ( $i = 1; $i < 13; $i = $i +1 ) {
$monthnum = zeroise($i, 2);
$monthtext = $wp_locale->get_month_abbrev( $wp_locale->get_month( $i ) );
$month .= ' <option value="' . $monthnum . '" data-text="' . $monthtext . '" ' . selected( $monthnum, $mm, false ) . '>';
/* translators: 1: month number (01, 02, etc.), 2: month abbreviation */
$month .= sprintf( __( '%1$s-%2$s' ), $monthnum, $monthtext ) . "</option>\n";
}
$month .= '</select></label>';
$day = '<label><span class="screen-reader-text">' . __( 'Day' ) . '</span><input type="text" name="jj" value="' . $jj . '" size="2" maxlength="2" autocomplete="off" /></label>';
$year = '<label><span class="screen-reader-text">' . __( 'Year' ) . '</span><input type="text" name="aa" value="' . $aa . '" size="4" maxlength="4" autocomplete="off" /></label>';
$hour = '<label><span class="screen-reader-text">' . __( 'Hour' ) . '</span><input type="text" name="hh" value="' . $hh . '" size="2" maxlength="2" autocomplete="off" /></label>';
$minute = '<label><span class="screen-reader-text">' . __( 'Minute' ) . '</span><input type="text" name="mn" value="' . $mn . '" size="2" maxlength="2" autocomplete="off" /></label>';
$time_edit_form = '<fieldset class="inline-edit-date">' . "\n";
$time_edit_form .= '<legend><span class="title">' . sprintf( __( 'Uploaded on: %s' ), '' ) . '</span></legend>' . "\n";
$time_edit_form .= '<div class="timestamp-wrap">' . "\n";
$time_edit_form .= sprintf( __( '%1$s %2$s, %3$s @ %4$s:%5$s' ), $month, $day, $year, $hour, $minute );
$time_edit_form .= "</div>\n";
$time_edit_form .= '<input type="hidden" name="ss" value="' . $ss . '" />' . "\n";
$time_edit_form .= "</fieldset>\n";
return $time_edit_form;
}
/**
* Build the hidden row templates for inline editing (quick and bulk edit)
*
* inspired by inline_edit() in wp-admin\includes\class-wp-posts-list-table.php.
*
* @since 0.20
*
* @param object MLA List Table object
*
* @return string HTML <form> markup for hidden rows
*/
private static function _build_inline_edit_form( $MLAListTable ) {
$taxonomies = get_object_taxonomies( 'attachment', 'objects' );
$hierarchical_taxonomies = array();
$flat_taxonomies = array();
foreach ( $taxonomies as $tax_name => $tax_object ) {
if ( $tax_object->show_ui && MLACore::mla_taxonomy_support($tax_name, 'quick-edit') ) {
if ( $tax_object->hierarchical ) {
$hierarchical_taxonomies[$tax_name] = $tax_object;
} else {
$flat_taxonomies[$tax_name] = $tax_object;
}
}
}
$page_template_array = MLACore::mla_load_template( 'admin-inline-edit-form.tpl' );
if ( ! is_array( $page_template_array ) ) {
/* translators: 1: ERROR tag 2: function name 3: non-array value */
MLACore::mla_debug_add( sprintf( _x( '%1$s: %2$s non-array "%3$s"', 'error_log', 'media-library-assistant' ), __( 'ERROR', 'media-library-assistant' ), 'MLA::_build_inline_edit_form', var_export( $page_template_array, true ) ), MLACore::MLA_DEBUG_CATEGORY_ANY );
return '';
}
if ( $authors = self::mla_authors_dropdown() ) {
$authors_dropdown = ' <label class="inline-edit-author">' . "\n";
$authors_dropdown .= ' <span class="title">' . __( 'Author', 'media-library-assistant' ) . '</span>' . "\n";
$authors_dropdown .= $authors . "\n";
$authors_dropdown .= ' </label>' . "\n";
} else {
$authors_dropdown = '';
}
$custom_fields = '';
foreach ( MLACore::mla_custom_field_support( 'quick_edit' ) as $slug => $details ) {
$page_values = array(
'slug' => $slug,
'label' => esc_attr( $details['name'] ),
);
$custom_fields .= MLAData::mla_parse_template( $page_template_array['custom_field'], $page_values );
}
// The middle column contains the hierarchical taxonomies, e.g., Att. Category
$quick_middle_column = '';
$bulk_middle_column = '';
if ( count( $hierarchical_taxonomies ) ) {
$quick_category_blocks = '';
$bulk_category_blocks = '';
foreach ( $hierarchical_taxonomies as $tax_name => $tax_object ) {
if ( current_user_can( $tax_object->cap->assign_terms ) ) {
ob_start();
wp_terms_checklist( NULL, array( 'taxonomy' => $tax_name, 'popular_cats' => array(), ) );
$tax_checklist = ob_get_contents();
ob_end_clean();
if ( MLACore::mla_taxonomy_support( $tax_name, 'checklist-add-term' ) ) {
$page_values = array(
'tax_attr' => esc_attr( $tax_name ),
'Add New Term' => __( '+&nbsp;Add&nbsp;New&nbsp;Term', 'media-library-assistant' ),
'Add Reader' => __( 'Add New', 'media-library-assistant' ) . ' ' . esc_html( $tax_object->labels->singular_name ),
'tax_parents' => wp_dropdown_categories( array( 'taxonomy' => $tax_name, 'hide_empty' => 0, 'name' => "new{$tax_name}_parent", 'orderby' => 'name', 'hierarchical' => 1, 'show_option_none' => '&mdash; ' . $tax_object->labels->parent_item . ' &mdash;', 'echo' => 0 ) ),
'Add Button' => esc_html( $tax_object->labels->add_new_item ),
'ajax_nonce_field' => wp_nonce_field( 'add-'.$tax_name, '_ajax_nonce-add-'.$tax_name, false ),
);
$category_add_link = MLAData::mla_parse_template( $page_template_array['category_add_link'], $page_values );
$category_adder = MLAData::mla_parse_template( $page_template_array['category_adder'], $page_values );
} else {
$category_add_link = '';
$category_adder = '';
}
$page_values = array(
'tax_html' => esc_html( $tax_object->labels->name ),
'tax_attr' => esc_attr( $tax_name ),
'tax_checklist' => $tax_checklist,
'category_add_link' => $category_add_link,
'Search' => __( '?&nbsp;Search', 'media-library-assistant' ),
'category_adder' => $category_adder,
'Search Reader' => __( 'Search', 'media-library-assistant' ) . ' ' . esc_html( $tax_object->labels->name ),
'Add' => __( 'Add', 'media-library-assistant' ),
'Remove' => __( 'Remove', 'media-library-assistant' ),
'Replace' => __( 'Replace', 'media-library-assistant' ),
);
$category_block = MLAData::mla_parse_template( $page_template_array['category_block'], $page_values );
$taxonomy_options = MLAData::mla_parse_template( $page_template_array['taxonomy_options'], $page_values );
$quick_category_blocks .= $category_block;
$bulk_category_blocks .= $category_block . $taxonomy_options;
} // current_user_can
} // foreach $hierarchical_taxonomies
$page_values = array(
'category_blocks' => $quick_category_blocks
);
$quick_middle_column = MLAData::mla_parse_template( $page_template_array['category_fieldset'], $page_values );
$page_values = array(
'category_blocks' => $bulk_category_blocks
);
$bulk_middle_column = MLAData::mla_parse_template( $page_template_array['category_fieldset'], $page_values );
} // count( $hierarchical_taxonomies )
// The right-hand column contains the flat taxonomies, e.g., Att. Tag
$quick_right_column = '';
$bulk_right_column = '';
if ( count( $flat_taxonomies ) ) {
$quick_tag_blocks = '';
$bulk_tag_blocks = '';
foreach ( $flat_taxonomies as $tax_name => $tax_object ) {
if ( current_user_can( $tax_object->cap->assign_terms ) ) {
if ( MLACore::mla_taxonomy_support( $tax_name, 'flat-checklist' ) ) {
ob_start();
wp_terms_checklist( NULL, array( 'taxonomy' => $tax_name, 'popular_cats' => array(), ) );
$tax_checklist = ob_get_contents();
ob_end_clean();
if ( MLACore::mla_taxonomy_support( $tax_name, 'checklist-add-term' ) ) {
$page_values = array(
'tax_attr' => esc_attr( $tax_name ),
'Add New Term' => __( '+&nbsp;Add&nbsp;New&nbsp;Term', 'media-library-assistant' ),
'Add Reader' => __( 'Add New', 'media-library-assistant' ) . ' ' . esc_html( $tax_object->labels->singular_name ),
'tax_parents' => "<input type='hidden' name='new{$tax_name}_parent' id='new{$tax_name}_parent' value='-1' />",
'Add Button' => esc_html( $tax_object->labels->add_new_item ),
'ajax_nonce_field' => wp_nonce_field( 'add-'.$tax_name, '_ajax_nonce-add-'.$tax_name, false ),
);
$category_add_link = MLAData::mla_parse_template( $page_template_array['category_add_link'], $page_values );
$category_adder = MLAData::mla_parse_template( $page_template_array['category_adder'], $page_values );
} else {
$category_add_link = '';
$category_adder = '';
}
$page_values = array(
'tax_html' => esc_html( $tax_object->labels->name ),
'tax_attr' => esc_attr( $tax_name ),
'tax_checklist' => $tax_checklist,
'category_add_link' => $category_add_link,
'Search' => __( '?&nbsp;Search', 'media-library-assistant' ),
'category_adder' => $category_adder,
'Search Reader' => __( 'Search', 'media-library-assistant' ) . ' ' . esc_html( $tax_object->labels->name ),
'Add' => __( 'Add', 'media-library-assistant' ),
'Remove' => __( 'Remove', 'media-library-assistant' ),
'Replace' => __( 'Replace', 'media-library-assistant' ),
);
$tag_block = MLAData::mla_parse_template( $page_template_array['category_block'], $page_values );
} else {
$page_values = array(
'tax_html' => esc_html( $tax_object->labels->name ),
'tax_attr' => esc_attr( $tax_name ),
'Add' => __( 'Add', 'media-library-assistant' ),
'Remove' => __( 'Remove', 'media-library-assistant' ),
'Replace' => __( 'Replace', 'media-library-assistant' ),
);
$tag_block = MLAData::mla_parse_template( $page_template_array['tag_block'], $page_values );
}
$taxonomy_options = MLAData::mla_parse_template( $page_template_array['taxonomy_options'], $page_values );
$quick_tag_blocks .= $tag_block;
$bulk_tag_blocks .= $tag_block . $taxonomy_options;
} // current_user_can
} // foreach $flat_taxonomies
$page_values = array(
'tag_blocks' => $quick_tag_blocks
);
$quick_right_column = MLAData::mla_parse_template( $page_template_array['tag_fieldset'], $page_values );
$page_values = array(
'tag_blocks' => $bulk_tag_blocks
);
$bulk_right_column = MLAData::mla_parse_template( $page_template_array['tag_fieldset'], $page_values );
} // count( $flat_taxonomies )
if ( $authors = self::mla_authors_dropdown( -1 ) ) {
$bulk_authors_dropdown = ' <label class="inline-edit-author alignright">' . "\n";
$bulk_authors_dropdown .= ' <span class="title">' . __( 'Author', 'media-library-assistant' ) . '</span>' . "\n";
$bulk_authors_dropdown .= $authors . "\n";
$bulk_authors_dropdown .= ' </label>' . "\n";
} else {
$bulk_authors_dropdown = '';
}
$bulk_custom_fields = '';
foreach ( MLACore::mla_custom_field_support( 'bulk_edit' ) as $slug => $details ) {
$page_values = array(
'slug' => $slug,
'label' => esc_attr( $details['name'] ),
);
$bulk_custom_fields .= MLAData::mla_parse_template( $page_template_array['custom_field'], $page_values );
}
$set_parent_form = MLA::mla_set_parent_form();
if ( 'checked' == MLACore::mla_get_option( MLACoreOptions::MLA_BULK_EDITOR ) ) {
$quicktags_settings = array( 'buttons' => 'strong,em,link,block,del,ins,img,ul,ol,li,code,close' );
ob_start();
wp_editor( '', 'post_content', array( 'media_buttons' => false, 'tinymce' => false, 'textarea_rows' => 5, 'quicktags' => $quicktags_settings ) );
$description_field = ob_get_contents();
ob_end_clean();
} else {
$description_field = '<textarea class="widefat" name="post_content"></textarea>';
}
$page_values = array(
'colspan' => $MLAListTable->get_column_count(),
'Quick Edit' => __( 'Quick Edit', 'media-library-assistant' ),
'Title' => __( 'Title', 'media-library-assistant' ),
'Name/Slug' => __( 'Name/Slug', 'media-library-assistant' ),
'Caption' => __( 'Caption', 'media-library-assistant' ),
'Description' => __( 'Description', 'media-library-assistant' ),
'description_field' => $description_field,
'ALT Text' => __( 'ALT Text', 'media-library-assistant' ),
'Uploaded on' => self::_generate_time_edit_form(),
'Bulk Uploaded on' => __( 'Uploaded on', 'media-library-assistant' ),
'Parent ID' => __( 'Parent ID', 'media-library-assistant' ),
'Select' => __( 'Select', 'media-library-assistant' ),
'Menu Order' => __( 'Menu Order', 'media-library-assistant' ),
'authors' => $authors_dropdown,
'custom_fields' => $custom_fields,
'quick_middle_column' => $quick_middle_column,
'quick_right_column' => $quick_right_column,
'Cancel' => __( 'Cancel', 'media-library-assistant' ),
'Reset' => __( 'Reset', 'media-library-assistant' ),
'Update' => __( 'Update', 'media-library-assistant' ),
'Bulk Edit' => __( 'Bulk Edit', 'media-library-assistant' ),
'bulk_middle_column' => $bulk_middle_column,
'bulk_right_column' => $bulk_right_column,
'bulk_authors' => $bulk_authors_dropdown,
'Comments' => __( 'Comments', 'media-library-assistant' ),
'Pings' => __( 'Pings', 'media-library-assistant' ),
'No Change' => __( 'No Change', 'media-library-assistant' ),
'Allow' => __( 'Allow', 'media-library-assistant' ),
'Do not allow' => __( 'Do not allow', 'media-library-assistant' ),
'bulk_custom_fields' => $bulk_custom_fields,
'bulk_map_style' => '',
'Map IPTC/EXIF metadata' => __( 'Map IPTC/EXIF metadata', 'media-library-assistant' ),
'bulk_custom_field_map_style' => '',
'Map Custom Field metadata' => __( 'Map Custom Field metadata', 'media-library-assistant' ),
'Bulk Waiting' => __( 'Waiting', 'media-library-assistant' ),
'Bulk Running' => __( 'In-process', 'media-library-assistant' ),
'Bulk Complete' => __( 'Complete', 'media-library-assistant' ),
'Refresh' => __( 'Refresh', 'media-library-assistant' ),
'set_parent_form' => $set_parent_form,
);
if ( 'checked' != MLACore::mla_get_option( MLACoreOptions::MLA_ALLOW_CUSTOM_FIELD_MAPPING ) ) {
$page_values['bulk_custom_field_map_style'] = 'display: none';
}
if ( 'checked' != MLACore::mla_get_option( MLACoreOptions::MLA_ALLOW_IPTC_EXIF_MAPPING ) ) {
$page_values['bulk_map_style'] = 'display: none';
}
$page_values = apply_filters( 'mla_list_table_inline_values', $page_values );
$page_template = apply_filters( 'mla_list_table_inline_template', $page_template_array['page'] );
$parse_value = MLAData::mla_parse_template( $page_template, $page_values );
return apply_filters( 'mla_list_table_inline_parse', $parse_value, $page_template, $page_values );
}
/**
* Get the edit Authors dropdown box, if user has suitable permissions
*
* @since 0.20
*
* @param integer Optional User ID of the current author, default 0
* @param string Optional HTML name attribute, default 'post_author'
* @param string Optional HTML class attribute, default 'authors'
*
* @return string|false HTML markup for the dropdown field or False
*/
public static function mla_authors_dropdown( $author = 0, $name = 'post_author', $class = 'authors' ) {
$post_type_object = get_post_type_object('attachment');
if ( is_super_admin() || current_user_can( $post_type_object->cap->edit_others_posts ) ) {
$users_opt = array(
'hide_if_only_one_author' => false,
'who' => 'authors',
'name' => $name,
'class'=> $class,
'multi' => 1,
'echo' => 0
);
if ( $author > 0 ) {
$users_opt['selected'] = $author;
$users_opt['include_selected'] = true;
} elseif ( -1 == $author ) {
$users_opt['show_option_none'] = '&mdash; ' . __( 'No Change', 'media-library-assistant' ) . ' &mdash;';
}
if ( $authors = wp_dropdown_users( $users_opt ) ) {
return $authors;
}
}
return false;
}
/**
* Get the current action selected from the bulk actions dropdown
*
* @since 0.1
*
* @return string|false The action name or False if no action was selected
*/
private static function _current_bulk_action( ) {
$action = false;
if ( isset( $_REQUEST['action'] ) ) {
if ( -1 != $_REQUEST['action'] ) {
return $_REQUEST['action'];
} else {
$action = 'none';
}
} // isset action
if ( isset( $_REQUEST['action2'] ) ) {
if ( -1 != $_REQUEST['action2'] ) {
return $_REQUEST['action2'];
} else {
$action = 'none';
}
} // isset action2
return $action;
}
/**
* Delete a single item permanently
*
* @since 0.1
*
* @param array The form POST data
*
* @return array success/failure message and NULL content
*/
private static function _delete_single_item( $post_id ) {
if ( !current_user_can( 'delete_post', $post_id ) ) {
return array(
'message' => __( 'ERROR', 'media-library-assistant' ) . ': ' . __( 'You are not allowed to delete this item.', 'media-library-assistant' ),
'body' => ''
);
}
if ( !wp_delete_attachment( $post_id, true ) ) {
return array(
/* translators: 1: ERROR tag 2: post ID */
'message' => sprintf( __( '%1$s: Item %2$d could NOT be deleted.', 'media-library-assistant' ), __( 'ERROR', 'media-library-assistant' ), $post_id ),
'body' => ''
);
}
return array(
/* translators: 1: post ID */
'message' => sprintf( __( 'Item %1$d permanently deleted.', 'media-library-assistant' ), $post_id ),
'body' => ''
);
}
/**
* Restore a single item from the Trash
*
* @since 0.1
*
* @param integer The WordPress Post ID of the attachment item
*
* @return array success/failure message and NULL content
*/
private static function _restore_single_item( $post_id ) {
if ( !current_user_can( 'delete_post', $post_id ) ) {
return array(
'message' => __( 'ERROR', 'media-library-assistant' ) . ': ' . __( 'You are not allowed to move this item out of the Trash.', 'media-library-assistant' ),
'body' => ''
);
}
if ( !wp_untrash_post( $post_id ) ) {
return array(
/* translators: 1: ERROR tag 2: post ID */
'message' => sprintf( __( '%1$s: Item %2$d could NOT be restored from Trash.', 'media-library-assistant' ), __( 'ERROR', 'media-library-assistant' ), $post_id ),
'body' => ''
);
}
/*
* Posts are restored to "draft" status, so this must be updated.
*/
$update_post = array();
$update_post['ID'] = $post_id;
$update_post['post_status'] = 'inherit';
wp_update_post( $update_post );
return array(
/* translators: 1: post ID */
'message' => sprintf( __( 'Item %1$d restored from Trash.', 'media-library-assistant' ), $post_id ),
'body' => ''
);
}
/**
* Move a single item to Trash
*
* @since 0.1
*
* @param integer The WordPress Post ID of the attachment item
*
* @return array success/failure message and NULL content
*/
private static function _trash_single_item( $post_id ) {
if ( !current_user_can( 'delete_post', $post_id ) ) {
return array(
'message' => __( 'ERROR', 'media-library-assistant' ) . ': ' . __( 'You are not allowed to move this item to the Trash.', 'media-library-assistant' ),
'body' => ''
);
}
if ( !wp_trash_post( $post_id, false ) ) {
return array(
/* translators: 1: ERROR tag 2: post ID */
'message' => sprintf( __( '%1$s: Item %2$d could NOT be moved to Trash.', 'media-library-assistant' ), __( 'ERROR', 'media-library-assistant' ), $post_id ),
'body' => ''
);
}
return array(
/* translators: 1: post ID */
'message' => sprintf( __( 'Item %1$d moved to Trash.', 'media-library-assistant' ), $post_id ),
'body' => ''
);
}
} // class MLA
?>