401 lines
16 KiB
PHP
401 lines
16 KiB
PHP
<?php
|
|
/**
|
|
* Media Library Assistant Custom Taxonomy and Widget objects
|
|
*
|
|
* @package Media Library Assistant
|
|
* @since 0.1
|
|
*/
|
|
|
|
/**
|
|
* Class MLA (Media Library Assistant) Objects defines and manages custom taxonomies for Attachment Categories and Tags
|
|
*
|
|
* @package Media Library Assistant
|
|
* @since 0.20
|
|
*/
|
|
class MLAObjects {
|
|
/**
|
|
* Initialization function, similar to __construct()
|
|
*
|
|
* @since 0.20
|
|
*
|
|
* @return void
|
|
*/
|
|
public static function initialize() {
|
|
self::_add_taxonomy_support();
|
|
}
|
|
|
|
/**
|
|
* Registers Attachment Categories and Attachment Tags custom taxonomies
|
|
*
|
|
* @since 2.61
|
|
*
|
|
* @return void
|
|
*/
|
|
public static function mla_build_taxonomies( ) {
|
|
if ( MLACore::mla_taxonomy_support('attachment_category') ) {
|
|
$object_type = apply_filters( 'mla_attachment_category_types', array(
|
|
'attachment',
|
|
) );
|
|
|
|
$labels = apply_filters( 'mla_attachment_category_labels', array(
|
|
'name' => _x( 'Att. Categories', 'taxonomy_name_plural', 'media-library-assistant' ),
|
|
'singular_name' => _x( 'Att. Category', 'taxonomy_name_singular', 'media-library-assistant' ),
|
|
'search_items' => __( 'Search Att. Categories', 'media-library-assistant' ),
|
|
'all_items' => __( 'All Att. Categories', 'media-library-assistant' ),
|
|
'parent_item' => __( 'Parent Att. Category', 'media-library-assistant' ),
|
|
'parent_item_colon' => __( 'Parent Att. Category', 'media-library-assistant' ) . ':',
|
|
'edit_item' => __( 'Edit Att. Category', 'media-library-assistant' ),
|
|
'update_item' => __( 'Update Att. Category', 'media-library-assistant' ),
|
|
/* translators: %s: add new taxonomy label */
|
|
'add_new_item' => sprintf( __( 'Add New %1$s', 'media-library-assistant' ), __( 'Att. Category', 'media-library-assistant' ) ),
|
|
'new_item_name' => __( 'New Att. Category Name', 'media-library-assistant' ),
|
|
'menu_name' => __( 'Att. Category', 'media-library-assistant' )
|
|
) );
|
|
|
|
$args = apply_filters( 'mla_attachment_category_arguments', array(
|
|
'hierarchical' => true,
|
|
'labels' => $labels,
|
|
'show_ui' => true,
|
|
'show_admin_column' => true,
|
|
'query_var' => true,
|
|
'rewrite' => true,
|
|
'update_count_callback' => '_update_generic_term_count'
|
|
) );
|
|
|
|
register_taxonomy( 'attachment_category', $object_type, $args );
|
|
}
|
|
|
|
if ( MLACore::mla_taxonomy_support('attachment_tag') ) {
|
|
$object_type = apply_filters( 'mla_attachment_tag_types', array(
|
|
'attachment'
|
|
) );
|
|
|
|
$labels = apply_filters( 'mla_attachment_tag_labels', array(
|
|
'name' => _x( 'Att. Tags', 'taxonomy_name_plural', 'media-library-assistant' ),
|
|
'singular_name' => _x( 'Att. Tag', 'taxonomy_name_singular', 'media-library-assistant' ),
|
|
'search_items' => __( 'Search Att. Tags', 'media-library-assistant' ),
|
|
'all_items' => __( 'All Att. Tags', 'media-library-assistant' ),
|
|
'parent_item' => __( 'Parent Att. Tag', 'media-library-assistant' ),
|
|
'parent_item_colon' => __( 'Parent Att. Tag', 'media-library-assistant' ) . ':',
|
|
'edit_item' => __( 'Edit Att. Tag', 'media-library-assistant' ),
|
|
'update_item' => __( 'Update Att. Tag', 'media-library-assistant' ),
|
|
/* translators: %s: add new taxonomy label */
|
|
'add_new_item' => sprintf( __( 'Add New %1$s', 'media-library-assistant' ), __( 'Att. Tag', 'media-library-assistant' ) ),
|
|
'new_item_name' => __( 'New Att. Tag Name', 'media-library-assistant' ),
|
|
'menu_name' => __( 'Att. Tag', 'media-library-assistant' )
|
|
) );
|
|
|
|
$args = apply_filters( 'mla_attachment_tag_arguments', array(
|
|
'hierarchical' => false,
|
|
'labels' => $labels,
|
|
'show_ui' => true,
|
|
'show_admin_column' => true,
|
|
'query_var' => true,
|
|
'rewrite' => true,
|
|
'update_count_callback' => '_update_generic_term_count'
|
|
) );
|
|
|
|
register_taxonomy( 'attachment_tag', $object_type, $args );
|
|
}
|
|
} // mla_build_taxonomies
|
|
|
|
/**
|
|
* Adds taxonomy-related filters for MLA-supported taxonomies
|
|
*
|
|
* @since 2.61
|
|
*
|
|
* @return void
|
|
*/
|
|
private static function _add_taxonomy_support( ) {
|
|
MLACore::mla_initialize_tax_checked_on_top();
|
|
$taxonomies = get_taxonomies( array ( 'show_ui' => true ), 'names' );
|
|
foreach ( $taxonomies as $tax_name ) {
|
|
if ( MLACore::mla_taxonomy_support( $tax_name ) ) {
|
|
register_taxonomy_for_object_type( $tax_name, 'attachment');
|
|
add_filter( "manage_edit-{$tax_name}_columns", 'MLAObjects::mla_taxonomy_get_columns_filter', 0x7FFFFFFF, 1 );
|
|
add_filter( "manage_{$tax_name}_custom_column", 'MLAObjects::mla_taxonomy_column_filter', 0x7FFFFFFF, 3 );
|
|
} // taxonomy support
|
|
} // foreach
|
|
} // _add_taxonomy_support
|
|
|
|
/**
|
|
* WordPress Filter for edit taxonomy "Attachments" column,
|
|
* which replaces the "Posts" column with an equivalent "Attachments" column.
|
|
*
|
|
* @since 0.30
|
|
*
|
|
* @param array column definitions for the edit taxonomy list table
|
|
*
|
|
* @return array updated column definitions for the edit taxonomy list table
|
|
*/
|
|
public static function mla_taxonomy_get_columns_filter( $columns ) {
|
|
// Adding or inline-editing a tag is done with AJAX, and there's no current screen object
|
|
if ( isset( $_REQUEST['action'] ) && in_array( $_REQUEST['action'], array( 'add-tag', 'inline-save-tax' ) ) ) {
|
|
$post_type = !empty($_POST['post_type']) ? $_POST['post_type'] : 'post';
|
|
$taxonomy = !empty($_POST['taxonomy']) ? $_POST['taxonomy'] : 'post_tag';
|
|
} else {
|
|
$screen = get_current_screen();
|
|
$post_type = !empty( $screen->post_type ) ? $screen->post_type : 'post';
|
|
$taxonomy = !empty( $screen->taxonomy ) ? $screen->taxonomy : 'post_tag';
|
|
}
|
|
|
|
if ( 'attachment' == $post_type ) {
|
|
$filter_columns = apply_filters( 'mla_taxonomy_get_columns', NULL, $columns, $taxonomy );
|
|
if ( ! empty( $filter_columns ) ) {
|
|
return $filter_columns;
|
|
}
|
|
|
|
if ( isset ( $columns[ 'posts' ] ) ) {
|
|
$wp_taxonomy = true; // in_array( $taxonomy, array( 'category', 'post_tag' ) );
|
|
if ( ! ( $wp_taxonomy && ( 'checked' === MLACore::mla_get_option( MLACoreOptions::MLA_SHOW_COUNT_COLUMN ) ) ) ) {
|
|
unset( $columns[ 'posts' ] );
|
|
}
|
|
}
|
|
|
|
$columns[ 'attachments' ] = __( 'Attachments', 'media-library-assistant' );
|
|
}
|
|
|
|
return $columns;
|
|
}
|
|
|
|
/**
|
|
* WordPress Filter for edit taxonomy "Attachments" column,
|
|
* which returns a count of the attachments assigned a given term
|
|
*
|
|
* @since 0.30
|
|
*
|
|
* @param string current column value; filled in by earlier filter handlers
|
|
* @param string name of the column
|
|
* @param integer ID of the term for which the count is desired
|
|
*
|
|
* @return array HTML markup for the column content; number of attachments in the category
|
|
* and alink to retrieve a list of them
|
|
*/
|
|
public static function mla_taxonomy_column_filter( $current_value, $column_name, $term_id ) {
|
|
static $taxonomy = NULL, $tax_object = NULL, $count_terms = false, $terms = array();
|
|
|
|
// Do setup tasks once per page load
|
|
if ( NULL == $taxonomy ) {
|
|
// Adding or inline-editing a tag is done with AJAX, and there's no current screen object
|
|
if ( defined('DOING_AJAX') && DOING_AJAX ) {
|
|
$taxonomy = !empty($_POST['taxonomy']) ? $_POST['taxonomy'] : 'post_tag';
|
|
} else {
|
|
$screen = get_current_screen();
|
|
$taxonomy = !empty( $screen->taxonomy ) ? $screen->taxonomy : 'post_tag';
|
|
}
|
|
}
|
|
|
|
$filter_content = apply_filters( 'mla_taxonomy_column', NULL, $current_value, $column_name, $term_id, $taxonomy );
|
|
if ( ! empty( $filter_content ) ) {
|
|
return $filter_content;
|
|
}
|
|
|
|
if ( 'attachments' !== $column_name ) {
|
|
return $current_value;
|
|
}
|
|
|
|
// Do setup tasks once per page load
|
|
if ( NULL == $tax_object ) {
|
|
// Adding or inline-editing a tag is done with AJAX, and there's no current screen object
|
|
if ( defined('DOING_AJAX') && DOING_AJAX ) {
|
|
$taxonomy = !empty($_POST['taxonomy']) ? $_POST['taxonomy'] : 'post_tag';
|
|
} else {
|
|
$screen = get_current_screen();
|
|
$taxonomy = !empty( $screen->taxonomy ) ? $screen->taxonomy : 'post_tag';
|
|
}
|
|
|
|
$tax_object = get_taxonomy( $taxonomy );
|
|
|
|
$count_terms = 'checked' == MLACore::mla_get_option( MLACoreOptions::MLA_COUNT_TERM_ATTACHMENTS );
|
|
if ( $count_terms ) {
|
|
$terms = get_transient( MLA_OPTION_PREFIX . 't_term_counts_' . $taxonomy );
|
|
|
|
if ( ! is_array( $terms ) ) {
|
|
// The MLAShortcodes class is only loaded when needed.
|
|
if ( !class_exists( 'MLAShortcodes' ) ) {
|
|
require_once( MLA_PLUGIN_PATH . 'includes/class-mla-shortcodes.php' );
|
|
}
|
|
|
|
$cloud = MLAShortcodes::mla_get_terms( array(
|
|
'taxonomy' => $taxonomy,
|
|
'fields' => 't.term_id, tt.term_taxonomy_id, t.name, t.slug, COUNT(p.ID) AS `count`',
|
|
'number' => 0,
|
|
'no_orderby' => true
|
|
) );
|
|
|
|
unset( $cloud['found_rows'] );
|
|
foreach( $cloud as $term ) {
|
|
$terms[ $term->term_id ] = $term;
|
|
}
|
|
|
|
set_transient( MLA_OPTION_PREFIX . 't_term_counts_' . $taxonomy, $terms, 300 ); // five minutes
|
|
}// build the array
|
|
} // set $terms
|
|
} // setup tasks
|
|
|
|
if ( isset( $terms[ $term_id ] ) ) {
|
|
$term = $terms[ $term_id ];
|
|
$column_text = number_format_i18n( $term->count );
|
|
} else {
|
|
// Cache miss, e.g., WPML/Polylang language has changed
|
|
$term = get_term( $term_id, $taxonomy );
|
|
|
|
if ( is_wp_error( $term ) ) {
|
|
/* translators: 1: ERROR tag 2: taxonomy 3: error message */
|
|
MLACore::mla_debug_add( sprintf( _x( '%1$s: mla_taxonomy_column_filter( "%2$s" ) - get_term failed: "%3$s"', 'error_log', 'media-library-assistant' ), __( 'ERROR', 'media-library-assistant' ), $taxonomy, $term->get_error_message() ), MLACore::MLA_DEBUG_CATEGORY_ANY );
|
|
return 0;
|
|
} elseif ( $count_terms ) {
|
|
// Default to zero, then try to find a real count
|
|
$column_text = number_format_i18n( 0 );
|
|
|
|
// The MLAShortcodes class is only loaded when needed.
|
|
if ( !class_exists( 'MLAShortcodes' ) ) {
|
|
require_once( MLA_PLUGIN_PATH . 'includes/class-mla-shortcodes.php' );
|
|
}
|
|
|
|
$cloud = MLAShortcodes::mla_get_terms( array(
|
|
'taxonomy' => $taxonomy,
|
|
'include' => $term->term_id,
|
|
'fields' => 't.term_id, tt.term_taxonomy_id, t.name, t.slug, COUNT(p.ID) AS `count`',
|
|
'number' => 0,
|
|
'no_orderby' => true
|
|
) );
|
|
|
|
unset( $cloud['found_rows'] );
|
|
foreach( $cloud as $term ) {
|
|
$column_text = number_format_i18n( $term->count );
|
|
}
|
|
} else {
|
|
$column_text = __( 'click to search', 'media-library-assistant' );
|
|
}
|
|
}
|
|
|
|
$filter_content = apply_filters( 'mla_taxonomy_column_final', NULL, $tax_object, $term, $column_text, $count_terms );
|
|
if ( ! empty( $filter_content ) ) {
|
|
return $filter_content;
|
|
}
|
|
|
|
return sprintf( '<a href="%1$s">%2$s</a>', esc_url( add_query_arg(
|
|
array( 'page' => MLACore::ADMIN_PAGE_SLUG, 'mla-tax' => $taxonomy, 'mla-term' => $term->slug, 'heading_suffix' => urlencode( $tax_object->label . ':' . $term->name ) ), 'upload.php' ) ), $column_text );
|
|
}
|
|
} //Class MLAObjects
|
|
|
|
/**
|
|
* Class MLA (Media Library Assistant) Text Widget defines a shortcode-enabled version of the WordPress Text widget
|
|
*
|
|
* @package Media Library Assistant
|
|
* @since 1.60
|
|
*/
|
|
class MLATextWidget extends WP_Widget {
|
|
|
|
/**
|
|
* Calls the parent constructor to set some defaults.
|
|
*
|
|
* @since 1.60
|
|
*
|
|
* @return void
|
|
*/
|
|
function __construct() {
|
|
$widget_args = array(
|
|
'classname' => 'mla_text_widget',
|
|
'description' => __( 'Shortcode(s), HTML and/or Plain Text', 'media-library-assistant' )
|
|
);
|
|
|
|
$control_args = array(
|
|
'width' => 400,
|
|
'height' => 350
|
|
);
|
|
|
|
parent::__construct( 'mla-text-widget', __( 'MLA Text', 'media-library-assistant' ), $widget_args, $control_args );
|
|
}
|
|
|
|
/**
|
|
* Display the widget content - called from the WordPress "front end"
|
|
*
|
|
* @since 1.60
|
|
*
|
|
* @param array Widget arguments
|
|
* @param array Widget definition, from the database
|
|
*
|
|
* @return void Echoes widget output
|
|
*/
|
|
function widget( $args, $instance ) {
|
|
$title = apply_filters( 'widget_title', empty( $instance['title'] ) ? '' : $instance['title'], $instance, $this->id_base );
|
|
$text = do_shortcode( apply_filters( 'widget_text', empty( $instance['text'] ) ? '' : $instance['text'], $instance ) );
|
|
echo $args['before_widget'];
|
|
if ( !empty( $title ) ) { echo $args['before_title'] . $title . $args['after_title']; } ?>
|
|
<?php if ( !empty( $instance['textwidget_div'] ) ) echo '<div class="textwidget">';
|
|
echo !empty( $instance['filter'] ) ? wpautop( $text ) : $text;
|
|
if ( !empty( $instance['textwidget_div'] ) ) echo '</div>'; ?>
|
|
<?php
|
|
echo $args['after_widget'];
|
|
}
|
|
|
|
/**
|
|
* Echo the "edit widget" form on the Appearance/Widgets admin screen
|
|
*
|
|
* @since 1.60
|
|
*
|
|
* @param array Previous definition values, from the database
|
|
*
|
|
* @return void Echoes "edit widget" form
|
|
*/
|
|
function form( $instance ) {
|
|
$instance = wp_parse_args( (array) $instance, array( 'title' => '', 'text' => '' ) );
|
|
$title = strip_tags( $instance['title'] );
|
|
$text = esc_textarea( $instance['text'] );
|
|
?>
|
|
<p><label for="<?php echo $this->get_field_id( 'title' ); ?>"><?php echo __( 'Title', 'media-library-assistant' ) . ':'; ?></label>
|
|
<input class="widefat" id="<?php echo $this->get_field_id( 'title' ); ?>" name="<?php echo $this->get_field_name( 'title' ); ?>" type="text" value="<?php echo esc_attr( $title ); ?>" /></p>
|
|
|
|
<textarea class="widefat" rows="16" cols="20" id="<?php echo $this->get_field_id( 'text' ); ?>" name="<?php echo $this->get_field_name( 'text' ); ?>"><?php echo $text; ?></textarea>
|
|
|
|
<p><input id="<?php echo $this->get_field_id( 'filter' ); ?>" name="<?php echo $this->get_field_name( 'filter' ); ?>" type="checkbox" <?php checked( isset( $instance['filter'] ) ? $instance['filter'] : 0 ); ?> /> <label for="<?php echo $this->get_field_id( 'filter' ); ?>"><?php _e( 'Automatically add paragraphs', 'media-library-assistant' ); ?></label></p>
|
|
<p><input id="<?php echo $this->get_field_id( 'textwidget_div' ); ?>" name="<?php echo $this->get_field_name( 'textwidget_div' ); ?>" type="checkbox" <?php checked( isset( $instance['textwidget_div'] ) ? $instance['textwidget_div'] : 1 ); ?> /> <label for="<?php echo $this->get_field_id( 'textwidget_div' ); ?>"><?php _e( 'Add .textwidget div tags', 'media-library-assistant' ); ?></label></p>
|
|
<?php
|
|
}
|
|
|
|
/**
|
|
* Sanitize widget definition as it is saved to the database
|
|
*
|
|
* @since 1.60
|
|
*
|
|
* @param array Current definition values, to be saved in the database
|
|
* @param array Previous definition values, from the database
|
|
*
|
|
* @return array Updated definition values to be saved in the database
|
|
*/
|
|
function update( $new_instance, $old_instance ) {
|
|
$instance = $old_instance;
|
|
$instance['title'] = strip_tags( $new_instance['title'] );
|
|
if ( current_user_can( 'unfiltered_html' ) ) {
|
|
$instance['text'] = $new_instance['text'];
|
|
} else {
|
|
$instance['text'] = stripslashes( wp_filter_post_kses( addslashes( $new_instance['text'] ) ) ); // wp_filter_post_kses() expects slashed
|
|
}
|
|
|
|
$instance['filter'] = isset( $new_instance['filter'] );
|
|
$instance['textwidget_div'] = isset( $new_instance['textwidget_div'] );
|
|
return $instance;
|
|
}
|
|
|
|
/**
|
|
* Register the widget with WordPress
|
|
*
|
|
* Defined as public because it's an action.
|
|
*
|
|
* @since 1.60
|
|
*
|
|
* @return void
|
|
*/
|
|
public static function mla_text_widget_widgets_init_action(){
|
|
register_widget( 'MLATextWidget' );
|
|
}
|
|
} // Class MLATextWidget
|
|
|
|
/*
|
|
* Actions are added here, when the source file is loaded, because the MLATextWidget
|
|
* object(s) are created too late to be useful.
|
|
*/
|
|
add_action( 'widgets_init', 'MLATextWidget::mla_text_widget_widgets_init_action' );
|
|
?>
|