2070 lines
70 KiB
PHP
2070 lines
70 KiB
PHP
<?php
|
|
/**
|
|
* Media Library Assistant extended List Table class
|
|
*
|
|
* @package Media Library Assistant
|
|
* @since 0.1
|
|
*/
|
|
|
|
/*
|
|
* The WP_List_Table class isn't automatically available to plugins
|
|
*/
|
|
if ( !class_exists( 'WP_List_Table' ) ) {
|
|
require_once( ABSPATH . 'wp-admin/includes/class-wp-list-table.php' );
|
|
}
|
|
|
|
/**
|
|
* Class MLA (Media Library Assistant) List Table implements the "Assistant" admin submenu
|
|
*
|
|
* Extends the core WP_List_Table class.
|
|
*
|
|
* @package Media Library Assistant
|
|
* @since 0.1
|
|
*/
|
|
class MLA_List_Table extends WP_List_Table {
|
|
/**
|
|
* True if the current view is "Unattached"
|
|
*
|
|
* Declaration added in MLA v2.11 for WP 4.2 compatibility.
|
|
*
|
|
* @since 0.1
|
|
*
|
|
* @var int
|
|
*/
|
|
private $detached;
|
|
|
|
/**
|
|
* True if the current view is "Attached"
|
|
*
|
|
* @since 2.11
|
|
*
|
|
* @var int
|
|
*/
|
|
private $attached;
|
|
|
|
/**
|
|
* True if the current view is "Trash"
|
|
*
|
|
* Declaration added in MLA v2.11 for WP 4.2 compatibility.
|
|
*
|
|
* @since 0.1
|
|
*
|
|
* @var int
|
|
*/
|
|
private $is_trash;
|
|
|
|
/*
|
|
* These variables are used to assign row_actions to exactly one visible column
|
|
*/
|
|
|
|
/**
|
|
* Records assignment of row-level actions to a table row
|
|
*
|
|
* Set to the current Post-ID when row-level actions are output for the row.
|
|
*
|
|
* @since 0.1
|
|
*
|
|
* @var int
|
|
*/
|
|
protected $rollover_id = 0;
|
|
|
|
/**
|
|
* Currently hidden columns
|
|
*
|
|
* Records hidden columns so row-level actions are not assigned to them.
|
|
*
|
|
* @since 0.1
|
|
*
|
|
* @var array
|
|
*/
|
|
protected $currently_hidden = array();
|
|
|
|
/**
|
|
* The WPML_List_table support object, if required
|
|
*
|
|
* @since 2.11
|
|
*
|
|
* @var object
|
|
*/
|
|
protected $mla_wpml_table = NULL;
|
|
|
|
/*
|
|
* The $default_columns, $default_hidden_columns, and $default_sortable_columns
|
|
* arrays define the "Media/Assistant" table columns. The copies here are Compatibility
|
|
* shims for the real variables in MLAQuery.
|
|
*/
|
|
|
|
/**
|
|
* Table column definitions
|
|
*
|
|
* @since 0.1
|
|
*
|
|
* @var array
|
|
*/
|
|
protected static $default_columns = array();
|
|
|
|
/**
|
|
* Default values for hidden columns
|
|
*
|
|
* @since 0.1
|
|
*
|
|
* @var array
|
|
*/
|
|
protected static $default_hidden_columns = array();
|
|
|
|
/**
|
|
* Sortable column definitions
|
|
*
|
|
* @since 0.1
|
|
*
|
|
* @var array
|
|
*/
|
|
protected static $default_sortable_columns = array();
|
|
|
|
/**
|
|
* Get MIME types with one or more attachments for view preparation
|
|
*
|
|
* Modeled after get_available_post_mime_types in wp-admin/includes/post.php,
|
|
* but uses the output of wp_count_attachments() as input.
|
|
*
|
|
* @since 0.1
|
|
*
|
|
* @param array Number of posts for each MIME type
|
|
*
|
|
* @return array Mime type names
|
|
*/
|
|
protected static function _avail_mime_types( $num_posts ) {
|
|
$available = array();
|
|
|
|
foreach ( $num_posts as $mime_type => $number ) {
|
|
if ( ( $number > 0 ) && ( $mime_type <> 'trash' ) ) {
|
|
$available[] = $mime_type;
|
|
}
|
|
}
|
|
|
|
return $available;
|
|
}
|
|
|
|
/**
|
|
* Get dropdown box of custom field values to filter by, if available
|
|
*
|
|
* @since 2.32
|
|
*
|
|
* @param string currently selected value || '' (default)
|
|
* @param array additional wp_dropdown_categories options; default empty
|
|
*
|
|
* @return string HTML markup for dropdown box
|
|
*/
|
|
public static function mla_get_custom_field_filter_dropdown( $selected = MLACoreOptions::ALL_MLA_FILTER_METAKEY, $dropdown_options = array() ) {
|
|
global $wpdb;
|
|
|
|
$dropdown = '';
|
|
$tax_metakey = MLACore::mla_taxonomy_support('', 'metakey');
|
|
if ( empty( $tax_metakey ) ) {
|
|
return $dropdown;
|
|
}
|
|
|
|
$tax_metakey_sort = MLACore::mla_taxonomy_support('', 'metakey_sort');
|
|
$values = $wpdb->get_col( $wpdb->prepare( "
|
|
SELECT DISTINCT meta_value
|
|
FROM $wpdb->postmeta
|
|
WHERE meta_key = %s
|
|
ORDER BY meta_value
|
|
", $tax_metakey ) . $tax_metakey_sort );
|
|
|
|
if ( empty( $values ) ) {
|
|
return $dropdown;
|
|
}
|
|
|
|
$dropdown = '<select name="mla_filter_term" class="postform" id="name">' . "\n";
|
|
$selected_attribute = ( $selected == MLACoreOptions::ALL_MLA_FILTER_METAKEY ) ? ' selected="selected"' : '';
|
|
$value = __( 'All', 'media-library-assistant' ) . ' ' . $tax_metakey;
|
|
$dropdown .= "\t" . sprintf( '<option value="%1$s"%2$s>%3$s</option>', esc_attr( MLACoreOptions::ALL_MLA_FILTER_METAKEY ), $selected_attribute, _wp_specialchars( $value ) ) . "\n";
|
|
foreach ( $values as $value ) {
|
|
$selected_attribute = ( $selected == $value ) ? ' selected="selected"' : '';
|
|
$dropdown .= "\t" . sprintf( '<option value="%1$s"%2$s>%3$s</option>', esc_attr( $value ), $selected_attribute, _wp_specialchars( $value ) ) . "\n";
|
|
}
|
|
$dropdown .= '</select>';
|
|
|
|
return $dropdown;
|
|
}
|
|
|
|
/**
|
|
* Get dropdown box of terms to filter by, if available
|
|
*
|
|
* @since 1.20
|
|
*
|
|
* @param integer currently selected term_id || zero (default)
|
|
* @param array additional wp_dropdown_categories options; default empty
|
|
*
|
|
* @return string HTML markup for dropdown box
|
|
*/
|
|
public static function mla_get_taxonomy_filter_dropdown( $selected = 0, $dropdown_options = array() ) {
|
|
$dropdown = '';
|
|
$tax_filter = MLACore::mla_taxonomy_support('', 'filter');
|
|
|
|
if ( MLACoreOptions::MLA_FILTER_METAKEY == $tax_filter ) {
|
|
if ( 0 == intval( $selected ) ) {
|
|
$selected = MLACoreOptions::ALL_MLA_FILTER_METAKEY;
|
|
}
|
|
|
|
return self::mla_get_custom_field_filter_dropdown( $selected, $dropdown_options );
|
|
}
|
|
|
|
if ( ( '' != $tax_filter ) && ( is_object_in_taxonomy( 'attachment', $tax_filter ) ) ) {
|
|
$tax_object = get_taxonomy( $tax_filter );
|
|
$dropdown_options = array_merge( array(
|
|
'show_option_all' => __( 'All', 'media-library-assistant' ) . ' ' . $tax_object->labels->name,
|
|
'show_option_none' => _x( 'No', 'show_option_none', 'media-library-assistant' ) . ' ' . $tax_object->labels->name,
|
|
'orderby' => 'name',
|
|
'order' => 'ASC',
|
|
'show_count' => false,
|
|
'hide_empty' => false,
|
|
'child_of' => 0,
|
|
'exclude' => '',
|
|
// 'exclude_tree => '',
|
|
'echo' => true,
|
|
'depth' => MLACore::mla_get_option( MLACoreOptions::MLA_TAXONOMY_FILTER_DEPTH ),
|
|
'tab_index' => 0,
|
|
'name' => 'mla_filter_term',
|
|
'id' => 'name',
|
|
'class' => 'postform',
|
|
'selected' => $selected,
|
|
'hierarchical' => true,
|
|
'pad_counts' => false,
|
|
'taxonomy' => $tax_filter,
|
|
'hide_if_empty' => false
|
|
), $dropdown_options );
|
|
|
|
ob_start();
|
|
wp_dropdown_categories( $dropdown_options );
|
|
$dropdown = ob_get_contents();
|
|
ob_end_clean();
|
|
}
|
|
|
|
return $dropdown;
|
|
}
|
|
|
|
/**
|
|
* Process $_REQUEST, building $submenu_arguments
|
|
*
|
|
* @since 1.42
|
|
*
|
|
* @param boolean Optional: Include the "click filter" values in the results
|
|
*
|
|
* @return array non-empty view, search, filter and sort arguments
|
|
*/
|
|
public static function mla_submenu_arguments( $include_filters = true ) {
|
|
static $submenu_arguments = NULL, $has_filters = NULL;
|
|
|
|
if ( is_array( $submenu_arguments ) && ( $has_filters == $include_filters ) ) {
|
|
return $submenu_arguments;
|
|
}
|
|
|
|
$submenu_arguments = array();
|
|
$has_filters = $include_filters;
|
|
|
|
// View arguments
|
|
if ( isset( $_REQUEST['post_mime_type'] ) ) {
|
|
$submenu_arguments['post_mime_type'] = urlencode( $_REQUEST['post_mime_type'] );
|
|
}
|
|
|
|
if ( isset( $_REQUEST['detached'] ) ) {
|
|
if ( ( '0' === $_REQUEST['detached'] ) || ( '1' === $_REQUEST['detached'] ) ) {
|
|
$submenu_arguments['detached'] = $_REQUEST['detached'];
|
|
}
|
|
}
|
|
|
|
if ( isset( $_REQUEST['status'] ) ) {
|
|
if ( 'trash' === $_REQUEST['status'] ) {
|
|
$submenu_arguments['status'] = $_REQUEST['status'];
|
|
}
|
|
}
|
|
|
|
if ( isset( $_REQUEST['meta_query'] ) ) {
|
|
$submenu_arguments['meta_query'] = urlencode( stripslashes( $_REQUEST['meta_query'] ) );
|
|
}
|
|
|
|
// Search box arguments
|
|
if ( !empty( $_REQUEST['s'] ) ) {
|
|
$submenu_arguments['s'] = urlencode( stripslashes( $_REQUEST['s'] ) );
|
|
|
|
if ( isset( $_REQUEST['mla_search_connector'] ) ) {
|
|
$submenu_arguments['mla_search_connector'] = ( 'OR' === strtoupper( $_REQUEST['mla_search_connector'] ) ) ? 'OR' : 'AND';
|
|
}
|
|
|
|
if ( isset( $_REQUEST['mla_search_fields'] ) ) {
|
|
$submenu_arguments['mla_search_fields'] = array();
|
|
foreach ( $_REQUEST['mla_search_fields'] as $key => $value ) {
|
|
$submenu_arguments['mla_search_fields'][ $key ] = urlencode( stripslashes( $value ) );
|
|
}
|
|
}
|
|
}
|
|
|
|
// Filter arguments (from table header)
|
|
if ( isset( $_REQUEST['m'] ) && ( '0' != $_REQUEST['m'] ) ) {
|
|
// Format yyyymm
|
|
$submenu_arguments['m'] = absint( $_REQUEST['m'] );
|
|
}
|
|
|
|
if ( isset( $_REQUEST['mla_filter_term'] ) && ( '0' != $_REQUEST['mla_filter_term'] ) ) {
|
|
// Format numeric, can be negative
|
|
$submenu_arguments['mla_filter_term'] = intval( $_REQUEST['mla_filter_term'] );
|
|
}
|
|
|
|
// Sort arguments (from column header)
|
|
if ( isset( $_REQUEST['order'] ) ) {
|
|
$submenu_arguments['order'] = ( 'desc' === strtolower( $_REQUEST['order'] ) ) ? 'desc' : 'asc';
|
|
}
|
|
|
|
if ( isset( $_REQUEST['orderby'] ) ) {
|
|
foreach ( MLAQuery::$default_sortable_columns as $sortable_column ) {
|
|
if ( $sortable_column[0] == $_REQUEST['orderby'] ) {
|
|
$submenu_arguments['orderby'] = urlencode( $_REQUEST['orderby'] );
|
|
}
|
|
}
|
|
}
|
|
|
|
// Filter arguments (from interior table cells)
|
|
if ( $include_filters ) {
|
|
if ( isset( $_REQUEST['heading_suffix'] ) ) {
|
|
$submenu_arguments['heading_suffix'] = urlencode( stripslashes( $_REQUEST['heading_suffix'] ) );
|
|
}
|
|
|
|
if ( isset( $_REQUEST['parent'] ) ) {
|
|
$submenu_arguments['parent'] = absint( $_REQUEST['parent'] );
|
|
}
|
|
|
|
if ( isset( $_REQUEST['author'] ) ) {
|
|
$submenu_arguments['author'] = absint( $_REQUEST['author'] );
|
|
}
|
|
|
|
if ( isset( $_REQUEST['mla-tax'] ) ) {
|
|
$submenu_arguments['mla-tax'] = urlencode( $_REQUEST['mla-tax'] );
|
|
}
|
|
|
|
if ( isset( $_REQUEST['mla-term'] ) ) {
|
|
$submenu_arguments['mla-term'] = urlencode( $_REQUEST['mla-term'] );
|
|
}
|
|
|
|
if ( isset( $_REQUEST['mla-metakey'] ) ) {
|
|
$submenu_arguments['mla-metakey'] = urlencode( $_REQUEST['mla-metakey'] );
|
|
}
|
|
|
|
if ( isset( $_REQUEST['mla-metavalue'] ) ) {
|
|
$submenu_arguments['mla-metavalue'] = urlencode( $_REQUEST['mla-metavalue'] );
|
|
}
|
|
}
|
|
|
|
return $submenu_arguments = apply_filters( 'mla_list_table_submenu_arguments', $submenu_arguments, $include_filters );
|
|
}
|
|
|
|
/**
|
|
* Handler for filter 'get_user_option_managemedia_page_mla-menucolumnshidden'
|
|
*
|
|
* Required because the screen.php get_hidden_columns function only uses
|
|
* the get_user_option result. Set when the file is loaded because the object
|
|
* is not created in time for the call from screen.php.
|
|
*
|
|
* @since 0.1
|
|
*
|
|
* @param mixed false if option not present or array of current hidden columns, if any
|
|
* @param string 'managemedia_page_mla-menucolumnshidden'
|
|
* @param object WP_User object, if logged in
|
|
*
|
|
* @return array updated list of hidden columns
|
|
*/
|
|
public static function mla_manage_hidden_columns_filter( $result, $option, $user_data ) {
|
|
if ( false !== $result ) {
|
|
return $result;
|
|
}
|
|
|
|
return self::$default_hidden_columns;
|
|
}
|
|
|
|
/**
|
|
* Handler for filter 'manage_media_page_mla-menu_columns'
|
|
*
|
|
* This required filter dictates the table's columns and titles. Set when the
|
|
* file is loaded because the list_table object isn't created in time
|
|
* to affect the "screen options" setup.
|
|
*
|
|
* @since 0.1
|
|
*
|
|
* @return array list of table columns
|
|
*/
|
|
public static function mla_manage_columns_filter( ) {
|
|
return apply_filters( 'mla_list_table_get_columns', self::$default_columns );
|
|
}
|
|
|
|
/**
|
|
* Adds support for taxonomy and custom field columns
|
|
*
|
|
* Called in the admin_init action because the list_table object isn't
|
|
* created in time to affect the "screen options" setup.
|
|
*
|
|
* @since 0.30
|
|
*/
|
|
public static function mla_admin_init_action( ) {
|
|
self::$default_columns =& MLAQuery::$default_columns;
|
|
self::$default_hidden_columns =& MLAQuery::$default_hidden_columns;
|
|
self::$default_sortable_columns =& MLAQuery::$default_sortable_columns;
|
|
}
|
|
|
|
/**
|
|
* Initializes some properties from $_REQUEST variables, then
|
|
* calls the parent constructor to set some default configs.
|
|
*
|
|
* @since 0.1
|
|
*/
|
|
public function __construct() {
|
|
global $wp_list_table;
|
|
|
|
// For Admin Columns Pro 4.2.3+ export compatibility, because views can alter the query
|
|
$wp_list_table = $this;
|
|
|
|
$this->detached = isset( $_REQUEST['detached'] ) && ( '1' == $_REQUEST['detached'] );
|
|
$this->attached = isset( $_REQUEST['detached'] ) && ( '0' == $_REQUEST['detached'] );
|
|
$this->is_trash = isset( $_REQUEST['status'] ) && $_REQUEST['status'] == 'trash';
|
|
|
|
// MLA does not use this
|
|
$this->modes = array(
|
|
'list' => __( 'List View' ),
|
|
);
|
|
|
|
//Set parent defaults
|
|
parent::__construct( array(
|
|
'singular' => 'attachment', //singular name of the listed records
|
|
'plural' => 'attachments', //plural name of the listed records
|
|
'ajax' => true, //does this table support ajax?
|
|
'screen' => 'media_page_' . MLACore::ADMIN_PAGE_SLUG
|
|
), self::$default_columns );
|
|
|
|
$this->currently_hidden = self::get_hidden_columns();
|
|
|
|
/*
|
|
* NOTE: There is one add_action call at the end of this source file.
|
|
* NOTE: There are two add_filter calls at the end of this source file.
|
|
*
|
|
* They are added when the source file is loaded because the MLA_List_Table
|
|
* object is created too late to be useful.
|
|
*/
|
|
}
|
|
|
|
/**
|
|
* Checks the current user's permissions
|
|
*
|
|
* @since 2.13
|
|
*
|
|
* @return bool
|
|
*/
|
|
public function ajax_user_can() {
|
|
return current_user_can('upload_files');
|
|
}
|
|
|
|
/**
|
|
* Supply a column value if no column-specific function has been defined
|
|
*
|
|
* Called when the parent class can't find a method specifically built for a given column.
|
|
* The taxonomy and custom field columns are handled here. All other columns should have
|
|
* a specific method, so this function returns a troubleshooting message.
|
|
*
|
|
* @since 0.1
|
|
*
|
|
* @param array A singular item (one full row's worth of data)
|
|
* @param array The name/slug of the column to be processed
|
|
* @return string Text or HTML to be placed inside the column
|
|
*/
|
|
function column_default( $item, $column_name ) {
|
|
static $custom_columns = NULL;
|
|
|
|
if ( 't_' == substr( $column_name, 0, 2 ) ) {
|
|
$taxonomy = substr( $column_name, 2 );
|
|
$tax_object = get_taxonomy( $taxonomy );
|
|
$terms = get_object_term_cache( $item->ID, $taxonomy );
|
|
|
|
if ( false === $terms ) {
|
|
$terms = wp_get_object_terms( $item->ID, $taxonomy );
|
|
wp_cache_add( $item->ID, $terms, $taxonomy . '_relationships' );
|
|
}
|
|
|
|
if ( !is_wp_error( $terms ) ) {
|
|
if ( empty( $terms ) ) {
|
|
return __( 'None', 'media-library-assistant' );
|
|
}
|
|
|
|
$list = array();
|
|
foreach ( $terms as $term ) {
|
|
$term_name = esc_html( sanitize_term_field( 'name', $term->name, $term->term_id, $taxonomy, 'display' ) );
|
|
$list[] = sprintf( '<a href="%1$s" title="' . __( 'Filter by', 'media-library-assistant' ) . ' “%2$s”">%3$s</a>', esc_url( add_query_arg( array_merge( array(
|
|
'page' => MLACore::ADMIN_PAGE_SLUG,
|
|
'mla-tax' => $taxonomy,
|
|
'mla-term' => $term->slug,
|
|
'heading_suffix' => urlencode( $tax_object->label . ': ' . $term->name )
|
|
), self::mla_submenu_arguments( false ) ), 'upload.php' ) ), $term_name, $term_name );
|
|
} // foreach $term
|
|
|
|
return join( ', ', $list );
|
|
} else { // if !is_wp_error
|
|
return __( 'Not Supported', 'media-library-assistant' );
|
|
}
|
|
} // 't_'
|
|
elseif ( 'c_' == substr( $column_name, 0, 2 ) ) {
|
|
if ( NULL === $custom_columns ) {
|
|
$custom_columns = MLACore::mla_custom_field_support( 'custom_columns' );
|
|
}
|
|
|
|
if ( 'meta:' == substr( $custom_columns[ $column_name ], 0, 5 ) ) {
|
|
$is_meta = true;
|
|
$meta_key = substr( $custom_columns[ $column_name ], 5 );
|
|
|
|
if ( !empty( $item->mla_wp_attachment_metadata ) ) {
|
|
$values = MLAData::mla_find_array_element( $meta_key, $item->mla_wp_attachment_metadata, 'array' );
|
|
|
|
if ( is_scalar( $values ) ) {
|
|
$values = array( $values );
|
|
}
|
|
} else {
|
|
$values = NULL;
|
|
}
|
|
} else {
|
|
$is_meta = false;
|
|
$values = get_post_meta( $item->ID, $custom_columns[ $column_name ], false );
|
|
}
|
|
|
|
if ( empty( $values ) ) {
|
|
return '';
|
|
}
|
|
|
|
$list = array();
|
|
foreach ( $values as $index => $value ) {
|
|
/*
|
|
* For display purposes, convert array values.
|
|
* They are not links because no search will match them.
|
|
* Use "@" because embedded arrays throw PHP Warnings from implode.
|
|
*/
|
|
if ( is_array( $value ) ) {
|
|
$list[] = 'array( ' . @implode( ', ', $value ) . ' )'; // TODO PHP 7 error handling
|
|
} elseif ( $is_meta ) {
|
|
$list[] = $value;
|
|
} else {
|
|
$list[] = sprintf( '<a href="%1$s" title="' . __( 'Filter by', 'media-library-assistant' ) . ' “%2$s”">%3$s</a>', esc_url( add_query_arg( array_merge( array(
|
|
'page' => MLACore::ADMIN_PAGE_SLUG,
|
|
'mla-metakey' => urlencode( self::$default_columns[ $column_name ] ),
|
|
'mla-metavalue' => urlencode( $value ),
|
|
'heading_suffix' => urlencode( self::$default_columns[ $column_name ] . ': ' . $value )
|
|
), self::mla_submenu_arguments( false ) ), 'upload.php' ) ), esc_html( substr( $value, 0, 64 ) ), esc_html( $value ) );
|
|
}
|
|
}
|
|
|
|
if ( count( $list ) > 1 ) {
|
|
return '[' . join( '], [', $list ) . ']';
|
|
} else {
|
|
return $list[0];
|
|
}
|
|
} else { // 'c_'
|
|
|
|
$content = apply_filters( 'mla_list_table_column_default', NULL, $item, $column_name );
|
|
if ( is_null( $content ) ) {
|
|
//Show the whole array for troubleshooting purposes
|
|
/* translators: 1: column_name 2: column_values */
|
|
return sprintf( __( 'column_default: %1$s, %2$s', 'media-library-assistant' ), $column_name, print_r( $item, true ) );
|
|
} else {
|
|
return $content;
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Displays checkboxes for using bulk actions. The 'cb' column
|
|
* is given special treatment when columns are processed.
|
|
*
|
|
* @since 0.1
|
|
*
|
|
* @param array A singular attachment (post) object
|
|
* @return string HTML markup to be placed inside the column
|
|
*/
|
|
function column_cb( $item ) {
|
|
return sprintf( '<input type="checkbox" id="cb-select-%2$s" name="cb_%1$s[]" value="%2$s" />',
|
|
/*%1$s*/ $this->_args['singular'], //Let's simply repurpose the table's singular label ("attachment")
|
|
/*%2$s*/ $item->ID //The value of the checkbox should be the object's id
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Supply the content for a custom column
|
|
*
|
|
* @since 0.1
|
|
*
|
|
* @param array A singular attachment (post) object
|
|
* @return string HTML markup to be placed inside the column
|
|
*/
|
|
function column_icon( $item ) {
|
|
$thumb = self::_build_item_thumbnail( $item );
|
|
|
|
if ( $this->is_trash || ! current_user_can( 'edit_post', $item->ID ) ) {
|
|
return $thumb;
|
|
}
|
|
|
|
/*
|
|
* Use the WordPress Edit Media screen
|
|
*/
|
|
$view_args = self::mla_submenu_arguments();
|
|
if ( isset( $view_args['lang'] ) ) {
|
|
$edit_url = 'post.php?post=' . $item->ID . '&action=edit&mla_source=edit&lang=' . $view_args['lang'];
|
|
} else {
|
|
$edit_url = 'post.php?post=' . $item->ID . '&action=edit&mla_source=edit';
|
|
}
|
|
|
|
return sprintf( '<a href="%1$s" title="' . __( 'Edit', 'media-library-assistant' ) . ' “%2$s”">%3$s</a>', admin_url( $edit_url ), _draft_or_post_title( $item ), $thumb );
|
|
}
|
|
|
|
/**
|
|
* Translate post_status 'future', 'pending', 'draft' and 'trash' to label
|
|
*
|
|
* @since 2.01
|
|
*
|
|
* @param string post_status
|
|
*
|
|
* @return string Status label or empty string
|
|
*/
|
|
protected function _format_post_status( $post_status ) {
|
|
$flag = ',<br>';
|
|
switch ( $post_status ) {
|
|
case 'draft' :
|
|
$flag .= __('Draft');
|
|
break;
|
|
case 'future' :
|
|
$flag .= __('Scheduled');
|
|
break;
|
|
case 'pending' :
|
|
$flag .= _x('Pending', 'post state');
|
|
break;
|
|
case 'trash' :
|
|
$flag .= __('Trash');
|
|
break;
|
|
default:
|
|
$flag = '';
|
|
}
|
|
|
|
return $flag;
|
|
}
|
|
|
|
/**
|
|
* Get the name of the default primary column.
|
|
*
|
|
* @since 2.13
|
|
* @access protected
|
|
*
|
|
* @return string Name of the default primary column
|
|
*/
|
|
protected function get_default_primary_column_name() {
|
|
$hidden_columns = $this->get_hidden_columns();
|
|
|
|
$primary_column = '';
|
|
foreach ( array( 'ID_parent', 'title_name', 'post_title', 'post_name' ) as $column_name ) {
|
|
if ( ! in_array( $column_name, $hidden_columns ) ) {
|
|
$primary_column = $column_name;
|
|
break;
|
|
}
|
|
}
|
|
|
|
// Fallback to the first visible column
|
|
if ( empty( $primary_column ) ) {
|
|
foreach ( $this->get_columns() as $column_name => $column_title ) {
|
|
if ( ( 'cb' !== $column_name ) && ! in_array( $column_name, $hidden_columns ) ) {
|
|
$primary_column = $column_name;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
return $primary_column;
|
|
}
|
|
|
|
/**
|
|
* Generate and display row actions links.
|
|
*
|
|
* @since 2.13
|
|
* @access protected
|
|
*
|
|
* @param object $item Attachment being acted upon.
|
|
* @param string $column_name Current column name.
|
|
* @param string $primary Primary column name.
|
|
* @return string Row actions output for media attachments.
|
|
*/
|
|
protected function handle_row_actions( $item, $column_name, $primary ) {
|
|
if ( $primary === $column_name ) {
|
|
$actions = $this->row_actions( $this->_build_rollover_actions( $item, $column_name ) );
|
|
$actions .= $this->_build_inline_data( $item );
|
|
return $actions;
|
|
}
|
|
|
|
return '';
|
|
}
|
|
|
|
/**
|
|
* Add rollover actions to the current primary column, one of:
|
|
* 'ID_parent', 'title_name', 'post_title', 'post_name'
|
|
*
|
|
* @since 0.1
|
|
*
|
|
* @param object A singular attachment (post) object
|
|
* @param string Current column name
|
|
*
|
|
* @return array Names and URLs of row-level actions
|
|
*/
|
|
protected function _build_rollover_actions( $item, $column ) {
|
|
$actions = array();
|
|
$att_title = _draft_or_post_title( $item );
|
|
|
|
if ( ( $this->rollover_id != $item->ID ) && !in_array( $column, $this->currently_hidden ) ) {
|
|
/*
|
|
* Build rollover actions
|
|
*/
|
|
$view_args = array_merge( array( 'page' => MLACore::ADMIN_PAGE_SLUG, 'mla_item_ID' => $item->ID ),
|
|
self::mla_submenu_arguments() );
|
|
|
|
if ( isset( $_REQUEST['paged'] ) ) {
|
|
$view_args['paged'] = $_REQUEST['paged'];
|
|
}
|
|
|
|
if ( $this->is_trash ) {
|
|
if ( current_user_can( 'delete_post', $item->ID ) ) {
|
|
$actions['restore'] = '<a class="submitdelete" href="' . add_query_arg( $view_args, MLACore::mla_nonce_url( '?mla_admin_action=' . MLACore::MLA_ADMIN_SINGLE_RESTORE, MLACore::MLA_ADMIN_NONCE_ACTION, MLACore::MLA_ADMIN_NONCE_NAME ) ) . '" title="' . __( 'Restore this item from the Trash', 'media-library-assistant' ) . '">' . __( 'Restore', 'media-library-assistant' ) . '</a>';
|
|
}
|
|
} else {
|
|
if ( current_user_can( 'edit_post', $item->ID ) ) {
|
|
/*
|
|
* Use the WordPress Edit Media screen
|
|
*/
|
|
if ( isset( $view_args['lang'] ) ) {
|
|
$edit_url = 'post.php?post=' . $item->ID . '&action=edit&mla_source=edit&lang=' . $view_args['lang'];
|
|
} else {
|
|
$edit_url = 'post.php?post=' . $item->ID . '&action=edit&mla_source=edit';
|
|
}
|
|
|
|
$actions['edit'] = '<a href="' . admin_url( $edit_url ) . '" title="' . __( 'Edit this item', 'media-library-assistant' ) . '">' . __( 'Edit', 'media-library-assistant' ) . '</a>';
|
|
$actions['inline hide-if-no-js'] = '<a class="editinline" href="#" title="' . __( 'Edit this item inline', 'media-library-assistant' ) . '">' . __( 'Quick Edit', 'media-library-assistant' ) . '</a>';
|
|
} // edit_post
|
|
}
|
|
|
|
if ( current_user_can( 'delete_post', $item->ID ) ) {
|
|
if ( !$this->is_trash && EMPTY_TRASH_DAYS && MEDIA_TRASH ) {
|
|
$actions['trash'] = '<a class="submitdelete" href="' . add_query_arg( $view_args, MLACore::mla_nonce_url( '?mla_admin_action=' . MLACore::MLA_ADMIN_SINGLE_TRASH, MLACore::MLA_ADMIN_NONCE_ACTION, MLACore::MLA_ADMIN_NONCE_NAME ) ) . '" title="' . __( 'Move this item to the Trash', 'media-library-assistant' ) . '">' . __( 'Move to Trash', 'media-library-assistant' ) . '</a>';
|
|
} else {
|
|
// If using trash for posts and pages but not for attachments, warn before permanently deleting
|
|
$delete_ays = EMPTY_TRASH_DAYS && !MEDIA_TRASH ? ' onclick="return showNotice.warn();"' : '';
|
|
|
|
$actions['delete'] = '<a class="submitdelete"' . $delete_ays . ' href="' . add_query_arg( $view_args, MLACore::mla_nonce_url( '?mla_admin_action=' . MLACore::MLA_ADMIN_SINGLE_DELETE, MLACore::MLA_ADMIN_NONCE_ACTION, MLACore::MLA_ADMIN_NONCE_NAME ) ) . '" title="' . __( 'Delete this item Permanently', 'media-library-assistant' ) . '">' . __( 'Delete Permanently', 'media-library-assistant' ) . '</a>';
|
|
}
|
|
} // delete_post
|
|
|
|
if ( ! $this->is_trash ) {
|
|
$file = get_attached_file( $item->ID );
|
|
$download_args = array( 'page' => MLACore::ADMIN_PAGE_SLUG, 'mla_download_file' => urlencode( $file ), 'mla_download_type' => $item->post_mime_type );
|
|
|
|
$actions['download'] = '<a href="' . add_query_arg( $download_args, MLACore::mla_nonce_url( 'upload.php', MLACore::MLA_ADMIN_NONCE_ACTION, MLACore::MLA_ADMIN_NONCE_NAME ) ) . '" title="' . __( 'Download', 'media-library-assistant' ) . ' “' . $att_title . '”">' . __( 'Download', 'media-library-assistant' ) . '</a>';
|
|
|
|
$actions['view'] = '<a href="' . site_url( ) . '?attachment_id=' . $item->ID . '" rel="permalink" title="' . __( 'View', 'media-library-assistant' ) . ' “' . $att_title . '”">' . __( 'View', 'media-library-assistant' ) . '</a>';
|
|
}
|
|
|
|
$actions = apply_filters( 'mla_list_table_build_rollover_actions', $actions, $item, $column );
|
|
|
|
$this->rollover_id = $item->ID;
|
|
} // $this->rollover_id != $item->ID
|
|
|
|
return $actions;
|
|
}
|
|
|
|
/**
|
|
* Generate item thumbnail image tag
|
|
*
|
|
* @since 2.15
|
|
*
|
|
* @param object A singular attachment (post) object
|
|
*
|
|
* @return string HTML <img> for thumbnail
|
|
*/
|
|
protected function _build_item_thumbnail( $item ) {
|
|
static $thumb = NULL, $item_id = 0;
|
|
|
|
if ( $item->ID == $item_id ) {
|
|
return $thumb;
|
|
} else {
|
|
$item_id = $item->ID;
|
|
}
|
|
|
|
$icon_width = MLACore::mla_get_option( MLACoreOptions::MLA_TABLE_ICON_SIZE );
|
|
if ( 'checked' == MLACore::mla_get_option( MLACoreOptions::MLA_ENABLE_MLA_ICONS ) ) {
|
|
if ( empty( $icon_width ) ) {
|
|
$icon_width = $icon_height = 64;
|
|
} else {
|
|
$icon_width = $icon_height = absint( $icon_width );
|
|
}
|
|
} else {
|
|
if ( empty( $icon_width ) ) {
|
|
if ( MLATest::$wp_4dot3_plus ) {
|
|
$icon_width = 60;
|
|
} else {
|
|
$icon_width = 80;
|
|
}
|
|
} else {
|
|
$icon_width = absint( $icon_width );
|
|
}
|
|
|
|
if ( MLATest::$wp_4dot3_plus ) {
|
|
$icon_height = $icon_width;
|
|
} else {
|
|
$icon_height = absint( .75 * (float) $icon_width );
|
|
}
|
|
}
|
|
|
|
$dimensions = array( $icon_width, $icon_height );
|
|
$thumb = wp_get_attachment_image( $item->ID, $dimensions, true, array( 'class' => 'mla_media_thumbnail' ) );
|
|
|
|
if ( in_array( $item->post_mime_type, array( 'image/svg+xml' ) ) ) {
|
|
$thumb = preg_replace( '/width=\"[^\"]*\"/', sprintf( 'width="%1$d"', $dimensions[0] ), $thumb );
|
|
$thumb = preg_replace( '/height=\"[^\"]*\"/', sprintf( 'height="%1$d"', $dimensions[1] ), $thumb );
|
|
}
|
|
|
|
return $thumb;
|
|
}
|
|
|
|
/**
|
|
* Add hidden fields with the data for use in the inline editor
|
|
*
|
|
* @since 0.20
|
|
*
|
|
* @param object A singular attachment (post) object
|
|
*
|
|
* @return string HTML <div> with row data
|
|
*/
|
|
protected function _build_inline_data( $item ) {
|
|
$inline_data = "\r\n" . '<div class="hidden" id="inline_' . $item->ID . "\">\r\n";
|
|
$inline_data .= ' <div class="item_thumbnail">' . self::_build_item_thumbnail( $item ) . "</div>\r\n";
|
|
$inline_data .= ' <div class="post_title">' . esc_attr( $item->post_title ) . "</div>\r\n";
|
|
$inline_data .= ' <div class="post_name">' . esc_attr( $item->post_name ) . "</div>\r\n";
|
|
$inline_data .= ' <div class="post_excerpt">' . esc_attr( $item->post_excerpt ) . "</div>\r\n";
|
|
$inline_data .= ' <div class="post_content">' . esc_attr( $item->post_content ) . "</div>\r\n";
|
|
|
|
if ( !empty( $item->mla_wp_attachment_metadata ) ) {
|
|
$inline_data .= ' <div class="image_alt">';
|
|
|
|
if ( isset( $item->mla_wp_attachment_image_alt ) ) {
|
|
if ( is_array( $item->mla_wp_attachment_image_alt ) ) {
|
|
$inline_data .= esc_attr( $item->mla_wp_attachment_image_alt[0] );
|
|
} else {
|
|
$inline_data .= esc_attr( $item->mla_wp_attachment_image_alt );
|
|
}
|
|
}
|
|
|
|
$inline_data .= "</div>\r\n";
|
|
}
|
|
|
|
$date = $item->post_date;
|
|
$inline_data .= ' <div class="jj">' . esc_attr( mysql2date( 'd', $date, false ) ) . "</div>\r\n";
|
|
$inline_data .= ' <div class="mm">' . esc_attr( mysql2date( 'm', $date, false ) ) . "</div>\r\n";
|
|
$inline_data .= ' <div class="aa">' . esc_attr( mysql2date( 'Y', $date, false ) ) . "</div>\r\n";
|
|
$inline_data .= ' <div class="hh">' . esc_attr( mysql2date( 'H', $date, false ) ) . "</div>\r\n";
|
|
$inline_data .= ' <div class="mn">' . esc_attr( mysql2date( 'i', $date, false ) ) . "</div>\r\n";
|
|
$inline_data .= ' <div class="ss">' . esc_attr( mysql2date( 's', $date, false ) ) . "</div>\r\n";
|
|
|
|
$inline_data .= ' <div class="post_parent">' . $item->post_parent . "</div>\r\n";
|
|
|
|
if ( $item->post_parent ) {
|
|
if ( isset( $item->parent_title ) ) {
|
|
$parent_title = $item->parent_title;
|
|
} else {
|
|
$parent_title = __( '(no title)', 'media-library-assistant' );
|
|
}
|
|
} else {
|
|
$parent_title = '';
|
|
}
|
|
|
|
$inline_data .= ' <div class="post_parent_title">' . $parent_title . "</div>\r\n";
|
|
$inline_data .= ' <div class="menu_order">' . $item->menu_order . "</div>\r\n";
|
|
$inline_data .= ' <div class="post_author">' . $item->post_author . "</div>\r\n";
|
|
|
|
$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 ) {
|
|
if ( 'meta:' == substr( $details['name'], 0, 5 ) ) {
|
|
$meta_key = substr( $details['name'], 5 );
|
|
|
|
if ( !empty( $item->mla_wp_attachment_metadata ) ) {
|
|
$value = MLAData::mla_find_array_element( $meta_key, $item->mla_wp_attachment_metadata, 'array' );
|
|
} else {
|
|
$value = '';
|
|
}
|
|
} else {
|
|
$value = get_metadata( 'post', $item->ID, $details['name'], true );
|
|
}
|
|
|
|
if ( is_array( $value ) ) {
|
|
if ( 'array' == $details['option'] ) {
|
|
$value = implode( ',', $value );
|
|
} else {
|
|
// '(Array)' indicates an existing array value in the field, which we preserve
|
|
$value = '(Array)';
|
|
}
|
|
}
|
|
|
|
$inline_data .= ' <div class="' . $slug . '">' . esc_html( $value ) . "</div>\r\n";
|
|
}
|
|
|
|
$taxonomies = get_object_taxonomies( 'attachment', 'objects' );
|
|
|
|
foreach ( $taxonomies as $tax_name => $tax_object ) {
|
|
if ( $tax_object->show_ui && MLACore::mla_taxonomy_support( $tax_name, 'quick-edit' ) ) {
|
|
$terms = get_object_term_cache( $item->ID, $tax_name );
|
|
if ( false === $terms ) {
|
|
$terms = wp_get_object_terms( $item->ID, $tax_name );
|
|
wp_cache_add( $item->ID, $terms, $tax_name . '_relationships' );
|
|
}
|
|
|
|
if ( is_wp_error( $terms ) || empty( $terms ) ) {
|
|
$terms = array();
|
|
}
|
|
|
|
$ids = array();
|
|
if ( $tax_object->hierarchical || MLACore::mla_taxonomy_support( $tax_name, 'flat-checklist' ) ) {
|
|
foreach( $terms as $term ) {
|
|
$ids[] = $term->term_id;
|
|
}
|
|
|
|
$inline_class = MLACore::mla_taxonomy_support( $tax_name, 'checked-on-top' ) ? 'mla_category checked_on_top' : 'mla_category';
|
|
$inline_data .= ' <div class="' . $inline_class . '" id="' . $tax_name . '_' . $item->ID . '">'
|
|
. implode( ',', $ids ) . "</div>\r\n";
|
|
} else {
|
|
foreach( $terms as $term ) {
|
|
$ids[] = $term->name;
|
|
}
|
|
|
|
$inline_data .= ' <div class="mla_tags" id="'.$tax_name.'_'.$item->ID. '">'
|
|
. esc_attr( implode( ', ', $ids ) ) . "</div>\r\n";
|
|
}
|
|
}
|
|
}
|
|
|
|
$inline_data = apply_filters( 'mla_list_table_build_inline_data', $inline_data, $item );
|
|
|
|
$inline_data .= "</div>\r\n";
|
|
|
|
return $inline_data;
|
|
}
|
|
|
|
/**
|
|
* Format primary column before/after Wordpress v4.3
|
|
*
|
|
* For WordPress before 4.3, add rollover actions and inline_data to the
|
|
* first visible column. For 4.3 and later, merge the icon with the primary
|
|
* visible column and add div tags.
|
|
*
|
|
* @since 2.13
|
|
*
|
|
* @param object A singular attachment (post) object
|
|
* @param string Current column name
|
|
* @param string Current column contents
|
|
*
|
|
* @return string Complete column content
|
|
*/
|
|
protected function _handle_primary_column( $item, $column_name, $column_content ) {
|
|
if ( MLATest::$wp_4dot3_plus ) {
|
|
static $primary_column = NULL;
|
|
|
|
if ( NULL == $primary_column ) {
|
|
$primary_column = $this->get_default_primary_column_name();
|
|
}
|
|
|
|
if ( $primary_column != $column_name ) {
|
|
return $column_content;
|
|
}
|
|
|
|
$add_link = ( !$this->is_trash ) && current_user_can( 'edit_post', $item->ID );
|
|
list( $mime ) = explode( '/', $item->post_mime_type );
|
|
$thumb = self::_build_item_thumbnail( $item );
|
|
$title = _draft_or_post_title( $item );
|
|
|
|
$final_content = "<strong class=\"has-media-icon\">\n";
|
|
|
|
if ( $add_link ) {
|
|
// Use the WordPress Edit Media screen
|
|
$view_args = self::mla_submenu_arguments();
|
|
if ( isset( $view_args['lang'] ) ) {
|
|
$edit_url = 'post.php?post=' . $item->ID . '&action=edit&mla_source=edit&lang=' . $view_args['lang'];
|
|
} else {
|
|
$edit_url = 'post.php?post=' . $item->ID . '&action=edit&mla_source=edit';
|
|
}
|
|
|
|
//$final_content .= sprintf( '<a href="%1$s" title="%2$s “%3$s”" aria-label="“%3$s” (%2$s)">', admin_url( $edit_url ), __( 'Edit', 'media-library-assistant' ), $title ) . "\n";
|
|
|
|
$final_content .= sprintf( '<a href="%1$s" aria-label="“%3$s” (%2$s)">', admin_url( $edit_url ), __( 'Edit', 'media-library-assistant' ), $title ) . "\n";
|
|
}
|
|
|
|
$final_content .= "<span class=\"media-icon {$mime}-icon\">\n";
|
|
$final_content .= $thumb;
|
|
$final_content .= "</span>\n";
|
|
$final_content .= '<span aria-hidden="true">' . $column_content . "</span>\n";
|
|
//$final_content .= '<span class="screen-reader-text">' . __( 'Edit', 'media-library-assistant' ) . ' ' . $title . "</span>\n";
|
|
|
|
if ( $add_link ) {
|
|
$final_content .= "</a>\n";
|
|
}
|
|
|
|
$final_content .= "</strong>\n";
|
|
|
|
if ( 'checked' == MLACore::mla_get_option( MLACoreOptions::MLA_SHOW_FILE_NAME ) ) {
|
|
$final_content .= '<p style="clear: both" class="filename"> <span class="screen-reader-text">' . __( 'File name' ) . ': </span>' . $item->mla_wp_attached_filename . " </p>\n";
|
|
}
|
|
return $final_content;
|
|
}
|
|
|
|
$actions = $this->row_actions( $this->_build_rollover_actions( $item, $column_name ) );
|
|
if ( ! empty( $actions ) ) {
|
|
$column_content .= $actions . $this->_build_inline_data( $item );
|
|
}
|
|
|
|
return $column_content;
|
|
}
|
|
|
|
/**
|
|
* Supply the content for a custom column
|
|
*
|
|
* @since 0.1
|
|
*
|
|
* @param array A singular attachment (post) object
|
|
* @return string HTML markup to be placed inside the column
|
|
*/
|
|
function column_ID_parent( $item ) {
|
|
if ( $item->post_parent ) {
|
|
if ( isset( $item->parent_title ) ) {
|
|
$parent_title = $item->parent_title;
|
|
} else {
|
|
$parent_title = sprintf( '%1$d %2$s', $item->post_parent, __( '(no title)', 'media-library-assistant' ) );
|
|
}
|
|
|
|
$parent = sprintf( '<a href="%1$s" title="' . __( 'Filter by', 'media-library-assistant' ) . ' ' . __( 'Parent ID', 'media-library-assistant' ) . '">(' . __( 'Parent', 'media-library-assistant' ) . ':%2$s)</a>', esc_url( add_query_arg( array_merge( array(
|
|
'page' => MLACore::ADMIN_PAGE_SLUG,
|
|
'parent' => $item->post_parent,
|
|
'heading_suffix' => urlencode( __( 'Parent', 'media-library-assistant' ) . ': ' . $parent_title )
|
|
), self::mla_submenu_arguments( false ) ), 'upload.php' ) ), (string) $item->post_parent );
|
|
} else {// $item->post_parent
|
|
$parent = '<span style="color:silver">' . __( 'Parent', 'media-library-assistant' ) . ':0</span>';
|
|
}
|
|
|
|
$content = sprintf( '%1$s<br>%2$s', /*%1$s*/ $item->ID, /*%2$s*/ $parent );
|
|
return $this->_handle_primary_column( $item, 'ID_parent', $content );
|
|
}
|
|
|
|
/**
|
|
* Supply the content for a custom column
|
|
*
|
|
* @since 0.1
|
|
*
|
|
* @param array A singular attachment (post) object
|
|
* @return string HTML markup to be placed inside the column
|
|
*/
|
|
function column_title_name( $item ) {
|
|
$errors = $item->mla_references['parent_errors'];
|
|
if ( '(' . __( 'NO REFERENCE TESTS', 'media-library-assistant' ) . ')' == $errors ) {
|
|
$errors = '';
|
|
}
|
|
|
|
$content = sprintf( '%1$s<br>%2$s<br>%3$s', /*%1$s*/ _draft_or_post_title( $item ), /*%2$s*/ esc_attr( $item->post_name ), /*%3$s*/ $errors );
|
|
return $this->_handle_primary_column( $item, 'title_name', $content );
|
|
}
|
|
|
|
/**
|
|
* Supply the content for a custom column
|
|
*
|
|
* @since 0.1
|
|
*
|
|
* @param array A singular attachment (post) object
|
|
* @return string HTML markup to be placed inside the column
|
|
*/
|
|
function column_post_title( $item ) {
|
|
return $this->_handle_primary_column( $item, 'post_title', _draft_or_post_title( $item ) );
|
|
}
|
|
|
|
/**
|
|
* Supply the content for a custom column
|
|
*
|
|
* @since 0.1
|
|
*
|
|
* @param array A singular attachment (post) object
|
|
* @return string HTML markup to be placed inside the column
|
|
*/
|
|
function column_post_name( $item ) {
|
|
return $this->_handle_primary_column( $item, 'post_name', esc_attr( $item->post_name ) );
|
|
}
|
|
|
|
/**
|
|
* Supply the content for a custom column
|
|
*
|
|
* @since 0.1
|
|
*
|
|
* @param array A singular attachment (post) object
|
|
* @return string HTML markup to be placed inside the column
|
|
*/
|
|
function column_parent( $item ) {
|
|
if ( $item->post_parent ){
|
|
if ( isset( $item->parent_title ) ) {
|
|
$parent_title = $item->parent_title;
|
|
} else {
|
|
$parent_title = __( '(no title: bad ID)', 'media-library-assistant' );
|
|
}
|
|
|
|
return sprintf( '<a href="%1$s" title="' . __( 'Filter by', 'media-library-assistant' ) . ' ' . __( 'Parent ID', 'media-library-assistant' ) . '">%2$s</a>', esc_url( add_query_arg( array_merge( array(
|
|
'page' => MLACore::ADMIN_PAGE_SLUG,
|
|
'parent' => $item->post_parent,
|
|
'heading_suffix' => urlencode( __( 'Parent', 'media-library-assistant' ) . ': ' . $parent_title )
|
|
), self::mla_submenu_arguments( false ) ), 'upload.php' ) ), (string) $item->post_parent );
|
|
} else {
|
|
return (string) $item->post_parent;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Supply the content for a custom column
|
|
*
|
|
* @since 0.60
|
|
*
|
|
* @param array A singular attachment (post) object
|
|
* @return string HTML markup to be placed inside the column
|
|
*/
|
|
function column_menu_order( $item ) {
|
|
return (string) $item->menu_order;
|
|
}
|
|
|
|
/**
|
|
* Supply the content for a custom column
|
|
*
|
|
* @since 0.1
|
|
*
|
|
* @param array A singular attachment (post) object
|
|
* @return string HTML markup to be placed inside the column
|
|
*/
|
|
function column_featured( $item ) {
|
|
if ( !MLACore::$process_featured_in ) {
|
|
return __( 'Disabled', 'media-library-assistant' );
|
|
}
|
|
|
|
/*
|
|
* Move parent to the top of the list
|
|
*/
|
|
$features = $item->mla_references['features'];
|
|
if ( isset( $features[ $item->post_parent ] ) ) {
|
|
$parent = $features[ $item->post_parent ];
|
|
unset( $features[ $item->post_parent ] );
|
|
array_unshift( $features, $parent );
|
|
}
|
|
|
|
$value = '';
|
|
foreach ( $features as $feature ) {
|
|
$status = self::_format_post_status( $feature->post_status );
|
|
|
|
if ( $feature->ID == $item->post_parent ) {
|
|
$parent = ',<br>' . __( 'PARENT', 'media-library-assistant' );
|
|
} else {
|
|
$parent = '';
|
|
}
|
|
|
|
$value .= sprintf( '<a href="%1$s" title="' . __( 'Edit', 'media-library-assistant' ) . ' “%2$s”">%2$s</a> (%3$s %4$s%5$s%6$s), ',
|
|
/*%1$s*/ esc_url( add_query_arg( array('post' => $feature->ID, 'action' => 'edit'), 'post.php' ) ),
|
|
/*%2$s*/ esc_attr( $feature->post_title ),
|
|
/*%3$s*/ esc_attr( $feature->post_type ),
|
|
/*%4$s*/ $feature->ID,
|
|
/*%5$s*/ $status,
|
|
/*%6$s*/ $parent ) . "<br>\r\n";
|
|
} // foreach $feature
|
|
|
|
return $value;
|
|
}
|
|
|
|
/**
|
|
* Supply the content for a custom column
|
|
*
|
|
* @since 0.1
|
|
*
|
|
* @param array A singular attachment (post) object
|
|
* @return string HTML markup to be placed inside the column
|
|
*/
|
|
function column_inserted( $item ) {
|
|
if ( !MLACore::$process_inserted_in ) {
|
|
return __( 'Disabled', 'media-library-assistant' );
|
|
}
|
|
|
|
$value = '';
|
|
foreach ( $item->mla_references['inserts'] as $file => $inserts ) {
|
|
if ( 'base' != $item->mla_references['inserted_option'] ) {
|
|
$value .= sprintf( '<strong>%1$s</strong><br>', $file );
|
|
}
|
|
|
|
/*
|
|
* Move parent to the top of the list
|
|
*/
|
|
if ( isset( $inserts[ $item->post_parent ] ) ) {
|
|
$parent = $inserts[ $item->post_parent ];
|
|
unset( $inserts[ $item->post_parent ] );
|
|
array_unshift( $inserts, $parent );
|
|
}
|
|
|
|
foreach ( $inserts as $insert ) {
|
|
$status = self::_format_post_status( $insert->post_status );
|
|
|
|
if ( $insert->ID == $item->post_parent ) {
|
|
$parent = ',<br>' . __( 'PARENT', 'media-library-assistant' );
|
|
} else {
|
|
$parent = '';
|
|
}
|
|
|
|
$value .= sprintf( '<a href="%1$s" title="' . __( 'Edit', 'media-library-assistant' ) . ' “%2$s”">%2$s</a> (%3$s %4$s%5$s%6$s), ',
|
|
/*%1$s*/ esc_url( add_query_arg( array('post' => $insert->ID, 'action' => 'edit'), 'post.php' ) ),
|
|
/*%2$s*/ esc_attr( $insert->post_title ),
|
|
/*%3$s*/ esc_attr( $insert->post_type ),
|
|
/*%4$s*/ $insert->ID,
|
|
/*%3$s*/ $status,
|
|
/*%6$s*/ $parent ) . "<br>\r\n";
|
|
} // foreach $insert
|
|
} // foreach $file
|
|
|
|
return $value;
|
|
}
|
|
|
|
/**
|
|
* Supply the content for a custom column
|
|
*
|
|
* @since 0.70
|
|
*
|
|
* @param array A singular attachment (post) object
|
|
* @return string HTML markup to be placed inside the column
|
|
*/
|
|
function column_galleries( $item ) {
|
|
if ( !MLACore::$process_gallery_in ) {
|
|
return __( 'Disabled', 'media-library-assistant' );
|
|
}
|
|
|
|
/*
|
|
* Move parent to the top of the list
|
|
*/
|
|
$galleries = $item->mla_references['galleries'];
|
|
if ( isset( $galleries[ $item->post_parent ] ) ) {
|
|
$parent = $galleries[ $item->post_parent ];
|
|
unset( $galleries[ $item->post_parent ] );
|
|
array_unshift( $galleries, $parent );
|
|
}
|
|
|
|
$value = '';
|
|
foreach ( $galleries as $ID => $gallery ) {
|
|
$status = self::_format_post_status( $gallery['post_status'] );
|
|
|
|
if ( $gallery['ID'] == $item->post_parent ) {
|
|
$parent = ',<br>' . __( 'PARENT', 'media-library-assistant' );
|
|
} else {
|
|
$parent = '';
|
|
}
|
|
|
|
$value .= sprintf( '<a href="%1$s" title="' . __( 'Edit', 'media-library-assistant' ) . ' “%2$s”">%2$s</a> (%3$s %4$s%5$s%6$s),',
|
|
/*%1$s*/ esc_url( add_query_arg( array('post' => $gallery['ID'], 'action' => 'edit'), 'post.php' ) ),
|
|
/*%2$s*/ esc_attr( $gallery['post_title'] ),
|
|
/*%3$s*/ esc_attr( $gallery['post_type'] ),
|
|
/*%4$s*/ $gallery['ID'],
|
|
/*%5$s*/ $status,
|
|
/*%6$s*/ $parent ) . "<br>\r\n";
|
|
} // foreach $gallery
|
|
|
|
return $value;
|
|
}
|
|
|
|
/**
|
|
* Supply the content for a custom column
|
|
*
|
|
* @since 0.70
|
|
*
|
|
* @param array A singular attachment (post) object
|
|
* @return string HTML markup to be placed inside the column
|
|
*/
|
|
function column_mla_galleries( $item ) {
|
|
if ( !MLACore::$process_mla_gallery_in ) {
|
|
return __( 'Disabled', 'media-library-assistant' );
|
|
}
|
|
|
|
/*
|
|
* Move parent to the top of the list
|
|
*/
|
|
$mla_galleries = $item->mla_references['mla_galleries'];
|
|
if ( isset( $mla_galleries[ $item->post_parent ] ) ) {
|
|
$parent = $mla_galleries[ $item->post_parent ];
|
|
unset( $mla_galleries[ $item->post_parent ] );
|
|
array_unshift( $mla_galleries, $parent );
|
|
}
|
|
|
|
$value = '';
|
|
foreach ( $mla_galleries as $gallery ) {
|
|
$status = self::_format_post_status( $gallery['post_status'] );
|
|
|
|
if ( $gallery['ID'] == $item->post_parent ) {
|
|
$parent = ',<br>' . __( 'PARENT', 'media-library-assistant' );
|
|
} else {
|
|
$parent = '';
|
|
}
|
|
|
|
$value .= sprintf( '<a href="%1$s" title="' . __( 'Edit', 'media-library-assistant' ) . ' “%2$s”">%2$s</a> (%3$s %4$s%5$s%6$s),',
|
|
/*%1$s*/ esc_url( add_query_arg( array('post' => $gallery['ID'], 'action' => 'edit'), 'post.php' ) ),
|
|
/*%2$s*/ esc_attr( $gallery['post_title'] ),
|
|
/*%3$s*/ esc_attr( $gallery['post_type'] ),
|
|
/*%4$s*/ $gallery['ID'],
|
|
/*%5$s*/ $status,
|
|
/*%6$s*/ $parent ) . "<br>\r\n";
|
|
} // foreach $gallery
|
|
|
|
return $value;
|
|
}
|
|
|
|
/**
|
|
* Supply the content for a custom column
|
|
*
|
|
* @since 0.1
|
|
*
|
|
* @param array A singular attachment (post) object
|
|
* @return string HTML markup to be placed inside the column
|
|
*/
|
|
function column_alt_text( $item ) {
|
|
if ( isset( $item->mla_wp_attachment_image_alt ) ) {
|
|
if ( is_array( $item->mla_wp_attachment_image_alt ) ) {
|
|
$alt_text = $item->mla_wp_attachment_image_alt[0];
|
|
} else {
|
|
$alt_text = $item->mla_wp_attachment_image_alt;
|
|
}
|
|
|
|
return sprintf( '<a href="%1$s" title="' . __( 'Filter by', 'media-library-assistant' ) . ' “%2$s”">%3$s</a>', esc_url( add_query_arg( array_merge( array(
|
|
'page' => MLACore::ADMIN_PAGE_SLUG,
|
|
'mla-metakey' => '_wp_attachment_image_alt',
|
|
'mla-metavalue' => urlencode( $alt_text ),
|
|
'heading_suffix' => urlencode( __( 'ALT Text', 'media-library-assistant' ) . ': ' . $alt_text )
|
|
), self::mla_submenu_arguments( false ) ), 'upload.php' ) ), esc_html( $alt_text ), esc_html( $alt_text ) );
|
|
}
|
|
|
|
return '';
|
|
}
|
|
|
|
/**
|
|
* Supply the content for a custom column
|
|
*
|
|
* @since 0.1
|
|
*
|
|
* @param array A singular attachment (post) object
|
|
* @return string HTML markup to be placed inside the column
|
|
*/
|
|
function column_caption( $item ) {
|
|
return esc_attr( $item->post_excerpt );
|
|
}
|
|
|
|
/**
|
|
* Supply the content for a custom column
|
|
*
|
|
* @since 0.1
|
|
*
|
|
* @param array A singular attachment (post) object
|
|
* @return string HTML markup to be placed inside the column
|
|
*/
|
|
function column_description( $item ) {
|
|
return esc_textarea( $item->post_content );
|
|
}
|
|
|
|
/**
|
|
* Supply the content for a custom column
|
|
*
|
|
* @since 0.30
|
|
*
|
|
* @param array A singular attachment (post) object
|
|
* @return string HTML markup to be placed inside the column
|
|
*/
|
|
function column_post_mime_type( $item ) {
|
|
return sprintf( '<a href="%1$s" title="' . __( 'Filter by', 'media-library-assistant' ) . ' “%2$s”">%2$s</a>', esc_url( add_query_arg( array_merge( array(
|
|
'page' => MLACore::ADMIN_PAGE_SLUG,
|
|
'post_mime_type' => urlencode( $item->post_mime_type ),
|
|
'heading_suffix' => urlencode( __( 'MIME Type', 'media-library-assistant' ) . ': ' . $item->post_mime_type )
|
|
), self::mla_submenu_arguments( false ) ), 'upload.php' ) ), esc_html( $item->post_mime_type ), esc_html( $item->post_mime_type ) );
|
|
}
|
|
|
|
/**
|
|
* Supply the content for a custom column
|
|
*
|
|
* @since 0.1
|
|
*
|
|
* @param array A singular attachment (post) object
|
|
* @return string HTML markup to be placed inside the column
|
|
*/
|
|
function column_file_url( $item ) {
|
|
$attachment_url = wp_get_attachment_url( $item->ID );
|
|
|
|
return $attachment_url ? $attachment_url : __( 'None', 'media-library-assistant' );
|
|
}
|
|
|
|
/**
|
|
* Supply the content for a custom column
|
|
*
|
|
* @since 0.1
|
|
*
|
|
* @param array A singular attachment (post) object
|
|
* @return string HTML markup to be placed inside the column
|
|
*/
|
|
function column_base_file( $item ) {
|
|
$base_file = isset( $item->mla_wp_attached_file ) ? $item->mla_wp_attached_file : '';
|
|
|
|
return sprintf( '<a href="%1$s" title="' . __( 'Filter by', 'media-library-assistant' ) . ' “%2$s”">%2$s</a>', esc_url( add_query_arg( array_merge( array(
|
|
'page' => MLACore::ADMIN_PAGE_SLUG,
|
|
'mla-metakey' => urlencode( '_wp_attached_file' ),
|
|
'mla-metavalue' => urlencode( $base_file ),
|
|
'heading_suffix' => urlencode( __( 'Base File', 'media-library-assistant' ) . ': ' . $base_file )
|
|
), self::mla_submenu_arguments( false ) ), 'upload.php' ) ), esc_html( $base_file ) );
|
|
}
|
|
|
|
/**
|
|
* Supply the content for a custom column
|
|
*
|
|
* @since 0.1
|
|
*
|
|
* @param array A singular attachment (post) object
|
|
* @return string HTML markup to be placed inside the column
|
|
*/
|
|
function column_date( $item ) {
|
|
global $post;
|
|
|
|
if ( '0000-00-00 00:00:00' == $item->post_date ) {
|
|
$h_time = __( 'Unpublished', 'media-library-assistant' );
|
|
} else {
|
|
$post = $item; // Resolve issue with "The Events Calendar"
|
|
$m_time = $item->post_date;
|
|
$time = get_post_time( 'G', true, $item, false );
|
|
|
|
if ( ( abs( $t_diff = time() - $time ) ) < 86400 ) {
|
|
if ( $t_diff < 0 ) {
|
|
/* translators: 1: upload/last modified date and time */
|
|
$h_time = sprintf( __( '%1$s from now', 'media-library-assistant' ), human_time_diff( $time ) );
|
|
} else {
|
|
/* translators: 1: upload/last modified date and time */
|
|
$h_time = sprintf( __( '%1$s ago', 'media-library-assistant' ), human_time_diff( $time ) );
|
|
}
|
|
} else {
|
|
/* translators: format for upload/last modified date */
|
|
$h_time = mysql2date( __( 'Y/m/d', 'media-library-assistant' ), $m_time );
|
|
}
|
|
}
|
|
|
|
return $h_time;
|
|
}
|
|
|
|
/**
|
|
* Supply the content for a custom column
|
|
*
|
|
* @since 0.30
|
|
*
|
|
* @param array A singular attachment (post) object
|
|
* @return string HTML markup to be placed inside the column
|
|
*/
|
|
function column_modified( $item ) {
|
|
if ( '0000-00-00 00:00:00' == $item->post_modified ) {
|
|
$h_time = __( 'Unpublished', 'media-library-assistant' );
|
|
} else {
|
|
$m_time = $item->post_modified;
|
|
$time = get_post_time( 'G', true, $item, false );
|
|
|
|
if ( ( abs( $t_diff = time() - $time ) ) < 86400 ) {
|
|
if ( $t_diff < 0 ) {
|
|
$h_time = sprintf( __( '%1$s from now', 'media-library-assistant' ), human_time_diff( $time ) );
|
|
} else {
|
|
$h_time = sprintf( __( '%1$s ago', 'media-library-assistant' ), human_time_diff( $time ) );
|
|
}
|
|
} else {
|
|
$h_time = mysql2date( __( 'Y/m/d', 'media-library-assistant' ), $m_time );
|
|
}
|
|
}
|
|
|
|
return $h_time;
|
|
}
|
|
|
|
/**
|
|
* Supply the content for a custom column
|
|
*
|
|
* @since 0.30
|
|
*
|
|
* @param array A singular attachment (post) object
|
|
* @return string HTML markup to be placed inside the column
|
|
*/
|
|
function column_author( $item ) {
|
|
$user = get_user_by( 'id', $item->post_author );
|
|
|
|
if ( isset( $user->data->display_name ) ) {
|
|
return sprintf( '<a href="%s" title="' . __( 'Filter by', 'media-library-assistant' ) . ' ' . __( 'Author', 'media-library-assistant' ) . '">%s</a>', esc_url( add_query_arg( array_merge( array(
|
|
'page' => MLACore::ADMIN_PAGE_SLUG,
|
|
'author' => $item->post_author,
|
|
'heading_suffix' => urlencode( __( 'Author', 'media-library-assistant' ) . ': ' . $user->data->display_name )
|
|
), self::mla_submenu_arguments( false ) ), 'upload.php' ) ), esc_html( $user->data->display_name ) );
|
|
}
|
|
|
|
return 'unknown';
|
|
}
|
|
|
|
/**
|
|
* Supply the content for a custom column
|
|
*
|
|
* @since 0.1
|
|
*
|
|
* @param array A singular attachment (post) object
|
|
* @return string HTML markup to be placed inside the column
|
|
*/
|
|
function column_attached_to( $item ) {
|
|
if ( isset( $item->parent_title ) ) {
|
|
$parent_type = get_post_type_object( $item->parent_type );
|
|
if ( $parent_type ) {
|
|
$user_can_edit_parent = $parent_type->show_ui && current_user_can( 'edit_post', $item->post_parent );
|
|
if ( $parent_type->show_ui ) {
|
|
$user_can_read_parent = current_user_can( 'read_post', $item->post_parent );
|
|
} else {
|
|
$user_can_read_parent = true;
|
|
}
|
|
} else {
|
|
$user_can_edit_parent = false;
|
|
$user_can_read_parent = false;
|
|
}
|
|
|
|
if ( $user_can_edit_parent ) {
|
|
$parent_title = sprintf( '<a href="%1$s" title="' . __( 'Edit', 'media-library-assistant' ) . ' “%2$s”">%3$s</a>', esc_url( add_query_arg( array(
|
|
'post' => $item->post_parent,
|
|
'action' => 'edit'
|
|
), 'post.php' ) ), esc_attr( $item->parent_title ), esc_attr( $item->parent_title ) );
|
|
} elseif ( $user_can_read_parent ) {
|
|
$parent_title = esc_attr( $item->parent_title );
|
|
} else {
|
|
$parent_title = __( '(Private post)' );
|
|
}
|
|
|
|
if ( isset( $item->parent_date ) && $user_can_read_parent ) {
|
|
$parent_date = '<br>' . mysql2date( __( 'Y/m/d', 'media-library-assistant' ), $item->parent_date );
|
|
} else {
|
|
$parent_date = '';
|
|
}
|
|
|
|
if ( isset( $item->parent_type ) && $user_can_read_parent ) {
|
|
$parent_type = '<br>(' . $item->parent_type . ' ' . (string) $item->post_parent . self::_format_post_status( $item->parent_status ) . ')';
|
|
} else {
|
|
$parent_type = '';
|
|
}
|
|
|
|
$parent = sprintf( '%1$s%2$s%3$s', /*%1$s*/ $parent_title, /*%2$s*/ $parent_date, /*%3$s*/ $parent_type ); // . "<br>\r\n";
|
|
} else {
|
|
$parent = '(' . _x( 'Unattached', 'table_view_singular', 'media-library-assistant' ) . ')';
|
|
}
|
|
|
|
if ( current_user_can( 'edit_post', $item->ID ) ) {
|
|
$set_parent = "<br>\n" . sprintf( '<a class="hide-if-no-js" id="mla-child-%2$s" onclick="mla.inlineEditAttachment.tableParentOpen( \'%1$s\',\'%2$s\',\'%3$s\' ); return false;" href="#the-list">%4$s</a><br>', /*%1$s*/ $item->post_parent, /*%2$s*/ $item->ID, /*%3$s*/ _draft_or_post_title( $item ), /*%4$s*/ __( 'Set Parent', 'media-library-assistant' ) );
|
|
} else {
|
|
$set_parent = '';
|
|
}
|
|
|
|
return $parent . $set_parent . "\n";
|
|
}
|
|
|
|
/**
|
|
* Display the pagination, adding view, search and filter arguments
|
|
*
|
|
* @since 1.42
|
|
*
|
|
* @param string 'top' | 'bottom'
|
|
*/
|
|
function pagination( $which ) {
|
|
$save_uri = $_SERVER['REQUEST_URI'];
|
|
$_SERVER['REQUEST_URI'] = add_query_arg( self::mla_submenu_arguments(), $save_uri );
|
|
parent::pagination( $which );
|
|
$_SERVER['REQUEST_URI'] = $save_uri;
|
|
}
|
|
|
|
/**
|
|
* This method dictates the table's columns and titles
|
|
*
|
|
* @since 0.1
|
|
*
|
|
* @return array Column information: 'slugs'=>'Visible Titles'
|
|
*/
|
|
function get_columns( ) {
|
|
return self::mla_manage_columns_filter();
|
|
}
|
|
|
|
/**
|
|
* Returns the list of currently hidden columns from a user option or
|
|
* from default values if the option is not set
|
|
*
|
|
* @since 0.1
|
|
*
|
|
* @return array Column information,e.g., array(0 => 'ID_parent, 1 => 'title_name')
|
|
*/
|
|
function get_hidden_columns( ) {
|
|
$columns = get_user_option( 'managemedia_page_' . MLACore::ADMIN_PAGE_SLUG . 'columnshidden' );
|
|
|
|
if ( is_array( $columns ) ) {
|
|
foreach ( $columns as $index => $value ){
|
|
if ( empty( $value ) ) {
|
|
unset( $columns[ $index ] );
|
|
}
|
|
}
|
|
} else {
|
|
$columns = self::$default_hidden_columns;
|
|
}
|
|
|
|
return apply_filters( 'mla_list_table_get_hidden_columns', $columns );
|
|
}
|
|
|
|
/**
|
|
* Returns an array where the key is the column that needs to be sortable
|
|
* and the value is db column (or other criteria) to sort by.
|
|
*
|
|
* @since 0.1
|
|
*
|
|
* @return array Sortable column information,e.g.,
|
|
* 'slug' => array('data_value', (boolean) initial_descending )
|
|
*/
|
|
function get_sortable_columns( ) {
|
|
return apply_filters( 'mla_list_table_get_sortable_columns', self::$default_sortable_columns );
|
|
}
|
|
|
|
/**
|
|
* Print column headers, adding view, search and filter arguments
|
|
*
|
|
* @since 1.42
|
|
*
|
|
* @param bool $with_id Whether to set the id attribute or not
|
|
*/
|
|
function print_column_headers( $with_id = true ) {
|
|
$save_uri = $_SERVER['REQUEST_URI'];
|
|
$_SERVER['REQUEST_URI'] = add_query_arg( self::mla_submenu_arguments(), $save_uri );
|
|
parent::print_column_headers( $with_id );
|
|
$_SERVER['REQUEST_URI'] = $save_uri;
|
|
}
|
|
|
|
/**
|
|
* Wrapper for _get_view; returns HTML markup for one view that can be used with this table
|
|
*
|
|
* @since 2.11
|
|
*
|
|
* @param string View slug, key to MLA_POST_MIME_TYPES array
|
|
* @param string Slug for current view
|
|
*
|
|
* @return string | false HTML for link to display the view, false if count = zero
|
|
*/
|
|
public function mla_get_view( $view_slug, $current_view ) {
|
|
return self::_get_view( $view_slug, $current_view );
|
|
}
|
|
|
|
/**
|
|
* Returns HTML markup for one view that can be used with this table
|
|
*
|
|
* @since 1.40
|
|
*
|
|
* @param string View slug, key to MLA_POST_MIME_TYPES array
|
|
* @param string Slug for current view
|
|
*
|
|
* @return string | false HTML for link to display the view, false if count = zero
|
|
*/
|
|
private static function _get_view( $view_slug, $current_view ) {
|
|
global $wpdb;
|
|
static $mla_types = NULL, $default_types, $posts_per_type, $post_mime_types, $avail_post_mime_types, $matches, $num_posts, $detached_items;
|
|
|
|
/*
|
|
* Calculate the common values once per page load
|
|
*/
|
|
if ( is_null( $mla_types ) ) {
|
|
$query_types = MLAMime::mla_query_view_items( array( 'orderby' => 'menu_order' ), 0, 0 );
|
|
if ( ! is_array( $query_types ) ) {
|
|
$query_types = array ();
|
|
}
|
|
|
|
$mla_types = array ();
|
|
foreach ( $query_types as $value ) {
|
|
$mla_types[ $value->slug ] = $value;
|
|
}
|
|
|
|
$default_types = MLACore::mla_get_option( MLACoreOptions::MLA_POST_MIME_TYPES, true );
|
|
$posts_per_type = (array) wp_count_attachments();
|
|
$post_mime_types = get_post_mime_types();
|
|
$avail_post_mime_types = self::_avail_mime_types( $posts_per_type );
|
|
$matches = wp_match_mime_types( array_keys( $post_mime_types ), array_keys( $posts_per_type ) );
|
|
|
|
foreach ( $matches as $type => $reals ) {
|
|
foreach ( $reals as $real ) {
|
|
$num_posts[ $type ] = ( isset( $num_posts[ $type ] ) ) ? $num_posts[ $type ] + $posts_per_type[ $real ] : $posts_per_type[ $real ];
|
|
}
|
|
}
|
|
|
|
$detached_items = $wpdb->get_var( "SELECT COUNT(*) FROM {$wpdb->posts} WHERE post_type = 'attachment' AND post_status != 'trash' AND post_parent < 1" );
|
|
}
|
|
|
|
$class = ( $view_slug == $current_view ) ? ' class="current"' : '';
|
|
$base_url = 'upload.php?page=' . MLACore::ADMIN_PAGE_SLUG;
|
|
|
|
/*
|
|
* Handle the special cases: all, detached, attached and trash
|
|
*/
|
|
switch( $view_slug ) {
|
|
case 'all':
|
|
$total_items = array_sum( $posts_per_type ) - $posts_per_type['trash'];
|
|
return "<a href='{$base_url}'$class>" . sprintf( _nx( 'All', 'All', $total_items, 'uploaded files', 'media-library-assistant' ) . ' <span class="count">(%1$s)</span></a>', number_format_i18n( $total_items ) );
|
|
case 'detached':
|
|
if ( $detached_items ) {
|
|
$value = $default_types['detached'];
|
|
$singular = sprintf('%s <span class="count">(%%s)</span>', $value['singular'] );
|
|
$plural = sprintf('%s <span class="count">(%%s)</span>', $value['plural'] );
|
|
return '<a href="' . add_query_arg( array( 'detached' => '1' ), $base_url ) . '"' . $class . '>' . sprintf( _nx( $singular, $plural, $detached_items, 'detached files', 'media-library-assistant' ), number_format_i18n( $detached_items ) ) . '</a>';
|
|
}
|
|
|
|
return false;
|
|
case 'attached':
|
|
if ( $attached_items = ( array_sum( $posts_per_type ) - $posts_per_type['trash'] ) - $detached_items ) {
|
|
$value = $default_types['attached'];
|
|
$singular = sprintf('%s <span class="count">(%%s)</span>', $value['singular'] );
|
|
$plural = sprintf('%s <span class="count">(%%s)</span>', $value['plural'] );
|
|
return '<a href="' . add_query_arg( array( 'detached' => '0' ), $base_url ) . '"' . $class . '>' . sprintf( _nx( $singular, $plural, $attached_items, 'attached files', 'media-library-assistant' ), number_format_i18n( $attached_items ) ) . '</a>';
|
|
}
|
|
|
|
return false;
|
|
case 'trash':
|
|
if ( $posts_per_type['trash'] ) {
|
|
$value = $default_types['trash'];
|
|
$singular = sprintf('%s <span class="count">(%%s)</span>', $value['singular'] );
|
|
$plural = sprintf('%s <span class="count">(%%s)</span>', $value['plural'] );
|
|
return '<a href="' . add_query_arg( array( 'status' => 'trash'
|
|
), $base_url ) . '"' . $class . '>' . sprintf( _nx( $singular, $plural, $posts_per_type['trash'], 'uploaded files', 'media-library-assistant' ), number_format_i18n( $posts_per_type['trash'] ) ) . '</a>';
|
|
}
|
|
|
|
return false;
|
|
} // switch special cases
|
|
|
|
/*
|
|
* Make sure the slug is in our list
|
|
*/
|
|
if ( array_key_exists( $view_slug, $mla_types ) ) {
|
|
$mla_type = $mla_types[ $view_slug ];
|
|
} else {
|
|
return false;
|
|
}
|
|
|
|
/*
|
|
* Handle post_mime_types
|
|
*/
|
|
if ( $mla_type->post_mime_type ) {
|
|
if ( !empty( $num_posts[ $view_slug ] ) ) {
|
|
return "<a href='" . add_query_arg( array( 'post_mime_type' => $view_slug
|
|
), $base_url ) . "'$class>" . sprintf( translate_nooped_plural( $post_mime_types[ $view_slug ][ 2 ], $num_posts[ $view_slug ], 'media-library-assistant' ), number_format_i18n( $num_posts[ $view_slug ] ) ) . '</a>';
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/*
|
|
* Handle extended specification types
|
|
*/
|
|
if ( empty( $mla_type->specification ) ) {
|
|
$query = array ( 'post_mime_type' => $view_slug );
|
|
} else {
|
|
$query = MLACore::mla_prepare_view_query( $view_slug, $mla_type->specification );
|
|
}
|
|
|
|
$total_items = MLAQuery::mla_count_list_table_items( $query );
|
|
if ( $total_items ) {
|
|
$singular = sprintf('%s <span class="count">(%%s)</span>', $mla_type->singular );
|
|
$plural = sprintf('%s <span class="count">(%%s)</span>', $mla_type->plural );
|
|
$nooped_plural = _n_noop( $singular, $plural, 'media-library-assistant' );
|
|
|
|
if ( isset( $query['post_mime_type'] ) ) {
|
|
$query['post_mime_type'] = urlencode( $query['post_mime_type'] );
|
|
} else {
|
|
$query['meta_slug'] = $view_slug;
|
|
$query['meta_query'] = urlencode( json_encode( $query['meta_query'] ) );
|
|
}
|
|
|
|
return "<a href='" . add_query_arg( $query, $base_url ) . "'$class>" . sprintf( translate_nooped_plural( $nooped_plural, $total_items, 'media-library-assistant' ), number_format_i18n( $total_items ) ) . '</a>';
|
|
}
|
|
|
|
return false;
|
|
} // _get_view
|
|
|
|
/**
|
|
* Returns an associative array listing all the views that can be used with this table.
|
|
* These are listed across the top of the page and managed by WordPress.
|
|
*
|
|
* @since 0.1
|
|
*
|
|
* @return array View information,e.g., array ( id => link )
|
|
*/
|
|
function get_views( ) {
|
|
/*
|
|
* Find current view
|
|
*/
|
|
if ( $this->detached ) {
|
|
$current_view = 'detached';
|
|
} elseif ( $this->attached ) {
|
|
$current_view = 'attached';
|
|
} elseif ( $this->is_trash ) {
|
|
$current_view = 'trash';
|
|
} elseif ( empty( $_REQUEST['post_mime_type'] ) ) {
|
|
if ( isset( $_REQUEST['meta_query'] ) ) {
|
|
$query = json_decode( stripslashes( $_REQUEST['meta_query'] ), true );
|
|
$current_view = $query['slug'];
|
|
} else {
|
|
$current_view = 'all';
|
|
}
|
|
} else {
|
|
$current_view = $_REQUEST['post_mime_type'];
|
|
}
|
|
|
|
$mla_types = MLAMime::mla_query_view_items( array( 'orderby' => 'menu_order' ), 0, 0 );
|
|
if ( ! is_array( $mla_types ) ) {
|
|
$mla_types = array ();
|
|
}
|
|
|
|
/*
|
|
* Filter the list, generate the views
|
|
*/
|
|
$view_links = array();
|
|
foreach ( $mla_types as $value ) {
|
|
if ( $value->table_view ) {
|
|
if ( $current_view == $value->specification ) {
|
|
$current_view = $value->slug;
|
|
}
|
|
|
|
if ( $link = self::_get_view( $value->slug, $current_view ) ) {
|
|
$view_links[ $value->slug ] = $link;
|
|
}
|
|
}
|
|
}
|
|
|
|
return $view_links;
|
|
}
|
|
|
|
/**
|
|
* Get an associative array ( option_name => option_title ) with the list
|
|
* of bulk actions available on this table.
|
|
*
|
|
* @since 0.1
|
|
*
|
|
* @return array Contains all the bulk actions: 'slugs'=>'Visible Titles'
|
|
*/
|
|
function get_bulk_actions( ) {
|
|
$actions = array();
|
|
|
|
if ( $this->is_trash ) {
|
|
$actions['restore'] = __( 'Restore', 'media-library-assistant' );
|
|
$actions['delete'] = __( 'Delete Permanently', 'media-library-assistant' );
|
|
} else {
|
|
$actions['edit'] = __( 'Edit', 'media-library-assistant' );
|
|
|
|
if ( EMPTY_TRASH_DAYS && MEDIA_TRASH ) {
|
|
$actions['trash'] = __( 'Move to Trash', 'media-library-assistant' );
|
|
} else {
|
|
$actions['delete'] = __( 'Delete Permanently', 'media-library-assistant' );
|
|
}
|
|
}
|
|
|
|
if ( class_exists( 'ZipArchive' ) ) {
|
|
$actions[ 'download-zip' ] = __( 'Download', 'media-library-assistant' );
|
|
}
|
|
|
|
return apply_filters( 'mla_list_table_get_bulk_actions', $actions );
|
|
}
|
|
|
|
/**
|
|
* Generate the table navigation above or below the table
|
|
*
|
|
* Adds the list/grid switcher in WP 4.0+
|
|
*
|
|
* @since 2.25
|
|
*
|
|
* @param string 'top' or 'bottom', i.e., above or below the table rows
|
|
*/
|
|
function display_tablenav( $which ) {
|
|
if ( 'top' === $which ) {
|
|
wp_nonce_field( 'bulk-' . $this->_args['plural'] );
|
|
}
|
|
?>
|
|
|
|
<div class="tablenav <?php echo esc_attr( $which ); ?>">
|
|
<?php if ( 'top' === $which && MLAQuery::$wp_4dot0_plus && ( 'checked' == MLACore::mla_get_option( MLACoreOptions::MLA_SCREEN_DISPLAY_SWITCHER ) )): ?>
|
|
<div class="view-switch media-grid-view-switch" style="float: left"> <a class="view-list current" href="<?php echo admin_url( 'upload.php?page=' . MLACore::ADMIN_PAGE_SLUG ); ?>"> <span class="screen-reader-text">List View</span> </a> <a class="view-grid" href="<?php echo admin_url( 'upload.php?mode=grid' ); ?>"> <span class="screen-reader-text">Grid View</span> </a> </div>
|
|
<?php endif; ?>
|
|
|
|
<?php if ( $this->has_items() ): ?>
|
|
<div class="alignleft actions bulkactions">
|
|
<?php $this->bulk_actions( $which ); ?>
|
|
</div>
|
|
<?php endif;
|
|
$this->extra_tablenav( $which );
|
|
$this->pagination( $which );
|
|
?>
|
|
|
|
<br class="clear" />
|
|
</div>
|
|
<?php
|
|
}
|
|
|
|
/**
|
|
* Extra controls to be displayed between bulk actions and pagination
|
|
*
|
|
* Modeled after class-wp-posts-list-table.php in wp-admin/includes.
|
|
*
|
|
* @since 0.1
|
|
*
|
|
* @param string 'top' or 'bottom', i.e., above or below the table rows
|
|
*
|
|
* @return void
|
|
*/
|
|
function extra_tablenav( $which ) {
|
|
/*
|
|
* Decide which actions to show
|
|
*/
|
|
if ( 'top' == $which ) {
|
|
$actions = array( 'month', 'mla_filter_term', 'mla_filter' );
|
|
|
|
$term_search_taxonomies = MLACore::mla_supported_taxonomies('term-search');
|
|
if ( ! empty( $term_search_taxonomies ) ) {
|
|
$actions[] = 'terms_search';
|
|
}
|
|
} else {
|
|
$actions = array();
|
|
}
|
|
|
|
if ( self::mla_submenu_arguments( true ) != self::mla_submenu_arguments( false ) ) {
|
|
$actions[] = 'clear_filter_by';
|
|
}
|
|
|
|
if ( $this->is_trash && current_user_can( 'edit_others_posts' ) ) {
|
|
$actions[] = 'delete_all';
|
|
}
|
|
|
|
$actions = apply_filters( 'mla_list_table_extranav_actions', $actions, $which );
|
|
|
|
if ( empty( $actions ) ) {
|
|
return;
|
|
}
|
|
|
|
echo ( '<div class="alignleft actions">' );
|
|
|
|
foreach ( $actions as $action ) {
|
|
switch ( $action ) {
|
|
case 'month':
|
|
$this->months_dropdown( 'attachment' );
|
|
break;
|
|
case 'mla_filter_term':
|
|
echo self::mla_get_taxonomy_filter_dropdown( isset( $_REQUEST['mla_filter_term'] ) ? $_REQUEST['mla_filter_term'] : 0 );
|
|
break;
|
|
case 'mla_filter':
|
|
submit_button( __( 'Filter', 'media-library-assistant' ), 'secondary', 'mla_filter', false, array( 'id' => 'post-query-submit' ) );
|
|
break;
|
|
case 'terms_search':
|
|
submit_button( __( 'Terms Search', 'media-library-assistant' ), 'secondary', 'mla_terms_search', false, array(
|
|
'id' => 'mla-terms-search-open', 'onclick' => 'mlaTaxonomy.termsSearch.open()'
|
|
) );
|
|
break;
|
|
case 'clear_filter_by':
|
|
submit_button( __( 'Clear Filter-by', 'media-library-assistant' ), 'button apply', 'clear_filter_by', false );
|
|
break;
|
|
case 'delete_all':
|
|
submit_button( __( 'Empty Trash', 'media-library-assistant' ), 'button apply', 'delete_all', false );
|
|
break;
|
|
default:
|
|
do_action( 'mla_list_table_extranav_custom_action', $action, $which );
|
|
}
|
|
}
|
|
|
|
echo ( '</div>' );
|
|
}
|
|
|
|
/**
|
|
* Prepares the list of items for displaying
|
|
*
|
|
* This is where you prepare your data for display. This method will usually
|
|
* be used to query the database, sort and filter the data, and generally
|
|
* get it ready to be displayed. At a minimum, we should set $this->items and
|
|
* $this->set_pagination_args().
|
|
*
|
|
* @since 0.1
|
|
*/
|
|
function prepare_items( ) {
|
|
// Initialize $this->_column_headers
|
|
$this->get_column_info();
|
|
|
|
/*
|
|
* Calculate and filter pagination arguments.
|
|
*/
|
|
$user = get_current_user_id();
|
|
$option = $this->screen->get_option( 'per_page', 'option' );
|
|
$per_page = (integer) get_user_meta( $user, $option, true );
|
|
if ( empty( $per_page ) || $per_page < 1 ) {
|
|
$per_page = (integer) $this->screen->get_option( 'per_page', 'default' );
|
|
}
|
|
|
|
$current_page = isset( $_REQUEST['paged'] ) ? absint( $_REQUEST['paged'] ) : 1;
|
|
|
|
$pagination = apply_filters_ref_array( 'mla_list_table_prepare_items_pagination', array( compact( array( 'per_page', 'current_page' ) ), &$this ) );
|
|
$per_page = isset( $pagination[ 'per_page' ] ) ? $pagination[ 'per_page' ] : $per_page;
|
|
$current_page = isset( $pagination[ 'current_page' ] ) ? $pagination[ 'current_page' ] : $current_page;
|
|
|
|
/*
|
|
* Assign sorted and paginated data to the items property, where
|
|
* it can be used by the rest of the class.
|
|
*/
|
|
$total_items = apply_filters_ref_array( 'mla_list_table_prepare_items_total_items', array( NULL, &$this ) );
|
|
if ( is_null( $total_items ) ) {
|
|
$total_items = MLAQuery::mla_count_list_table_items( $_REQUEST, ( ( $current_page - 1 ) * $per_page ), $per_page );
|
|
}
|
|
|
|
/*
|
|
* Register the pagination options & calculations.
|
|
*/
|
|
$this->set_pagination_args( array(
|
|
'total_items' => $total_items, //WE have to calculate the total number of items
|
|
'per_page' => $per_page, //WE have to determine how many items to show on a page
|
|
'total_pages' => ceil( $total_items / $per_page ) //WE have to calculate the total number of pages
|
|
) );
|
|
|
|
$this->items = apply_filters_ref_array( 'mla_list_table_prepare_items_the_items', array( NULL, &$this ) );
|
|
if ( is_null( $this->items ) ) {
|
|
$this->items = MLAQuery::mla_query_list_table_items( $_REQUEST, ( ( $current_page - 1 ) * $per_page ), $per_page );
|
|
}
|
|
|
|
do_action_ref_array( 'mla_list_table_prepare_items', array( &$this ) );
|
|
}
|
|
|
|
/**
|
|
* Generates (echoes) content for a single row of the table
|
|
*
|
|
* @since .20
|
|
*
|
|
* @param object the current item
|
|
*
|
|
* @return void Echoes the row HTML
|
|
*/
|
|
function single_row( $item ) {
|
|
static $row_class = '';
|
|
|
|
// WP 4.2+ uses "striped" CSS styles to implement "alternate"
|
|
if ( version_compare( get_bloginfo( 'version' ), '4.2', '<' ) ) {
|
|
$row_class = ( $row_class == '' ? ' class="alternate"' : '' );
|
|
}
|
|
|
|
echo '<tr id="attachment-' . $item->ID . '"' . $row_class . '>';
|
|
echo parent::single_row_columns( $item );
|
|
echo '</tr>';
|
|
}
|
|
} // class MLA_List_Table
|
|
|
|
/*
|
|
* Some actions and filters are added here, when the source file is loaded, because the
|
|
* MLA_List_Table object is created too late to be useful.
|
|
*/
|
|
add_action( 'admin_init', 'MLA_List_Table::mla_admin_init_action' );
|
|
|
|
add_filter( 'get_user_option_managemedia_page_' . MLACore::ADMIN_PAGE_SLUG . 'columnshidden', 'MLA_List_Table::mla_manage_hidden_columns_filter', 10, 3 );
|
|
add_filter( 'manage_media_page_' . MLACore::ADMIN_PAGE_SLUG . '_columns', 'MLA_List_Table::mla_manage_columns_filter', 10, 0 );
|
|
?>
|