2358 lines
97 KiB
PHP
2358 lines
97 KiB
PHP
<?php
|
|
/**
|
|
* Manages the plugin option settings
|
|
*
|
|
* @package Media Library Assistant
|
|
* @since 1.00
|
|
*/
|
|
|
|
/**
|
|
* Class MLA (Media Library Assistant) Options manages the plugin option settings
|
|
* and provides functions to get and put them from/to WordPress option variables
|
|
*
|
|
* Separated from class MLASettings in version 1.00
|
|
*
|
|
* @package Media Library Assistant
|
|
* @since 1.00
|
|
*/
|
|
class MLAOptions {
|
|
/**
|
|
* Initialization function, similar to __construct()
|
|
*
|
|
* @since 1.00
|
|
*
|
|
* @return void
|
|
*/
|
|
public static function initialize( ) {
|
|
if ( ( 'checked' == MLACore::mla_get_option( 'enable_iptc_exif_mapping' ) ) ||
|
|
( 'checked' == MLACore::mla_get_option( 'enable_custom_field_mapping' ) ) ||
|
|
( 'checked' == MLACore::mla_get_option( 'enable_iptc_exif_update' ) ) ||
|
|
( 'checked' == MLACore::mla_get_option( 'enable_custom_field_update' ) ) ) {
|
|
add_filter( 'wp_handle_upload_prefilter', 'MLAOptions::mla_wp_handle_upload_prefilter_filter', 1, 1 );
|
|
add_filter( 'wp_handle_upload', 'MLAOptions::mla_wp_handle_upload_filter', 1, 1 );
|
|
|
|
add_action( 'add_attachment', 'MLAOptions::mla_add_attachment_action', 0x7FFFFFFF, 1 );
|
|
add_filter( 'wp_update_attachment_metadata', 'MLAOptions::mla_update_attachment_metadata_filter', 0x7FFFFFFF, 2 );
|
|
|
|
MLACore::mla_debug_add( __LINE__ . " MLAOptions::initialize( " . $_SERVER['REQUEST_URI'] . " ) hooks set", MLACore::MLA_DEBUG_CATEGORY_REST );
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Option Setting templates
|
|
*
|
|
* @since 0.80
|
|
*
|
|
* @var array
|
|
*/
|
|
private static $mla_option_templates = NULL;
|
|
|
|
/**
|
|
* Load option settings templates to $mla_option_templates
|
|
*
|
|
* @since 0.80
|
|
*
|
|
* @return void
|
|
*/
|
|
private static function _load_option_templates() {
|
|
if ( is_null( MLAOptions::$mla_option_templates ) ) {
|
|
MLAOptions::$mla_option_templates = MLACore::mla_load_template( 'mla-option-templates.tpl' );
|
|
|
|
if ( is_null( MLAOptions::$mla_option_templates ) ) {
|
|
MLACore::mla_debug_add( '<strong>mla_debug _load_option_templates()</strong> ' . __( 'error loading tpls/mla-option-templates.tpl', 'media-library-assistant' ) );
|
|
MLAOptions::$mla_option_templates = array();
|
|
} elseif ( !MLAOptions::$mla_option_templates ) {
|
|
MLACore::mla_debug_add( '<strong>mla_debug _load_option_templates()</strong> ' . __( 'tpls/mla-option-templates.tpl not found', 'media-library-assistant' ) );
|
|
MLAOptions::$mla_option_templates = array();
|
|
}
|
|
} // is_null()
|
|
}
|
|
|
|
/**
|
|
* Return the stored value or default value of a defined MLA option
|
|
*
|
|
* Compatibility shim for MLACore::mla_get_option
|
|
*
|
|
* @since 0.1
|
|
*
|
|
* @param string Name of the desired option
|
|
* @param boolean True to ignore current setting and return default values
|
|
* @param boolean True to ignore default values and return only stored values
|
|
* @param array Custom option definitions
|
|
*
|
|
*
|
|
* @return mixed Value(s) for the option or false if the option is not a defined MLA option
|
|
*/
|
|
public static function mla_get_option( $option, $get_default = false, $get_stored = false, $option_table = NULL ) {
|
|
return MLACore::mla_get_option( $option, $get_default, $get_stored, $option_table );
|
|
}
|
|
|
|
/**
|
|
* Add or update the stored value of a defined MLA option
|
|
*
|
|
* Compatibility shim for MLACore::mla_update_option
|
|
*
|
|
* @since 0.1
|
|
*
|
|
* @param string Name of the desired option
|
|
* @param mixed New value for the desired option
|
|
* @param array Custom option definitions
|
|
*
|
|
* @return boolean True if the value was changed or false if the update failed
|
|
*/
|
|
public static function mla_update_option( $option, $newvalue, $option_table = NULL ) {
|
|
return MLACore::mla_update_option( $option, $newvalue, $option_table );
|
|
}
|
|
|
|
/**
|
|
* Delete the stored value of a defined MLA option
|
|
*
|
|
* Compatibility shim for MLACore::mla_delete_option
|
|
*
|
|
* @since 0.1
|
|
*
|
|
* @param string Name of the desired option
|
|
* @param array Custom option definitions
|
|
*
|
|
* @return boolean True if the option was deleted, otherwise false
|
|
*/
|
|
public static function mla_delete_option( $option, $option_table = NULL ) {
|
|
return MLACore::mla_delete_option( $option, $option_table );
|
|
}
|
|
|
|
/**
|
|
* Determine MLA support for a taxonomy, handling the special case where the
|
|
* settings are being updated or reset.
|
|
*
|
|
* Compatibility shim for MLACore::mla_taxonomy_support
|
|
*
|
|
* @since 0.30
|
|
*
|
|
* @param string Taxonomy name, e.g., attachment_category
|
|
* @param string Optional. 'support' (default), 'quick-edit' or 'filter'
|
|
*
|
|
* @return boolean|string
|
|
* true if the taxonomy is supported in this way else false.
|
|
* string if $tax_name is '' and $support_type is 'filter', returns the taxonomy to filter by.
|
|
*/
|
|
public static function mla_taxonomy_support( $tax_name, $support_type = 'support' ) {
|
|
return MLACore::mla_taxonomy_support( $tax_name, $support_type );
|
|
} // mla_taxonomy_support
|
|
|
|
/**
|
|
* Returns an array of taxonomy names assigned to $support_type
|
|
*
|
|
* Compatibility shim for MLACore::mla_taxonomy_support
|
|
*
|
|
* @since 1.90
|
|
*
|
|
* @param string Optional. 'support' (default), 'quick-edit', 'flat-checklist', 'term-search' or 'filter'
|
|
*
|
|
* @return array taxonomies assigned to $support_type; can be empty.
|
|
*/
|
|
public static function mla_supported_taxonomies($support_type = 'support') {
|
|
return MLACore::mla_supported_taxonomies( $tax_name, $support_type );
|
|
} // mla_supported_taxonomies
|
|
|
|
/**
|
|
* Render and manage Attachment Display Settings options; alignment, link type and size
|
|
*
|
|
* @since 1.71
|
|
* @uses MLASettings::$page_template_array contains select_option and select templates
|
|
*
|
|
* @param string 'render', 'update', 'delete', or 'reset'
|
|
* @param string option name, e.g., 'image_default_align'
|
|
* @param array option parameters
|
|
* @param array Optional. null (default) for 'render' else option data, e.g., $_REQUEST
|
|
*
|
|
* @return string HTML table row markup for 'render' else message(s) reflecting the results of the operation.
|
|
*/
|
|
public static function mla_attachment_display_settings_option_handler( $action, $key, $value, $args = NULL ) {
|
|
switch ( $action ) {
|
|
case 'render':
|
|
$current_value = get_option( $key );
|
|
if ( empty( $current_value ) ) {
|
|
$current_value = $value['std'];
|
|
}
|
|
|
|
$select_options = '';
|
|
foreach ( $value['options'] as $optid => $option ) {
|
|
$option_values = array(
|
|
'selected' => '',
|
|
'value' => $option,
|
|
'text' => $value['texts'][$optid]
|
|
);
|
|
|
|
if ( $option == $current_value ) {
|
|
$option_values['selected'] = 'selected="selected"';
|
|
}
|
|
|
|
$select_options .= MLAData::mla_parse_template( MLASettings::$page_template_array['select-option'], $option_values );
|
|
}
|
|
|
|
$option_values = array(
|
|
'key' => MLA_OPTION_PREFIX . $key,
|
|
'value' => esc_attr( $value['name'] ),
|
|
'options' => $select_options,
|
|
'help' => $value['help']
|
|
);
|
|
|
|
return MLAData::mla_parse_template( MLASettings::$page_template_array['select'], $option_values );
|
|
case 'update':
|
|
case 'delete':
|
|
$msg = '<br>update_option(' . $key . ")\r\n";
|
|
$new_value = $args[ MLA_OPTION_PREFIX . $key ];
|
|
if ( $value['std'] == $new_value ) {
|
|
$new_value = '';
|
|
}
|
|
|
|
update_option( $key, $new_value );
|
|
return $msg;
|
|
case 'reset':
|
|
$msg = '<br>update_option(' . $key . ")\r\n";
|
|
update_option( $key, '' );
|
|
return $msg;
|
|
default:
|
|
/* translators: 1: ERROR tag 2: option name 3: action, e.g., update, delete, reset */
|
|
return '<br>' . sprintf( __( '%1$s: Custom %2$s unknown action "%3$s"', 'media-library-assistant' ), __( 'ERROR', 'media-library-assistant' ), $key, $action ) . "\r\n";
|
|
}
|
|
} // mla_attachment_display_settings_option_handler
|
|
|
|
/**
|
|
* Render and manage taxonomy support options, e.g., Categories and Post Tags
|
|
*
|
|
* @since 0.30
|
|
* @uses $mla_option_templates contains taxonomy-row and taxonomy-table templates
|
|
*
|
|
* @param string 'render', 'update', 'delete', or 'reset'
|
|
* @param string option name, e.g., 'tax_support', or 'tax_flat_checklist'
|
|
* @param array option parameters
|
|
* @param array Optional. null (default) for 'render' else option data, e.g., $_REQUEST
|
|
*
|
|
* @return string HTML table row markup for 'render' else message(s) reflecting the results of the operation.
|
|
*/
|
|
public static function mla_taxonomy_option_handler( $action, $key, $value, $args = NULL ) {
|
|
MLAOptions::_load_option_templates();
|
|
|
|
switch ( $action ) {
|
|
case 'render':
|
|
$taxonomies = get_taxonomies( array ( 'show_ui' => true ), 'objects' );
|
|
$current_values = MLACore::mla_get_option( $key );
|
|
$tax_support = isset( $current_values['tax_support'] ) ? $current_values['tax_support'] : MLACoreOptions::$mla_option_definitions[ MLACoreOptions::MLA_TAXONOMY_SUPPORT ]['std']['tax_support'];
|
|
$tax_quick_edit = isset( $current_values['tax_quick_edit'] ) ? $current_values['tax_quick_edit'] : MLACoreOptions::$mla_option_definitions[ MLACoreOptions::MLA_TAXONOMY_SUPPORT ]['std']['tax_quick_edit'];
|
|
$tax_term_search = isset( $current_values['tax_term_search'] ) ? $current_values['tax_term_search'] : MLACoreOptions::$mla_option_definitions[ MLACoreOptions::MLA_TAXONOMY_SUPPORT ]['std']['tax_term_search'];
|
|
$tax_flat_checklist = isset( $current_values['tax_flat_checklist'] ) ? $current_values['tax_flat_checklist'] : MLACoreOptions::$mla_option_definitions[ MLACoreOptions::MLA_TAXONOMY_SUPPORT ]['std']['tax_flat_checklist'];
|
|
$tax_checked_on_top = isset( $current_values['tax_checked_on_top'] ) ? $current_values['tax_checked_on_top'] : MLACoreOptions::$mla_option_definitions[ MLACoreOptions::MLA_TAXONOMY_SUPPORT ]['std']['tax_checked_on_top'];
|
|
$tax_checklist_add_term = isset( $current_values['tax_checklist_add_term'] ) ? $current_values['tax_checklist_add_term'] : MLACoreOptions::$mla_option_definitions[ MLACoreOptions::MLA_TAXONOMY_SUPPORT ]['std']['tax_checklist_add_term'];
|
|
$tax_filter = isset( $current_values['tax_filter'] ) ? $current_values['tax_filter'] : MLACoreOptions::$mla_option_definitions[ MLACoreOptions::MLA_TAXONOMY_SUPPORT ]['std']['tax_filter'];
|
|
$tax_metakey_sort = isset( $current_values['tax_metakey_sort'] ) ? $current_values['tax_metakey_sort'] : MLACoreOptions::$mla_option_definitions[ MLACoreOptions::MLA_TAXONOMY_SUPPORT ]['std']['tax_metakey_sort'];
|
|
$tax_metakey = isset( $current_values['tax_metakey'] ) ? $current_values['tax_metakey'] : MLACoreOptions::$mla_option_definitions[ MLACoreOptions::MLA_TAXONOMY_SUPPORT ]['std']['tax_metakey'];
|
|
|
|
/*
|
|
* Always display our own taxonomies, even if not registered.
|
|
* Otherwise there's no way to turn them back on.
|
|
*/
|
|
if ( ! array_key_exists( 'attachment_category', $taxonomies ) ) {
|
|
$taxonomies['attachment_category'] = (object) array( 'labels' => (object) array( 'name' => __( 'Attachment Categories', 'media-library-assistant' ) ), 'hierarchical' => true );
|
|
if ( isset( $tax_support['attachment_category'] ) ) {
|
|
unset( $tax_support['attachment_category'] );
|
|
}
|
|
|
|
if ( isset( $tax_quick_edit['attachment_category'] ) ) {
|
|
unset( $tax_quick_edit['attachment_category'] );
|
|
}
|
|
|
|
if ( $tax_filter == 'attachment_category' ) {
|
|
$tax_filter = '';
|
|
}
|
|
}
|
|
|
|
if ( ! array_key_exists( 'attachment_tag', $taxonomies ) ) {
|
|
$taxonomies['attachment_tag'] = (object) array( 'labels' => (object) array( 'name' => __( 'Attachment Tags', 'media-library-assistant' ) ), 'hierarchical' => false );
|
|
|
|
if ( isset( $tax_support['attachment_tag'] ) ) {
|
|
unset( $tax_support['attachment_tag'] );
|
|
}
|
|
|
|
if ( isset( $tax_quick_edit['attachment_tag'] ) ) {
|
|
unset( $tax_quick_edit['attachment_tag'] );
|
|
}
|
|
|
|
if ( $tax_filter == 'attachment_tag' ) {
|
|
$tax_filter = '';
|
|
}
|
|
}
|
|
|
|
$taxonomy_row = MLAOptions::$mla_option_templates['taxonomy-row'];
|
|
$row = '';
|
|
|
|
foreach ( $taxonomies as $tax_name => $tax_object ) {
|
|
$option_values = array (
|
|
'key' => $tax_name,
|
|
'name' => $tax_object->labels->name,
|
|
'support_checked' => array_key_exists( $tax_name, $tax_support ) ? 'checked=checked' : '',
|
|
'quick_edit_checked' => array_key_exists( $tax_name, $tax_quick_edit ) ? 'checked=checked' : '',
|
|
'term_search_checked' => array_key_exists( $tax_name, $tax_term_search ) ? 'checked=checked' : '',
|
|
'flat_checklist_checked' => array_key_exists( $tax_name, $tax_flat_checklist ) ? 'checked=checked' : '',
|
|
'flat_checklist_disabled' => '',
|
|
'flat_checklist_value' => 'checked',
|
|
'checked_on_top_checked' => array_key_exists( $tax_name, $tax_checked_on_top ) ? 'checked=checked' : '',
|
|
'checklist_add_term_checked' => array_key_exists( $tax_name, $tax_checklist_add_term ) ? 'checked=checked' : '',
|
|
'filter_checked' => ( $tax_name == $tax_filter ) ? 'checked=checked' : ''
|
|
);
|
|
|
|
if ( $tax_object->hierarchical ) {
|
|
$option_values['flat_checklist_checked'] = 'checked=checked';
|
|
$option_values['flat_checklist_disabled'] = 'disabled=disabled';
|
|
$option_values['flat_checklist_value'] = 'disabled';
|
|
}
|
|
|
|
$row .= MLAData::mla_parse_template( $taxonomy_row, $option_values );
|
|
}
|
|
|
|
// Add the "filter on custom field" row
|
|
$selected = empty( $tax_metakey ) ? 'none' : $tax_metakey;
|
|
$tax_metakey_options = MLAOptions::mla_compose_custom_field_option_list( $selected, array() );
|
|
|
|
$option_values = array (
|
|
'key' => MLACoreOptions::MLA_FILTER_METAKEY,
|
|
'name' => '( ' . __( 'Custom Field', 'media-library-assistant' ) . ' )',
|
|
'asc_checked' => ( 'ASC' == $tax_metakey_sort ) ? 'checked=checked' : '',
|
|
'desc_checked' => ( 'DESC' == $tax_metakey_sort ) ? 'checked=checked' : '',
|
|
'tax_metakey_options' => $tax_metakey_options,
|
|
'tax_metakey_size' => '20',
|
|
'tax_metakey_text' => $tax_metakey,
|
|
'filter_checked' => ( MLACoreOptions::MLA_FILTER_METAKEY == $tax_filter ) ? 'checked=checked' : ''
|
|
);
|
|
|
|
$row .= MLAData::mla_parse_template( MLAOptions::$mla_option_templates['taxonomy-metakey-row'], $option_values );
|
|
|
|
$option_values = array (
|
|
'Support' => __( 'Support', 'media-library-assistant' ),
|
|
'Inline Edit' => __( 'Inline Edit', 'media-library-assistant' ),
|
|
'Term Search' => __( 'Term Search', 'media-library-assistant' ),
|
|
'Checklist' => __( 'Checklist', 'media-library-assistant' ),
|
|
'Checked On Top' => __( 'Checked On Top', 'media-library-assistant' ),
|
|
'Inline Add Term' => __( 'Inline Add Term', 'media-library-assistant' ),
|
|
'List Filter' => __( 'List Filter', 'media-library-assistant' ),
|
|
'Taxonomy' => __( 'Taxonomy', 'media-library-assistant' ),
|
|
'taxonomy_rows' => $row,
|
|
'help' => $value['help']
|
|
);
|
|
|
|
return MLAData::mla_parse_template( MLAOptions::$mla_option_templates['taxonomy-table'], $option_values );
|
|
case 'update':
|
|
case 'delete':
|
|
$tax_support = isset( $args['tax_support'] ) ? $args['tax_support'] : MLACoreOptions::$mla_option_definitions[ MLACoreOptions::MLA_TAXONOMY_SUPPORT ]['std']['tax_support'];
|
|
$tax_quick_edit = isset( $args['tax_quick_edit'] ) ? $args['tax_quick_edit'] : MLACoreOptions::$mla_option_definitions[ MLACoreOptions::MLA_TAXONOMY_SUPPORT ]['std']['tax_quick_edit'];
|
|
$tax_term_search = isset( $args['tax_term_search'] ) ? $args['tax_term_search'] : MLACoreOptions::$mla_option_definitions[ MLACoreOptions::MLA_TAXONOMY_SUPPORT ]['std']['tax_term_search'];
|
|
$tax_flat_checklist = isset( $args['tax_flat_checklist'] ) ? $args['tax_flat_checklist'] : MLACoreOptions::$mla_option_definitions[ MLACoreOptions::MLA_TAXONOMY_SUPPORT ]['std']['tax_flat_checklist'];
|
|
$tax_checked_on_top = isset( $args['tax_checked_on_top'] ) ? $args['tax_checked_on_top'] : MLACoreOptions::$mla_option_definitions[ MLACoreOptions::MLA_TAXONOMY_SUPPORT ]['std']['tax_checked_on_top'];
|
|
$tax_checklist_add_term = isset( $args['tax_checklist_add_term'] ) ? $args['tax_checklist_add_term'] : MLACoreOptions::$mla_option_definitions[ MLACoreOptions::MLA_TAXONOMY_SUPPORT ]['std']['tax_checklist_add_term'];
|
|
$tax_filter = isset( $args['tax_filter'] ) ? $args['tax_filter'] : MLACoreOptions::$mla_option_definitions[ MLACoreOptions::MLA_TAXONOMY_SUPPORT ]['std']['tax_filter'];
|
|
$tax_metakey_sort = isset( $args['tax_metakey_sort'] ) ? $args['tax_metakey_sort'] : MLACoreOptions::$mla_option_definitions[ MLACoreOptions::MLA_TAXONOMY_SUPPORT ]['std']['tax_metakey_sort'];
|
|
$tax_metakey = isset( $args['tax_metakey'] ) ? stripslashes( $args['tax_metakey'] ) : MLACoreOptions::$mla_option_definitions[ MLACoreOptions::MLA_TAXONOMY_SUPPORT ]['std']['tax_metakey'];
|
|
|
|
$msg = '';
|
|
|
|
if ( !empty($tax_filter) && ! ( array_key_exists( $tax_filter, $tax_support ) || ( MLACoreOptions::MLA_FILTER_METAKEY == $tax_filter ) ) ) {
|
|
/* translators: 1: taxonomy name */
|
|
$msg .= '<br>' . sprintf( __( 'List Filter ignored; %1$s not supported.', 'media-library-assistant' ), $tax_filter ) . "\r\n";
|
|
$tax_filter = '';
|
|
}
|
|
|
|
foreach ( $tax_quick_edit as $tax_name => $tax_value ) {
|
|
if ( !array_key_exists( $tax_name, $tax_support ) ) {
|
|
/* translators: 1: taxonomy name */
|
|
$msg .= '<br>' . sprintf( __( 'Inline Edit ignored; %1$s not supported.', 'media-library-assistant' ), $tax_name ) . "\r\n";
|
|
unset( $tax_quick_edit[ $tax_name ] );
|
|
}
|
|
}
|
|
|
|
foreach ( $tax_term_search as $tax_name => $tax_value ) {
|
|
if ( !array_key_exists( $tax_name, $tax_support ) ) {
|
|
/* translators: 1: taxonomy name */
|
|
$msg .= '<br>' . sprintf( __( 'Term Search ignored; %1$s not supported.', 'media-library-assistant' ), $tax_name ) . "\r\n";
|
|
unset( $tax_term_search[ $tax_name ] );
|
|
}
|
|
}
|
|
|
|
foreach ( $tax_flat_checklist as $tax_name => $tax_value ) {
|
|
if ( 'disabled' == $tax_value ) {
|
|
unset( $tax_flat_checklist[ $tax_name ] );
|
|
} elseif ( !array_key_exists( $tax_name, $tax_support ) ) {
|
|
/* translators: 1: taxonomy name */
|
|
$msg .= '<br>' . sprintf( __( 'Checklist ignored; %1$s not supported.', 'media-library-assistant' ), $tax_name ) . "\r\n";
|
|
unset( $tax_flat_checklist[ $tax_name ] );
|
|
}
|
|
}
|
|
|
|
foreach ( $tax_checked_on_top as $tax_name => $tax_value ) {
|
|
if ( !array_key_exists( $tax_name, $tax_support ) ) {
|
|
/* translators: 1: taxonomy name */
|
|
$msg .= '<br>' . sprintf( __( 'Checked On Top ignored; %1$s not supported.', 'media-library-assistant' ), $tax_name ) . "\r\n";
|
|
unset( $tax_checked_on_top[ $tax_name ] );
|
|
}
|
|
}
|
|
|
|
|
|
foreach ( $tax_checklist_add_term as $tax_name => $tax_value ) {
|
|
if ( !array_key_exists( $tax_name, $tax_support ) ) {
|
|
/* translators: 1: taxonomy name */
|
|
$msg .= '<br>' . sprintf( __( 'Inline Add Term ignored; %1$s not supported.', 'media-library-assistant' ), $tax_name ) . "\r\n";
|
|
unset( $tax_checklist_add_term[ $tax_name ] );
|
|
}
|
|
}
|
|
|
|
$value = array (
|
|
'tax_support' => $tax_support,
|
|
'tax_quick_edit' => $tax_quick_edit,
|
|
'tax_term_search' => $tax_term_search,
|
|
'tax_flat_checklist' => $tax_flat_checklist,
|
|
'tax_checked_on_top' => $tax_checked_on_top,
|
|
'tax_checklist_add_term' => $tax_checklist_add_term,
|
|
'tax_filter' => $tax_filter,
|
|
'tax_metakey_sort' => $tax_metakey_sort,
|
|
'tax_metakey' => $tax_metakey,
|
|
);
|
|
|
|
MLACore::mla_update_option( $key, $value );
|
|
|
|
if ( empty( $msg ) ) {
|
|
/* translators: 1: option name, e.g., taxonomy_support */
|
|
$msg .= '<br>' . sprintf( __( 'Update custom %1$s', 'media-library-assistant' ), $key ) . "\r\n";
|
|
}
|
|
|
|
return $msg;
|
|
case 'reset':
|
|
MLACore::mla_delete_option( $key );
|
|
/* translators: 1: option name, e.g., taxonomy_support */
|
|
return '<br>' . sprintf( __( 'Reset custom %1$s', 'media-library-assistant' ), $key ) . "\r\n";
|
|
default:
|
|
/* translators: 1: ERROR tag 2: option name 3: action, e.g., update, delete, reset */
|
|
return '<br>' . sprintf( __( '%1$s: Custom %2$s unknown action "%3$s"', 'media-library-assistant' ), __( 'ERROR', 'media-library-assistant' ), $key, $action ) . "\r\n";
|
|
}
|
|
} // mla_taxonomy_option_handler
|
|
|
|
/**
|
|
* Render and manage Search box options, e.g., connector and search fields
|
|
*
|
|
* @since 1.90
|
|
* @uses $mla_option_templates contains search-table template
|
|
*
|
|
* @param string 'render', 'update', 'delete', or 'reset'
|
|
* @param string option name; 'search_connector' or 'search_fields'
|
|
* @param array option parameters
|
|
* @param array Optional. null (default) for 'render' else option data, e.g., $_REQUEST
|
|
*
|
|
* @return string HTML table row markup for 'render' else message(s) reflecting the results of the operation.
|
|
*/
|
|
public static function mla_search_option_handler( $action, $key, $value, $args = NULL ) {
|
|
MLAOptions::_load_option_templates();
|
|
|
|
switch ( $action ) {
|
|
case 'render':
|
|
$current_values = MLACore::mla_get_option( $key );
|
|
$search_connector = isset( $current_values['search_connector'] ) ? $current_values['search_connector'] : MLACoreOptions::$mla_option_definitions[ MLACoreOptions::MLA_SEARCH_MEDIA_FILTER_DEFAULTS ]['std']['search_connector'];
|
|
$search_fields = isset( $current_values['search_fields'] ) ? $current_values['search_fields'] : MLACoreOptions::$mla_option_definitions[ MLACoreOptions::MLA_SEARCH_MEDIA_FILTER_DEFAULTS ]['std']['search_fields'];
|
|
|
|
$option_values = array (
|
|
'and_checked' => ( 'AND' == $search_connector ) ? 'checked="checked"' : '',
|
|
'AND' => __( 'and', 'media-library-assistant' ),
|
|
'or_checked' => ( 'OR' == $search_connector ) ? 'checked="checked"' : '',
|
|
'OR' => __( 'or', 'media-library-assistant' ),
|
|
'title_checked' => ( in_array( 'title', $search_fields ) ) ? 'checked="checked"' : '',
|
|
'Title' => __( 'Title', 'media-library-assistant' ),
|
|
|
|
'name_checked' => ( in_array( 'name', $search_fields ) ) ? 'checked="checked"' : '',
|
|
'Name' => __( 'Name', 'media-library-assistant' ),
|
|
|
|
'alt_text_checked' => ( in_array( 'alt-text', $search_fields ) ) ? 'checked="checked"' : '',
|
|
'ALT Text' => __( 'ALT Text', 'media-library-assistant' ),
|
|
|
|
'excerpt_checked' => ( in_array( 'excerpt', $search_fields ) ) ? 'checked="checked"' : '',
|
|
'Caption' => __( 'Caption', 'media-library-assistant' ),
|
|
|
|
'content_checked' => ( in_array( 'content', $search_fields ) ) ? 'checked="checked"' : '',
|
|
'Description' => __( 'Description', 'media-library-assistant' ),
|
|
|
|
'file_checked' => ( in_array( 'file', $search_fields ) ) ? 'checked="checked"' : '',
|
|
'File' => __( 'File', 'media-library-assistant' ),
|
|
|
|
'terms_checked' => ( in_array( 'terms', $search_fields ) ) ? 'checked="checked"' : '',
|
|
'Terms' => __( 'Terms', 'media-library-assistant' ),
|
|
'help' => MLACoreOptions::$mla_option_definitions[ MLACoreOptions::MLA_SEARCH_MEDIA_FILTER_DEFAULTS ]['help']
|
|
);
|
|
|
|
return MLAData::mla_parse_template( MLAOptions::$mla_option_templates['search-table'], $option_values );
|
|
case 'update':
|
|
case 'delete':
|
|
$search_connector = isset( $args['search_connector'] ) ? $args['search_connector'] : MLACoreOptions::$mla_option_definitions[ MLACoreOptions::MLA_SEARCH_MEDIA_FILTER_DEFAULTS ]['std']['search_connector'];
|
|
$search_fields = isset( $args['search_fields'] ) ? $args['search_fields'] : MLACoreOptions::$mla_option_definitions[ MLACoreOptions::MLA_SEARCH_MEDIA_FILTER_DEFAULTS ]['std']['search_fields'];
|
|
|
|
$msg = '';
|
|
|
|
$value = array (
|
|
'search_connector' => $search_connector,
|
|
'search_fields' => $search_fields,
|
|
);
|
|
|
|
MLACore::mla_update_option( $key, $value );
|
|
|
|
if ( empty( $msg ) ) {
|
|
/* translators: 1: option name, e.g., taxonomy_support */
|
|
$msg .= '<br>' . sprintf( __( 'Update custom %1$s', 'media-library-assistant' ), $key ) . "\r\n";
|
|
}
|
|
|
|
return $msg;
|
|
case 'reset':
|
|
MLACore::mla_delete_option( $key );
|
|
/* translators: 1: option name, e.g., taxonomy_support */
|
|
return '<br>' . sprintf( __( 'Reset custom %1$s', 'media-library-assistant' ), $key ) . "\r\n";
|
|
default:
|
|
/* translators: 1: ERROR tag 2: option name 3: action, e.g., update, delete, reset */
|
|
return '<br>' . sprintf( __( '%1$s: Custom %2$s unknown action "%3$s"', 'media-library-assistant' ), __( 'ERROR', 'media-library-assistant' ), $key, $action ) . "\r\n";
|
|
}
|
|
} // mla_search_option_handler
|
|
|
|
/**
|
|
* Render and manage Entries per page screen option for Media/Assistant admin submenu table
|
|
*
|
|
* @since 2.71
|
|
*
|
|
* @param string 'render', 'update', 'delete', or 'reset'
|
|
* @param string option name; 'mla_entries_per_page'
|
|
* @param array option parameters
|
|
* @param array Optional. null (default) for 'render' else option data, e.g., $_REQUEST
|
|
*
|
|
* @return string HTML table row markup for 'render' else message(s) reflecting the results of the operation.
|
|
*/
|
|
public static function mla_entries_per_page_handler( $action, $key, $value, $args = NULL ) {
|
|
MLAOptions::_load_option_templates();
|
|
|
|
$key = MLA_OPTION_PREFIX . $key;
|
|
|
|
switch ( $action ) {
|
|
case 'render':
|
|
$current_value = get_user_option( $key );
|
|
|
|
if ( empty( $current_value ) ) {
|
|
$current_value = get_option( 'posts_per_page', $value['std'] );
|
|
}
|
|
|
|
$option_values = array(
|
|
'key' => $key,
|
|
'value' => $value['name'],
|
|
'help' => $value['help'],
|
|
'size' => $value['size'],
|
|
'text' => $current_value,
|
|
);
|
|
|
|
return MLAData::mla_parse_template( MLAOptions::$mla_option_templates['text'], $option_values );
|
|
case 'update':
|
|
$user_id = get_current_user_id();
|
|
$new_value = isset( $args[ $key ] ) ? $args[ $key ] : get_option( 'posts_per_page', $value['std'] );
|
|
|
|
$result = update_user_option( $user_id, $key, $new_value, true );
|
|
|
|
/* translators: 1: option name, e.g., taxonomy_support */
|
|
return '<br>' . sprintf( __( 'Update custom %1$s', 'media-library-assistant' ), $key ) . "\r\n";
|
|
case 'delete':
|
|
case 'reset':
|
|
$user_id = get_current_user_id();
|
|
delete_user_option( $user_id, $key, true );
|
|
|
|
/* translators: 1: option name, e.g., taxonomy_support */
|
|
return '<br>' . sprintf( __( 'Reset custom %1$s', 'media-library-assistant' ), $key ) . "\r\n";
|
|
default:
|
|
/* translators: 1: ERROR tag 2: option name 3: action, e.g., update, delete, reset */
|
|
return '<br>' . sprintf( __( '%1$s: Custom %2$s unknown action "%3$s"', 'media-library-assistant' ), __( 'ERROR', 'media-library-assistant' ), $key, $action ) . "\r\n";
|
|
}
|
|
} // mla_entries_per_page_handler
|
|
|
|
/**
|
|
* Examine or alter the filename before the file is made permanent
|
|
*
|
|
* The filter is applied by function _wp_handle_upload() in /wp-admin/includes/file.php
|
|
*
|
|
* @since 1.70
|
|
*
|
|
* @param array file parameters ( 'name' )
|
|
*
|
|
* @return array updated file parameters
|
|
*/
|
|
public static function mla_wp_handle_upload_prefilter_filter( $file ) {
|
|
/*
|
|
* This filter requires file access and processing, so only do the work
|
|
* if someone has hooked it.
|
|
*/
|
|
if ( has_filter( 'mla_upload_prefilter' ) ) {
|
|
// The image.php file is not loaded for "front end" uploads
|
|
if ( !function_exists( 'wp_read_image_metadata' ) ) {
|
|
require_once( ABSPATH . 'wp-admin/includes/image.php' );
|
|
}
|
|
|
|
$image_metadata = MLAData::mla_fetch_attachment_image_metadata( 0, $file['tmp_name'] );
|
|
$image_metadata['mla_exif_metadata']['FileName'] = $file['name'];
|
|
$image_metadata['wp_image_metadata'] = wp_read_image_metadata( $file['tmp_name'] );
|
|
$file = apply_filters( 'mla_upload_prefilter', $file, $image_metadata );
|
|
}
|
|
|
|
return $file;
|
|
} // mla_wp_handle_upload_prefilter_filter
|
|
|
|
/**
|
|
* Called once for each file uploaded
|
|
*
|
|
* The filter is applied by function _wp_handle_upload() in /wp-admin/includes/file.php
|
|
*
|
|
* @since 1.70
|
|
*
|
|
* @param array file parameters ( 'name' )
|
|
*
|
|
* @return array updated file parameters
|
|
*/
|
|
public static function mla_wp_handle_upload_filter( $file ) {
|
|
/*
|
|
* This filter requires file access and processing, so only do the work
|
|
* if someone has hooked it.
|
|
*/
|
|
if ( has_filter( 'mla_upload_filter' ) ) {
|
|
// The getid3.php file is not loaded for "front end" uploads
|
|
if ( ! class_exists( 'getID3' ) ) {
|
|
require( ABSPATH . WPINC . '/ID3/getid3.php' );
|
|
}
|
|
|
|
$id3 = new getID3();
|
|
$id3_data = $id3->analyze( $file['file'] );
|
|
$file = apply_filters( 'mla_upload_filter', $file, $id3_data );
|
|
}
|
|
|
|
return $file;
|
|
} // mla_wp_handle_upload_filter
|
|
|
|
/**
|
|
* Attachment ID passed from mla_add_attachment_action to mla_update_attachment_metadata_filter
|
|
*
|
|
* Ensures that IPTC/EXIF and Custom Field mapping is only performed when the attachment is first
|
|
* added to the Media Library.
|
|
*
|
|
* @since 1.70
|
|
*
|
|
* @var integer
|
|
*/
|
|
private static $add_attachment_id = 0;
|
|
|
|
/**
|
|
* Set $add_attachment_id to just-inserted attachment
|
|
*
|
|
* All of the actual processing is done later, in mla_update_attachment_metadata_filter.
|
|
*
|
|
* The filter is applied by function wp_insert_post() in /wp-includes/post.php
|
|
*
|
|
* @since 1.00
|
|
*
|
|
* @param integer ID of just-inserted attachment
|
|
*
|
|
* @return void
|
|
*/
|
|
public static function mla_add_attachment_action( $post_ID ) {
|
|
MLACore::mla_debug_add( __LINE__ . " MLAOptions::mla_add_attachment_action( $post_ID )", MLACore::MLA_DEBUG_CATEGORY_METADATA );
|
|
MLAOptions::$add_attachment_id = $post_ID;
|
|
do_action('mla_add_attachment', $post_ID);
|
|
} // mla_add_attachment_action
|
|
|
|
/**
|
|
* Update _wp_attachment_metadata for just-inserted attachment
|
|
*
|
|
* @since 1.70
|
|
*
|
|
* @param array Attachment metadata updates
|
|
* @param array Attachment metadata, by reference; updated by this function
|
|
*
|
|
* @return array Attachment metadata updates, with "meta:" elements removed
|
|
*/
|
|
private static function _update_attachment_metadata( $updates, &$data ) {
|
|
if ( is_array( $updates ) and isset( $updates['custom_updates'] ) ) {
|
|
$attachment_meta_values = array();
|
|
foreach ( $updates['custom_updates'] as $key => $value ) {
|
|
if ( 'meta:' == substr( $key, 0, 5 ) ) {
|
|
$meta_key = substr( $key, 5 );
|
|
$attachment_meta_values[ $meta_key ] = $value;
|
|
unset( $updates['custom_updates'][ $key ] );
|
|
}
|
|
} // foreach $updates
|
|
|
|
if ( empty( $updates['custom_updates'] ) ) {
|
|
unset( $updates['custom_updates'] );
|
|
}
|
|
|
|
if ( ! empty( $attachment_meta_values ) ) {
|
|
$results = MLAData::mla_update_wp_attachment_metadata( $data, $attachment_meta_values );
|
|
}
|
|
} // custom_updates
|
|
|
|
return $updates;
|
|
} // _update_attachment_metadata
|
|
|
|
/**
|
|
* Perform IPTC/EXIF and Custom Field mapping on just-inserted attachment
|
|
*
|
|
* This filter tests the $add_attachment_id variable set by the mla_add_attachment_action
|
|
* to ensure that mapping is only performed for new additions, not metadata updates.
|
|
*
|
|
* The filter is applied by function wp_update_attachment_metadata() in /wp-includes/post.php
|
|
*
|
|
* @since 1.10
|
|
*
|
|
* @param array Attachment metadata for just-inserted attachment
|
|
* @param integer ID of just-inserted attachment
|
|
*
|
|
* @return array Updated attachment metadata
|
|
*/
|
|
public static function mla_update_attachment_metadata_filter( $data, $post_id ) {
|
|
$options = array ();
|
|
$options['is_upload'] = MLAOptions::$add_attachment_id == $post_id;
|
|
MLAOptions::$add_attachment_id = 0;
|
|
|
|
$options['enable_iptc_exif_mapping'] = 'checked' == MLACore::mla_get_option( 'enable_iptc_exif_mapping' );
|
|
$options['enable_custom_field_mapping'] = 'checked' == MLACore::mla_get_option( 'enable_custom_field_mapping' );
|
|
$options['enable_iptc_exif_update'] = 'checked' == MLACore::mla_get_option( 'enable_iptc_exif_update' );
|
|
$options['enable_custom_field_update'] = 'checked' == MLACore::mla_get_option( 'enable_custom_field_update' );
|
|
|
|
$options = apply_filters( 'mla_update_attachment_metadata_options', $options, $data, $post_id );
|
|
$data = apply_filters( 'mla_update_attachment_metadata_prefilter', $data, $post_id, $options );
|
|
MLACore::mla_debug_add( __LINE__ . " MLAOptions::mla_update_attachment_metadata_filter( $post_id ) \$data = " . var_export( $data, true ), MLACore::MLA_DEBUG_CATEGORY_METADATA );
|
|
MLACore::mla_debug_add( __LINE__ . " MLAOptions::mla_update_attachment_metadata_filter( $post_id ) \$options = " . var_export( $options, true ), MLACore::MLA_DEBUG_CATEGORY_METADATA );
|
|
|
|
if ( $options['is_upload'] ) {
|
|
if ( $options['enable_iptc_exif_mapping'] || $options['enable_custom_field_mapping'] ) {
|
|
do_action( 'mla_begin_mapping', 'create_metadata', $post_id );
|
|
}
|
|
|
|
if ( $options['enable_iptc_exif_mapping'] ) {
|
|
$item = get_post( $post_id );
|
|
$updates = MLAOptions::mla_evaluate_iptc_exif_mapping( $item, 'iptc_exif_mapping', NULL, $data, true );
|
|
MLACore::mla_debug_add( __LINE__ . " MLAOptions::mla_update_attachment_metadata_filter( $post_id ) \$updates = " . var_export( $updates, true ), MLACore::MLA_DEBUG_CATEGORY_METADATA );
|
|
$updates = MLAOptions::_update_attachment_metadata( $updates, $data );
|
|
MLACore::mla_debug_add( __LINE__ . " MLAOptions::mla_update_attachment_metadata_filter( $post_id ) \$updates = " . var_export( $updates, true ), MLACore::MLA_DEBUG_CATEGORY_METADATA );
|
|
|
|
if ( !empty( $updates ) ) {
|
|
$item_content = MLAData::mla_update_single_item( $post_id, $updates );
|
|
MLACore::mla_debug_add( __LINE__ . " MLAOptions::mla_update_attachment_metadata_filter( $post_id ) \$item_content = " . var_export( $item_content, true ), MLACore::MLA_DEBUG_CATEGORY_METADATA );
|
|
}
|
|
}
|
|
|
|
if ( $options['enable_custom_field_mapping'] ) {
|
|
$updates = MLAOptions::mla_evaluate_custom_field_mapping( $post_id, 'single_attachment_mapping', NULL, $data );
|
|
$updates = MLAOptions::_update_attachment_metadata( $updates, $data );
|
|
|
|
if ( !empty( $updates ) ) {
|
|
$item_content = MLAData::mla_update_single_item( $post_id, $updates );
|
|
}
|
|
}
|
|
|
|
if ( $options['enable_iptc_exif_mapping'] || $options['enable_custom_field_mapping'] ) {
|
|
do_action( 'mla_end_mapping' );
|
|
}
|
|
} else {
|
|
if ( $options['enable_iptc_exif_update'] || $options['enable_custom_field_update'] ) {
|
|
do_action( 'mla_begin_mapping', 'update_metadata', $post_id );
|
|
}
|
|
|
|
if ( $options['enable_iptc_exif_update'] ) {
|
|
$item = get_post( $post_id );
|
|
$updates = MLAOptions::mla_evaluate_iptc_exif_mapping( $item, 'iptc_exif_mapping', NULL, $data );
|
|
$updates = MLAOptions::_update_attachment_metadata( $updates, $data );
|
|
|
|
if ( !empty( $updates ) ) {
|
|
$item_content = MLAData::mla_update_single_item( $post_id, $updates );
|
|
}
|
|
}
|
|
|
|
if ( $options['enable_custom_field_update'] ) {
|
|
$updates = MLAOptions::mla_evaluate_custom_field_mapping( $post_id, 'single_attachment_mapping', NULL, $data );
|
|
$updates = MLAOptions::_update_attachment_metadata( $updates, $data );
|
|
|
|
if ( !empty( $updates ) ) {
|
|
$item_content = MLAData::mla_update_single_item( $post_id, $updates );
|
|
}
|
|
}
|
|
|
|
if ( $options['enable_iptc_exif_update'] || $options['enable_custom_field_update'] ) {
|
|
do_action( 'mla_end_mapping' );
|
|
}
|
|
}
|
|
|
|
$data = apply_filters( 'mla_update_attachment_metadata_postfilter', $data, $post_id, $options );
|
|
return $data;
|
|
} // mla_update_attachment_metadata_filter
|
|
|
|
/**
|
|
* Get IPTC/EXIF or custom field mapping data source; WP_ADMIN mode
|
|
*
|
|
* Compatibility shim for MLAData_Source::mla_get_data_source.
|
|
*
|
|
* @since 1.70
|
|
*
|
|
* @param integer post->ID of attachment
|
|
* @param string category/scope to evaluate against: custom_field_mapping or single_attachment_mapping
|
|
* @param array data source specification ( name, *data_source, *keep_existing, *format, mla_column, quick_edit, bulk_edit, *meta_name, *option, no_null )
|
|
* @param array (optional) _wp_attachment_metadata, default NULL (use current postmeta database value)
|
|
*
|
|
* @return string|array data source value
|
|
*/
|
|
public static function mla_get_data_source( $post_id, $category, $data_value, $attachment_metadata = NULL ) {
|
|
if ( !class_exists( 'MLAData_Source' ) ) {
|
|
require_once( MLA_PLUGIN_PATH . 'includes/class-mla-data-source.php' );
|
|
}
|
|
|
|
return MLAData_Source::mla_get_data_source( $post_id, $category, $data_value, $attachment_metadata );
|
|
} // mla_get_data_source
|
|
|
|
/**
|
|
* Identify custom field mapping data source; WP_ADMIN mode
|
|
*
|
|
* Compatibility shim for MLAData_Source::mla_is_data_source.
|
|
*
|
|
* @since 1.80
|
|
*
|
|
* @param string candidate data source name
|
|
*
|
|
* @return boolean true if candidate name matches a data source
|
|
*/
|
|
public static function mla_is_data_source( $candidate_name ) {
|
|
if ( !class_exists( 'MLAData_Source' ) ) {
|
|
require_once( MLA_PLUGIN_PATH . 'includes/class-mla-data-source.php' );
|
|
}
|
|
|
|
return MLAData_Source::mla_is_data_source( $candidate_name );
|
|
}
|
|
|
|
/**
|
|
* Evaluate custom field mapping updates for a post
|
|
*
|
|
* @since 1.10
|
|
*
|
|
* @param integer post ID to be evaluated
|
|
* @param string category/scope to evaluate against: custom_field_mapping or single_attachment_mapping
|
|
* @param array (optional) custom_field_mapping values, default NULL (use current option value)
|
|
* @param array (optional) attachment_metadata, default NULL (use current postmeta database value)
|
|
*
|
|
* @return array Updates suitable for MLAData::mla_update_single_item, if any
|
|
*/
|
|
public static function mla_evaluate_custom_field_mapping( $post_id, $category, $settings = NULL, $attachment_metadata = NULL ) {
|
|
if ( 'checked' != MLACore::mla_get_option( MLACoreOptions::MLA_ALLOW_CUSTOM_FIELD_MAPPING ) ) {
|
|
return array();
|
|
}
|
|
|
|
if ( NULL == $settings ) {
|
|
$settings = MLACore::mla_get_option( 'custom_field_mapping' );
|
|
}
|
|
|
|
$settings = apply_filters( 'mla_mapping_settings', $settings, $post_id, $category, $attachment_metadata );
|
|
|
|
$custom_updates = array();
|
|
foreach ( $settings as $setting_key => $setting_value ) {
|
|
/*
|
|
* Convert checkbox value(s)
|
|
*/
|
|
$setting_value['no_null'] = isset( $setting_value['no_null'] ) && ( false !== $setting_value['no_null'] );
|
|
|
|
$setting_value['key'] = $setting_key;
|
|
$setting_value = apply_filters( 'mla_mapping_rule', $setting_value, $post_id, $category, $attachment_metadata );
|
|
if ( NULL === $setting_value ) {
|
|
continue;
|
|
}
|
|
|
|
if ( ( 'none' == $setting_value['data_source'] ) || ( isset( $setting_value['active'] ) && false == $setting_value['active'] ) ) {
|
|
continue;
|
|
}
|
|
|
|
$new_text = MLAOptions::mla_get_data_source( $post_id, $category, $setting_value, $attachment_metadata );
|
|
$new_text = apply_filters( 'mla_mapping_custom_value', $new_text, $setting_key, $post_id, $category, $attachment_metadata );
|
|
|
|
if ( 'multi' == $setting_value['option'] ) {
|
|
if ( ' ' == $new_text ) {
|
|
$new_text = array(
|
|
0x80000000 => $setting_value['option'],
|
|
0x80000001 => $setting_value['keep_existing'],
|
|
0x80000002 => $setting_value['no_null']
|
|
);
|
|
|
|
if ( ! $setting_value['no_null'] ) {
|
|
$new_text [0x00000000] = ' ';
|
|
}
|
|
} elseif ( is_string( $new_text ) ) {
|
|
$new_text = array(
|
|
0x00000000 => $new_text,
|
|
0x80000000 => $setting_value['option'],
|
|
0x80000001 => $setting_value['keep_existing']
|
|
);
|
|
}
|
|
|
|
$custom_updates[ $setting_value['name'] ] = $new_text;
|
|
} else {
|
|
if ( $setting_value['keep_existing'] ) {
|
|
if ( 'meta:' == substr( $setting_value['name'], 0, 5 ) ) {
|
|
$meta_key = substr( $setting_value['name'], 5 );
|
|
|
|
if ( NULL === $attachment_metadata ) {
|
|
$attachment_metadata = maybe_unserialize( get_metadata( 'post', $post->ID, '_wp_attachment_metadata', true ) );
|
|
}
|
|
|
|
if ( array( $attachment_metadata ) ) {
|
|
$old_text = MLAData::mla_find_array_element( $meta_key, $attachment_metadata, 'array' );
|
|
} else {
|
|
$old_text = '';
|
|
}
|
|
} else { // } meta:
|
|
if ( is_string( $old_text = get_metadata( 'post', $post_id, $setting_value['name'], true ) ) ) {
|
|
$old_text = trim( $old_text );
|
|
}
|
|
}
|
|
|
|
if ( ( ' ' != $new_text ) && empty( $old_text ) ) {
|
|
$custom_updates[ $setting_value['name'] ] = $new_text;
|
|
}
|
|
} else { // } keep_existing
|
|
if ( ' ' == $new_text && $setting_value['no_null'] ) {
|
|
$new_text = NULL;
|
|
}
|
|
|
|
$custom_updates[ $setting_value['name'] ] = $new_text;
|
|
}
|
|
} // ! multi
|
|
} // foreach new setting
|
|
|
|
$updates = array();
|
|
if ( ! empty( $custom_updates ) ) {
|
|
$updates['custom_updates'] = $custom_updates;
|
|
}
|
|
|
|
$updates = apply_filters( 'mla_mapping_updates', $updates, $post_id, $category, $settings, $attachment_metadata );
|
|
return $updates;
|
|
} // mla_evaluate_custom_field_mapping
|
|
|
|
/**
|
|
* Compose a Custom Field Options list with current selection
|
|
*
|
|
* @since 1.10
|
|
* @uses $mla_option_templates contains row and table templates
|
|
*
|
|
* @param string current selection or 'none' (default)
|
|
* @param array optional list of terms to exclude from the list
|
|
*
|
|
* @return string HTML markup with select field options
|
|
*/
|
|
public static function mla_compose_custom_field_option_list( $selection = 'none', $blacklist = array() ) {
|
|
MLAOptions::_load_option_templates();
|
|
|
|
// Add the "None" option to the front of the list
|
|
$option_template = MLAOptions::$mla_option_templates['custom-field-select-option'];
|
|
$option_values = array (
|
|
'selected' => ( 'none' == $selection ) ? 'selected="selected"' : '',
|
|
'value' => 'none',
|
|
'text' => '— ' . __( 'None (select a value)', 'media-library-assistant' ) . ' —'
|
|
);
|
|
$custom_field_options = MLAData::mla_parse_template( $option_template, $option_values );
|
|
|
|
// Add an option for each name without a rule, i.e., not in the blacklist
|
|
$blacklist_names = array();
|
|
foreach ( $blacklist as $value ) {
|
|
$blacklist_names[] = $value['name'];
|
|
}
|
|
|
|
$custom_field_names = MLAOptions::_get_custom_field_names();
|
|
foreach ( $custom_field_names as $value ) {
|
|
if ( in_array( $value, $blacklist_names ) ) {
|
|
continue;
|
|
}
|
|
|
|
$option_values = array (
|
|
'selected' => ( $value == $selection ) ? 'selected="selected"' : '',
|
|
'value' => esc_attr( $value ),
|
|
'text' => esc_html( $value )
|
|
);
|
|
|
|
$custom_field_options .= MLAData::mla_parse_template( $option_template, $option_values );
|
|
} // foreach custom_field_name
|
|
|
|
return $custom_field_options;
|
|
} // mla_compose_custom_field_option_list
|
|
|
|
/**
|
|
* Compose a (Custom Field) Data Source Options list with current selection
|
|
*
|
|
* @since 1.10
|
|
* @uses $mla_option_templates contains row and table templates
|
|
*
|
|
* @param string current selection or 'none' (default)
|
|
*
|
|
* @return string HTML markup with select field options
|
|
*/
|
|
public static function mla_compose_data_source_option_list( $selection = 'none' ) {
|
|
MLAOptions::_load_option_templates();
|
|
|
|
$option_template = MLAOptions::$mla_option_templates['custom-field-select-option'];
|
|
|
|
$option_values = array (
|
|
'selected' => ( 'none' == $selection ) ? 'selected="selected"' : '',
|
|
'value' => 'none',
|
|
'text' => '— ' . __( 'None (select a value)', 'media-library-assistant' ) . ' —'
|
|
);
|
|
$custom_field_options = MLAData::mla_parse_template( $option_template, $option_values );
|
|
|
|
$option_values = array (
|
|
'selected' => ( 'meta' == $selection ) ? 'selected="selected"' : '',
|
|
'value' => 'meta',
|
|
'text' => '— ' . __( 'Metadata (see below)', 'media-library-assistant' ) . ' —'
|
|
);
|
|
$custom_field_options .= MLAData::mla_parse_template( $option_template, $option_values );
|
|
|
|
$option_values = array (
|
|
'selected' => ( 'template' == $selection ) ? 'selected="selected"' : '',
|
|
'value' => 'template',
|
|
'text' => '— ' . __( 'Template (see below)', 'media-library-assistant' ) . ' —'
|
|
);
|
|
$custom_field_options .= MLAData::mla_parse_template( $option_template, $option_values );
|
|
|
|
if ( !class_exists( 'MLAData_Source' ) ) {
|
|
require_once( MLA_PLUGIN_PATH . 'includes/class-mla-data-source.php' );
|
|
}
|
|
|
|
$intermediate_sizes = get_intermediate_image_sizes();
|
|
foreach ( MLAData_Source::$custom_field_data_sources as $value ) {
|
|
$size_pos = strpos( $value, '[size]' );
|
|
if ( $size_pos ) {
|
|
$root_value = substr( $value, 0, $size_pos );
|
|
foreach ( $intermediate_sizes as $size_name ) {
|
|
$value = $root_value . '[' . $size_name . ']';
|
|
$option_values = array (
|
|
'selected' => ( $value == $selection ) ? 'selected="selected"' : '',
|
|
'value' => esc_attr( $value ),
|
|
'text' => $value
|
|
);
|
|
|
|
$custom_field_options .= MLAData::mla_parse_template( $option_template, $option_values );
|
|
} // foreach size_name
|
|
continue;
|
|
} else {
|
|
$option_values = array (
|
|
'selected' => ( $value == $selection ) ? 'selected="selected"' : '',
|
|
'value' => esc_attr( $value ),
|
|
'text' => $value
|
|
);
|
|
}
|
|
|
|
$custom_field_options .= MLAData::mla_parse_template( $option_template, $option_values );
|
|
} // foreach custom_field_name
|
|
|
|
return $custom_field_options;
|
|
} // mla_compose_data_source_option_list
|
|
|
|
/**
|
|
* Update custom field mappings
|
|
*
|
|
* @since 1.10
|
|
*
|
|
* @param array current custom_field_mapping values
|
|
* @param array new values
|
|
*
|
|
* @return array ( 'message' => HTML message(s) reflecting results, 'values' => updated custom_field_mapping values, 'changed' => true if any changes detected else false )
|
|
*/
|
|
private static function _update_custom_field_mapping( $current_values, $new_values ) {
|
|
$error_list = '';
|
|
$message_list = '';
|
|
$settings_changed = false;
|
|
$custom_field_names = MLAOptions::_get_custom_field_names();
|
|
$new_values = stripslashes_deep( $new_values );
|
|
|
|
foreach ( $new_values as $the_key => $new_value ) {
|
|
$any_setting_changed = false;
|
|
/*
|
|
* Replace index with field name
|
|
*/
|
|
$new_key = trim( $new_value['name'] );
|
|
|
|
/*
|
|
* Check for the addition of a new rule or field
|
|
*/
|
|
if ( MLACoreOptions::MLA_NEW_CUSTOM_FIELD === $the_key ) {
|
|
if ( empty( $new_key ) ) {
|
|
continue;
|
|
}
|
|
|
|
if ( in_array( $new_key, $custom_field_names ) ) {
|
|
/* translators: 1: ERROR tag 2: custom field name */
|
|
$error_list .= '<br>' . sprintf( __( '%1$s: New field %2$s already exists.', 'media-library-assistant' ), __( 'ERROR', 'media-library-assistant' ), esc_html( $new_key ) ) . "\r\n";
|
|
continue;
|
|
}
|
|
|
|
/* translators: 1: custom field name */
|
|
$message_list .= '<br>' . sprintf( __( 'Adding new field %1$s.', 'media-library-assistant' ), esc_html( $new_key ) ) . "\r\n";
|
|
$any_setting_changed = true;
|
|
} elseif ( MLACoreOptions::MLA_NEW_CUSTOM_RULE === $the_key ) {
|
|
if ( 'none' == $new_key ) {
|
|
continue;
|
|
}
|
|
|
|
/* translators: 1: custom field name */
|
|
$message_list .= '<br>' . sprintf( __( 'Adding new rule for %1$s.', 'media-library-assistant' ), esc_html( $new_key ) ) . "\r\n";
|
|
$any_setting_changed = true;
|
|
}
|
|
|
|
if ( isset( $current_values[ $new_key ] ) ) {
|
|
$old_values = $current_values[ $new_key ];
|
|
$any_setting_changed = false;
|
|
} else {
|
|
$old_values = array(
|
|
'name' => $new_key,
|
|
'data_source' => 'none',
|
|
'keep_existing' => true,
|
|
'format' => 'native',
|
|
'mla_column' => false,
|
|
'quick_edit' => false,
|
|
'bulk_edit' => false,
|
|
'meta_name' => '',
|
|
'option' => 'text',
|
|
'no_null' => false
|
|
);
|
|
}
|
|
|
|
if ( isset( $new_value['action'] ) ) {
|
|
if ( array_key_exists( 'delete_rule', $new_value['action'] ) || array_key_exists( 'delete_field', $new_value['action'] ) ) {
|
|
$settings_changed = true;
|
|
/* translators: 1: custom field name */
|
|
$message_list .= '<br>' . sprintf( __( 'Deleting rule for %1$s.', 'media-library-assistant' ), esc_html( $old_values['name'] ) ) . "\r\n";
|
|
unset( $current_values[ $new_key ] );
|
|
continue;
|
|
} // delete rule
|
|
} // isset action
|
|
|
|
/*
|
|
* For "meta:" fields, the UI options are not appropriate
|
|
*/
|
|
if ( 'meta:' == substr( $new_key, 0, 5 ) ) {
|
|
unset( $new_value['mla_column'] );
|
|
unset( $new_value['quick_edit'] );
|
|
unset( $new_value['bulk_edit'] );
|
|
}
|
|
|
|
if ( $old_values['data_source'] != $new_value['data_source'] ) {
|
|
$any_setting_changed = true;
|
|
|
|
if ( in_array( $old_values['data_source'], array( 'meta', 'template' ) ) ) {
|
|
$new_value['meta_name'] = '';
|
|
}
|
|
|
|
/* translators: 1: custom field name 2: attribute 3: old value 4: new value */
|
|
$message_list .= '<br>' . sprintf( __( '%1$s changing %2$s from %3$s to %4$s.', 'media-library-assistant' ), esc_html( $old_values['name'] ), __( 'Data Source', 'media-library-assistant' ), $old_values['data_source'], $new_value['data_source'] ) . "\r\n";
|
|
$old_values['data_source'] = $new_value['data_source'];
|
|
}
|
|
|
|
if ( $new_value['keep_existing'] ) {
|
|
$boolean_value = true;
|
|
$boolean_text = __( 'Replace to Keep', 'media-library-assistant' );
|
|
} else {
|
|
$boolean_value = false;
|
|
$boolean_text = __( 'Keep to Replace', 'media-library-assistant' );
|
|
}
|
|
if ( $old_values['keep_existing'] != $boolean_value ) {
|
|
$any_setting_changed = true;
|
|
/* translators: 1: custom field name 2: attribute 3: old value 'to' new value */
|
|
$message_list .= '<br>' . sprintf( __( '%1$s changing %2$s value from %3$s.', 'media-library-assistant' ), esc_html( $old_values['name'] ), __( 'Existing Text', 'media-library-assistant' ), $boolean_text ) . "\r\n";
|
|
$old_values['keep_existing'] = $boolean_value;
|
|
}
|
|
|
|
if ( $old_values['format'] != $new_value['format'] ) {
|
|
$any_setting_changed = true;
|
|
/* translators: 1: custom field name 2: attribute 3: old value 4: new value */
|
|
$message_list .= '<br>' . sprintf( __( '%1$s changing %2$s from %3$s to %4$s.', 'media-library-assistant' ), esc_html( $old_values['name'] ), __( 'Format', 'media-library-assistant' ), $old_values['format'], $new_value['format'] ) . "\r\n";
|
|
$old_values['format'] = $new_value['format'];
|
|
}
|
|
|
|
if ( isset( $new_value['mla_column'] ) ) {
|
|
$boolean_value = true;
|
|
$boolean_text = __( 'unchecked to checked', 'media-library-assistant' );
|
|
} else {
|
|
$boolean_value = false;
|
|
$boolean_text = __( 'checked to unchecked', 'media-library-assistant' );
|
|
}
|
|
if ( $old_values['mla_column'] != $boolean_value ) {
|
|
$any_setting_changed = true;
|
|
/* translators: 1: custom field name 2: attribute 3: old value 'to' new value */
|
|
$message_list .= '<br>' . sprintf( __( '%1$s changing %2$s value from %3$s.', 'media-library-assistant' ), esc_html( $old_values['name'] ), __( 'MLA Column', 'media-library-assistant' ), $boolean_text ) . "\r\n";
|
|
$old_values['mla_column'] = $boolean_value;
|
|
}
|
|
|
|
if ( isset( $new_value['quick_edit'] ) ) {
|
|
$boolean_value = true;
|
|
$boolean_text = __( 'unchecked to checked', 'media-library-assistant' );
|
|
} else {
|
|
$boolean_value = false;
|
|
$boolean_text = __( 'checked to unchecked', 'media-library-assistant' );
|
|
}
|
|
if ( $old_values['quick_edit'] != $boolean_value ) {
|
|
$any_setting_changed = true;
|
|
/* translators: 1: custom field name 2: attribute 3: old value 'to' new value */
|
|
$message_list .= '<br>' . sprintf( __( '%1$s changing %2$s value from %3$s.', 'media-library-assistant' ), esc_html( $old_values['name'] ), __( 'Quick Edit', 'media-library-assistant' ), $boolean_text ) . "\r\n";
|
|
$old_values['quick_edit'] = $boolean_value;
|
|
}
|
|
|
|
if ( isset( $new_value['bulk_edit'] ) ) {
|
|
$boolean_value = true;
|
|
$boolean_text = __( 'unchecked to checked', 'media-library-assistant' );
|
|
} else {
|
|
$boolean_value = false;
|
|
$boolean_text = __( 'checked to unchecked', 'media-library-assistant' );
|
|
}
|
|
if ( $old_values['bulk_edit'] != $boolean_value ) {
|
|
$any_setting_changed = true;
|
|
/* translators: 1: custom field name 2: attribute 3: old value 'to' new value */
|
|
$message_list .= '<br>' . sprintf( __( '%1$s changing %2$s value from %3$s.', 'media-library-assistant' ), esc_html( $old_values['name'] ), __( 'Bulk Edit', 'media-library-assistant' ), $boolean_text ) . "\r\n";
|
|
$old_values['bulk_edit'] = $boolean_value;
|
|
}
|
|
|
|
if ( $old_values['meta_name'] != $new_value['meta_name'] ) {
|
|
$any_setting_changed = true;
|
|
|
|
/* translators: 1: custom field name 2: attribute 3: old value 4: new value */
|
|
$message_list .= '<br>' . sprintf( __( '%1$s changing %2$s from %3$s to %4$s.', 'media-library-assistant' ), esc_html( $old_values['name'] ), __( 'Metavalue name', 'media-library-assistant' ), $old_values['meta_name'], $new_value['meta_name'] ) . "\r\n";
|
|
$old_values['meta_name'] = $new_value['meta_name'];
|
|
}
|
|
|
|
if ( $old_values['option'] != $new_value['option'] ) {
|
|
$any_setting_changed = true;
|
|
/* translators: 1: custom field name 2: attribute 3: old value 4: new value */
|
|
$message_list .= '<br>' . sprintf( __( '%1$s changing %2$s from %3$s to %4$s.', 'media-library-assistant' ), esc_html( $old_values['name'] ), __( 'Option', 'media-library-assistant' ), $old_values['option'], $new_value['option'] ) . "\r\n";
|
|
$old_values['option'] = $new_value['option'];
|
|
}
|
|
|
|
if ( isset( $new_value['no_null'] ) ) {
|
|
$boolean_value = true;
|
|
$boolean_text = __( 'unchecked to checked', 'media-library-assistant' );
|
|
} else {
|
|
$boolean_value = false;
|
|
$boolean_text = __( 'checked to unchecked', 'media-library-assistant' );
|
|
}
|
|
if ( $old_values['no_null'] != $boolean_value ) {
|
|
$any_setting_changed = true;
|
|
/* translators: 1: custom field name 2: attribute 3: old value 'to' new value */
|
|
$message_list .= '<br>' . sprintf( __( '%1$s changing %2$s value from %3$s.', 'media-library-assistant' ), esc_html( $old_values['name'] ), __( 'Delete NULL values', 'media-library-assistant' ), $boolean_text ) . "\r\n";
|
|
$old_values['no_null'] = $boolean_value;
|
|
}
|
|
|
|
if ( $any_setting_changed ) {
|
|
$settings_changed = true;
|
|
$current_values[ $new_key ] = $old_values;
|
|
}
|
|
} // foreach new value
|
|
|
|
/*
|
|
* Uncomment this for debugging.
|
|
*/
|
|
// $error_list .= $message_list;
|
|
|
|
return array( 'message' => $error_list, 'values' => $current_values, 'changed' => $settings_changed );
|
|
} // _update_custom_field_mapping
|
|
|
|
/**
|
|
* Render and manage custom field mapping options
|
|
*
|
|
* @since 1.10
|
|
* @uses $mla_option_templates contains row and table templates
|
|
*
|
|
* @param string 'render', 'update', 'delete', or 'reset'
|
|
* @param string option name, e.g., 'custom_field_mapping'
|
|
* @param array option parameters
|
|
* @param array Optional. null (default) for 'render' else option data, e.g., $_REQUEST
|
|
*
|
|
* @return string HTML table row markup for 'render' else message(s) reflecting the results of the operation.
|
|
*/
|
|
public static function mla_custom_field_option_handler( $action, $key, $value, $args = NULL ) {
|
|
error_log( __LINE__ . " MLAOptions::mla_custom_field_option_handler( $action, $key )", 0 );
|
|
return "MLAOptions::mla_custom_field_option_handler( $action, $key ) deprecated.";
|
|
|
|
// Added in 2.63
|
|
MLAOptions::_load_option_templates();
|
|
|
|
$current_values = MLACore::mla_get_option( 'custom_field_mapping' );
|
|
} // mla_custom_field_option_handler
|
|
|
|
/**
|
|
* Term ID cache for (hierarchical) taxonomy mapping rules
|
|
*
|
|
* Locates term name within the hierarchy.
|
|
*
|
|
* @since 2.71
|
|
*
|
|
* @access public
|
|
* @var array $mla_term_cache {
|
|
* @type array $$taxonomy {
|
|
* @type array $$term_parent {
|
|
* @type array $$term_name {
|
|
* @type integer $term_id Term ID within the specific taxonomy and parent term.
|
|
* }
|
|
* }
|
|
* }
|
|
* }
|
|
*/
|
|
public static $mla_term_cache = array(); // [ $taxonomy ][ $term_parent ][ $term_name ] => $term_id
|
|
|
|
/**
|
|
* Build and search a cache of taxonomy and term name to term ID mappings
|
|
*
|
|
* @since 2.01
|
|
*
|
|
* @param string term name (not slug)
|
|
* @param integer zero or term's parent term_id
|
|
* @param string taxonomy slug
|
|
* @param array term objects currently assigned to the item
|
|
*
|
|
* @return integer term_id for the term name
|
|
*/
|
|
private static function _get_term_id( $term_name, $term_parent, $taxonomy, &$post_terms ) {
|
|
// WordPress encodes special characters, e.g., "&" as HTML entities in term names
|
|
$term_name = _wp_specialchars( $term_name );
|
|
|
|
// Is this term already in the cache?
|
|
if ( isset( MLAOptions::$mla_term_cache[ $taxonomy ] ) && isset( MLAOptions::$mla_term_cache[ $taxonomy ][ $term_parent ] ) && isset( MLAOptions::$mla_term_cache[ $taxonomy ][ $term_parent ][ $term_name ] ) ) {
|
|
return MLAOptions::$mla_term_cache[ $taxonomy ][ $term_parent ][ $term_name ];
|
|
}
|
|
|
|
// Is this term already assigned to the item?
|
|
if ( is_array( $post_terms ) ) {
|
|
$term_id = 0;
|
|
foreach( $post_terms as $post_term ) {
|
|
MLAOptions::$mla_term_cache[ $taxonomy ][ $post_term->parent ][ $post_term->name ] = $post_term->term_id;
|
|
if ( $term_name == $post_term->name && $term_parent == $post_term->parent ) {
|
|
$term_id = $post_term->term_id;
|
|
}
|
|
}
|
|
|
|
if ( 0 < $term_id ) {
|
|
return $term_id;
|
|
}
|
|
}
|
|
|
|
// Consider get_terms() or (just term_exists() for both cases)
|
|
if ( 0 === $term_parent ) {
|
|
$post_term = get_term_by( 'name', $term_name, $taxonomy ); // Consider get_terms() for identical names
|
|
if ( false !== $post_term ) {
|
|
MLAOptions::$mla_term_cache[ $taxonomy ][ $term_parent ][ $term_name ] = $post_term->term_id;
|
|
return $post_term->term_id;
|
|
}
|
|
} else {
|
|
$post_term = term_exists( $term_name, $taxonomy, $term_parent );
|
|
if ( $post_term !== 0 && $post_term !== NULL ) {
|
|
MLAOptions::$mla_term_cache[ $taxonomy ][ $term_parent ][ $term_name ] = absint( $post_term['term_id'] );
|
|
return absint( $post_term['term_id'] );
|
|
}
|
|
}
|
|
|
|
$post_term = wp_insert_term( $term_name, $taxonomy, array( 'parent' => $term_parent ) );
|
|
if ( ( ! is_wp_error( $post_term ) ) && isset( $post_term['term_id'] ) ) {
|
|
MLAOptions::$mla_term_cache[ $taxonomy ][ $term_parent ][ $term_name ] = $post_term['term_id'];
|
|
return $post_term['term_id'];
|
|
}
|
|
|
|
return 0;
|
|
} // _get_term_id
|
|
|
|
/**
|
|
* Evaluate IPTC/EXIF mapping updates for a post
|
|
*
|
|
* @since 1.00
|
|
*
|
|
* @param object post object with current values
|
|
* @param string category to evaluate against, e.g., iptc_exif_standard_mapping or iptc_exif_mapping
|
|
* @param array (optional) iptc_exif_mapping values, default - current option value
|
|
* @param array (optional) _wp_attachment_metadata, for MLAOptions::mla_update_attachment_metadata_filter
|
|
* @param boolean (optional) true if uploading a new item else false (default)
|
|
*
|
|
* @return array Updates suitable for MLAData::mla_update_single_item, if any
|
|
*/
|
|
public static function mla_evaluate_iptc_exif_mapping( $post, $category, $settings = NULL, $attachment_metadata = NULL, $is_upload = false ) {
|
|
if ( 'checked' != MLACore::mla_get_option( MLACoreOptions::MLA_ALLOW_IPTC_EXIF_MAPPING ) ) {
|
|
return array();
|
|
}
|
|
|
|
$image_metadata = MLAData::mla_fetch_attachment_image_metadata( $post->ID );
|
|
|
|
// Make the PDF/XMP metadata available as EXIF values so simple rules like "EXIF:Keywords" will work
|
|
if ( empty( $image_metadata['mla_exif_metadata'] ) ) {
|
|
if ( ! empty( $image_metadata['mla_xmp_metadata'] ) ) {
|
|
$image_metadata['mla_exif_metadata'] = $image_metadata['mla_xmp_metadata'];
|
|
} elseif ( ! empty( $image_metadata['mla_pdf_metadata'] ) ) {
|
|
$image_metadata['mla_exif_metadata'] = $image_metadata['mla_pdf_metadata'];
|
|
}
|
|
}
|
|
|
|
$updates = array();
|
|
$update_all = ( 'iptc_exif_mapping' == $category );
|
|
$data_source_category = $update_all ? 'single_attachment_mapping' : 'custom_field_mapping';
|
|
|
|
if ( NULL == $settings ) {
|
|
$settings = MLACore::mla_get_option( 'iptc_exif_mapping' );
|
|
}
|
|
|
|
$settings = apply_filters( 'mla_mapping_settings', $settings, $post->ID, $category, $attachment_metadata );
|
|
|
|
MLACore::mla_debug_add( __LINE__ . " MLAOptions::mla_evaluate_iptc_exif_mapping( {$post->ID}, {$category}, {$data_source_category} ) \$settings = " . var_export( $settings, true ), MLACore::MLA_DEBUG_CATEGORY_METADATA );
|
|
|
|
if ( $update_all || ( 'iptc_exif_standard_mapping' == $category ) ) {
|
|
foreach ( $settings['standard'] as $setting_key => $setting_value ) {
|
|
$setting_value['key'] = $setting_key;
|
|
$setting_value = apply_filters( 'mla_mapping_rule', $setting_value, $post->ID, 'iptc_exif_standard_mapping', $attachment_metadata );
|
|
if ( NULL === $setting_value ) {
|
|
continue;
|
|
}
|
|
|
|
if ( isset( $setting_value['active'] ) && false == $setting_value['active'] ) {
|
|
continue;
|
|
}
|
|
|
|
if ( 'none' == $setting_value['iptc_value'] ) {
|
|
$iptc_value = '';
|
|
} else {
|
|
$iptc_value = MLAData::mla_iptc_metadata_value( $setting_value['iptc_value'], $image_metadata );
|
|
}
|
|
|
|
$iptc_value = apply_filters( 'mla_mapping_iptc_value', $iptc_value, $setting_key, $post->ID, 'iptc_exif_standard_mapping', $attachment_metadata );
|
|
|
|
if ( 'template:[+empty+]' == $setting_value['exif_value'] ) {
|
|
$exif_value = NULL;
|
|
} elseif ( 'template:' == substr( $setting_value['exif_value'], 0, 9 ) ) {
|
|
$data_value = array(
|
|
'name' => $setting_key,
|
|
'data_source' => 'template',
|
|
'meta_name' => substr( $setting_value['exif_value'], 9 ),
|
|
'keep_existing' => $setting_value['keep_existing'],
|
|
'format' => 'native',
|
|
'option' => 'text' );
|
|
|
|
$exif_value = MLAOptions::mla_get_data_source( $post->ID, $data_source_category, $data_value, $attachment_metadata );
|
|
if ( ' ' == $exif_value ) {
|
|
$exif_value = '';
|
|
}
|
|
} else {
|
|
$exif_value = MLAData::mla_exif_metadata_value( $setting_value['exif_value'], $image_metadata );
|
|
}
|
|
|
|
$exif_value = apply_filters( 'mla_mapping_exif_value', $exif_value, $setting_key, $post->ID, 'iptc_exif_standard_mapping', $attachment_metadata );
|
|
|
|
$keep_existing = (boolean) $setting_value['keep_existing'];
|
|
|
|
if ( $setting_value['iptc_first'] ) {
|
|
if ( ! empty( $iptc_value ) ) {
|
|
$new_text = $iptc_value;
|
|
} else {
|
|
$new_text = $exif_value;
|
|
}
|
|
} else {
|
|
if ( ( ! empty( $exif_value ) ) || is_null( $exif_value ) ) {
|
|
$new_text = $exif_value;
|
|
} else {
|
|
$new_text = $iptc_value;
|
|
}
|
|
}
|
|
|
|
$new_text = apply_filters( 'mla_mapping_new_text', $new_text, $setting_key, $post->ID, 'iptc_exif_standard_mapping', $attachment_metadata );
|
|
|
|
if ( is_array( $new_text ) ) {
|
|
$new_text = implode( ',', $new_text );
|
|
}
|
|
|
|
// Handle 'template:[+empty+]'
|
|
if ( is_null( $new_text ) ) {
|
|
$updates[ $setting_key ] = '';
|
|
continue;
|
|
}
|
|
|
|
/*
|
|
* See /wp-includes/formatting.php, function convert_chars()
|
|
*
|
|
* Metadata tags <<title>> and <<category>> are removed, <<br>> and <<hr>> are
|
|
* converted into correct XHTML and Unicode characters are converted to the
|
|
* valid range.
|
|
*/
|
|
$new_text = trim( convert_chars( $new_text ) );
|
|
if ( !empty( $new_text ) ) {
|
|
switch ( $setting_key ) {
|
|
case 'post_title':
|
|
// wpadmin/includes/media.php function media_handle_upload() eliminates numeric values
|
|
// if ( ( empty( $post->post_title ) || !$keep_existing ) &&
|
|
// ( trim( $new_text ) && ! is_numeric( sanitize_title( $new_text ) ) ) )
|
|
if ( empty( $post->post_title ) || !$keep_existing ) {
|
|
$updates[ $setting_key ] = $new_text;
|
|
}
|
|
break;
|
|
case 'post_name':
|
|
$updates[ $setting_key ] = wp_unique_post_slug( sanitize_title( $new_text ), $post->ID, $post->post_status, $post->post_type, $post->post_parent);
|
|
break;
|
|
case 'image_alt':
|
|
$old_text = get_metadata( 'post', $post->ID, '_wp_attachment_image_alt', true );
|
|
if ( empty( $old_text ) || !$keep_existing ) {
|
|
$updates[ $setting_key ] = $new_text;
|
|
}
|
|
break;
|
|
case 'post_excerpt':
|
|
if ( empty( $post->post_excerpt ) || !$keep_existing ) {
|
|
$updates[ $setting_key ] = $new_text;
|
|
}
|
|
break;
|
|
case 'post_content':
|
|
if ( empty( $post->post_content ) || !$keep_existing ) {
|
|
$updates[ $setting_key ] = $new_text;
|
|
}
|
|
break;
|
|
case 'post_date':
|
|
if ( empty( $post->post_date ) || !$keep_existing ) {
|
|
// strtotime() will "Parse about any English textual datetime description into a Unix timestamp"
|
|
$timestamp = strtotime( $new_text );
|
|
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 );
|
|
$updates[ $setting_key ] = $new_text;
|
|
$updates['post_date_gmt'] = get_gmt_from_date( $new_text );
|
|
}
|
|
}
|
|
break;
|
|
default:
|
|
// ignore anything else
|
|
} // $setting_key
|
|
}
|
|
} // foreach new setting
|
|
} // update standard field mappings
|
|
|
|
if ( $update_all || ( 'iptc_exif_taxonomy_mapping' == $category ) ) {
|
|
$tax_inputs = array();
|
|
$tax_actions = array();
|
|
|
|
foreach ( $settings['taxonomy'] as $setting_key => $setting_value ) {
|
|
if ( ! MLACore::mla_taxonomy_support($setting_key, 'support') ) {
|
|
continue;
|
|
}
|
|
|
|
// Convert checkbox value(s)
|
|
$hierarchical = $setting_value['hierarchical'] = (boolean) $setting_value['hierarchical'];
|
|
|
|
$setting_value['key'] = $setting_key;
|
|
$setting_value = apply_filters( 'mla_mapping_rule', $setting_value, $post->ID, 'iptc_exif_taxonomy_mapping', $attachment_metadata );
|
|
if ( NULL === $setting_value ) {
|
|
continue;
|
|
}
|
|
|
|
if ( isset( $setting_value['active'] ) && false == $setting_value['active'] ) {
|
|
continue;
|
|
}
|
|
|
|
if ( 'none' == $setting_value['iptc_value'] ) {
|
|
$iptc_value = '';
|
|
} else {
|
|
$iptc_value = MLAData::mla_iptc_metadata_value( $setting_value['iptc_value'], $image_metadata );
|
|
}
|
|
|
|
$iptc_value = apply_filters( 'mla_mapping_iptc_value', $iptc_value, $setting_key, $post->ID, 'iptc_exif_taxonomy_mapping', $attachment_metadata );
|
|
|
|
if ( 'template:' == substr( $setting_value['exif_value'], 0, 9 ) ) {
|
|
$data_value = array(
|
|
'name' => $setting_key,
|
|
'data_source' => 'template',
|
|
'meta_name' => substr( $setting_value['exif_value'], 9 ),
|
|
'keep_existing' => $setting_value['keep_existing'],
|
|
'format' => 'native',
|
|
'option' => 'array' );
|
|
|
|
$exif_value = MLAOptions::mla_get_data_source( $post->ID, $data_source_category, $data_value, $attachment_metadata );
|
|
if ( ' ' == $exif_value ) {
|
|
$exif_value = '';
|
|
}
|
|
} else {
|
|
$exif_value = MLAData::mla_exif_metadata_value( $setting_value['exif_value'], $image_metadata );
|
|
}
|
|
|
|
$exif_value = apply_filters( 'mla_mapping_exif_value', $exif_value, $setting_key, $post->ID, 'iptc_exif_taxonomy_mapping', $attachment_metadata );
|
|
|
|
$tax_action = ( $setting_value['keep_existing'] ) ? 'add' : 'replace';
|
|
$tax_parent = ( isset( $setting_value['parent'] ) && (0 != (integer) $setting_value['parent'] ) ) ? (integer) $setting_value['parent'] : 0;
|
|
|
|
if ( $setting_value['iptc_first'] ) {
|
|
if ( ! empty( $iptc_value ) ) {
|
|
$new_text = $iptc_value;
|
|
} else {
|
|
$new_text = $exif_value;
|
|
}
|
|
} else {
|
|
if ( ! empty( $exif_value ) ) {
|
|
$new_text = $exif_value;
|
|
} else {
|
|
$new_text = $iptc_value;
|
|
}
|
|
}
|
|
|
|
/*
|
|
* Parse out individual terms
|
|
*/
|
|
if ( ! empty( $setting_value['delimiters'] ) ) {
|
|
$text = $setting_value['delimiters'];
|
|
$delimiters = array();
|
|
while ( ! empty( $text ) ) {
|
|
$delimiters[] = $text[0];
|
|
$text = substr($text, 1);
|
|
}
|
|
} else {
|
|
$delimiters = array( _x( ',', 'tag_delimiter', 'media-library-assistant' ) );
|
|
}
|
|
|
|
if ( is_scalar( $new_text ) ) {
|
|
$new_text = array( $new_text );
|
|
}
|
|
|
|
foreach( $delimiters as $delimiter ) {
|
|
$new_terms = array();
|
|
foreach ( $new_text as $text ) {
|
|
$fragments = explode( $delimiter, $text );
|
|
foreach( $fragments as $fragment ) {
|
|
if ( MLATest::$wp_3dot5 ) {
|
|
$fragment = trim( stripslashes_deep( $fragment ) );
|
|
} else {
|
|
$fragment = trim( wp_unslash( $fragment ) );
|
|
}
|
|
|
|
if ( ! empty( $fragment ) ) {
|
|
$new_terms[] = $fragment;
|
|
}
|
|
} // foreach fragment
|
|
} // foreach $text
|
|
$new_text = array_unique( $new_terms );
|
|
} // foreach $delimiter
|
|
|
|
$new_text = apply_filters( 'mla_mapping_new_text', $new_text, $setting_key, $post->ID, 'iptc_exif_taxonomy_mapping', $attachment_metadata );
|
|
|
|
if ( empty( $new_text ) ) {
|
|
continue;
|
|
}
|
|
|
|
$current_terms = array();
|
|
if ( ! $is_upload ) {
|
|
$post_terms = get_object_term_cache( $post->ID, $setting_key );
|
|
if ( false === $post_terms ) {
|
|
$post_terms = wp_get_object_terms( $post->ID, $setting_key );
|
|
wp_cache_add( $post->ID, $post_terms, $setting_key . '_relationships' );
|
|
}
|
|
|
|
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;
|
|
}
|
|
}
|
|
}
|
|
|
|
/*
|
|
* Hierarchical taxonomies require term_id, flat require term names
|
|
*/
|
|
if ( $hierarchical ) {
|
|
/*
|
|
* Convert text to term_id
|
|
*/
|
|
$new_terms = array();
|
|
foreach ( $new_text as $new_term ) {
|
|
if ( 0 < $new_term = MLAOptions::_get_term_id( $new_term, $tax_parent, $setting_key, $post_terms ) ) {
|
|
$new_terms[] = $new_term;
|
|
}
|
|
} // foreach new_term
|
|
} else {
|
|
$new_terms = $new_text;
|
|
}
|
|
|
|
if ( 'replace' == $tax_action ) {
|
|
/*
|
|
* If the new terms match the term cache, we can skip the update
|
|
*/
|
|
foreach ( $new_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 );
|
|
} else {
|
|
/*
|
|
* We are adding terms; remove existing terms
|
|
*/
|
|
foreach ( $new_terms as $index => $new_term ) {
|
|
if ( isset( $current_terms[ esc_attr( $new_term ) ] ) ) {
|
|
unset( $new_terms[ $index ] );
|
|
}
|
|
}
|
|
|
|
$do_update = ! empty( $new_terms );
|
|
}
|
|
|
|
if ( $do_update ) {
|
|
$tax_inputs[ $setting_key ] = $new_terms;
|
|
$tax_actions[ $setting_key ] = $tax_action;
|
|
}
|
|
} // foreach new setting
|
|
|
|
if ( ! empty( $tax_inputs ) ) {
|
|
$updates['taxonomy_updates'] = array ( 'inputs' => $tax_inputs, 'actions' => $tax_actions );
|
|
}
|
|
} // update taxonomy term mappings
|
|
|
|
if ( ( $update_all || ( 'iptc_exif_custom_mapping' == $category ) ) && !empty( $settings['custom'] ) ) {
|
|
$custom_updates = array();
|
|
foreach ( $settings['custom'] as $setting_key => $setting_value ) {
|
|
/*
|
|
* Convert checkbox value(s)
|
|
*/
|
|
$setting_value['no_null'] = isset( $setting_value['no_null'] );
|
|
|
|
$setting_name = $setting_value['name'];
|
|
$setting_value['key'] = $setting_key;
|
|
$setting_value = apply_filters( 'mla_mapping_rule', $setting_value, $post->ID, 'iptc_exif_custom_mapping', $attachment_metadata );
|
|
if ( NULL === $setting_value ) {
|
|
continue;
|
|
}
|
|
|
|
if ( isset( $setting_value['active'] ) && false == $setting_value['active'] ) {
|
|
continue;
|
|
}
|
|
|
|
if ( 'none' == $setting_value['iptc_value'] ) {
|
|
$iptc_value = '';
|
|
} else {
|
|
$data_value = array(
|
|
'name' => $setting_key,
|
|
'data_source' => 'template',
|
|
'meta_name' => '([+iptc:' . $setting_value['iptc_value'] . '+])',
|
|
'keep_existing' => $setting_value['keep_existing'],
|
|
'format' => $setting_value['format'],
|
|
'option' => $setting_value['option'] );
|
|
|
|
$iptc_value = MLAOptions::mla_get_data_source( $post->ID, $data_source_category, $data_value, $attachment_metadata );
|
|
if ( ' ' == $iptc_value ) {
|
|
$iptc_value = '';
|
|
}
|
|
}
|
|
|
|
$iptc_value = apply_filters( 'mla_mapping_iptc_value', $iptc_value, $setting_key, $post->ID, 'iptc_exif_custom_mapping', $attachment_metadata );
|
|
|
|
$exif_value = trim( $setting_value['exif_value'] );
|
|
if ( ! empty( $exif_value ) ) {
|
|
$data_value = array(
|
|
'name' => $setting_key,
|
|
'data_source' => 'template',
|
|
'keep_existing' => $setting_value['keep_existing'],
|
|
'format' => $setting_value['format'],
|
|
'option' => $setting_value['option'] );
|
|
|
|
if ( 'template:' == substr( $exif_value, 0, 9 ) ) {
|
|
$data_value['meta_name'] = substr( $exif_value, 9 );
|
|
} else {
|
|
$data_value['meta_name'] = '([+exif:' . $exif_value . '+])';
|
|
}
|
|
|
|
$exif_value = MLAOptions::mla_get_data_source( $post->ID, $data_source_category, $data_value, $attachment_metadata );
|
|
if ( ' ' == $exif_value ) {
|
|
$exif_value = '';
|
|
}
|
|
}
|
|
|
|
$exif_value = apply_filters( 'mla_mapping_exif_value', $exif_value, $setting_key, $post->ID, 'iptc_exif_custom_mapping', $attachment_metadata );
|
|
|
|
if ( $setting_value['iptc_first'] ) {
|
|
if ( ! empty( $iptc_value ) ) {
|
|
$new_text = $iptc_value;
|
|
} else {
|
|
$new_text = $exif_value;
|
|
}
|
|
} else {
|
|
if ( ! empty( $exif_value ) ) {
|
|
$new_text = $exif_value;
|
|
} else {
|
|
$new_text = $iptc_value;
|
|
}
|
|
}
|
|
|
|
$new_text = apply_filters( 'mla_mapping_new_text', $new_text, $setting_key, $post->ID, 'iptc_exif_custom_mapping', $attachment_metadata );
|
|
|
|
if ( $setting_value['keep_existing'] ) {
|
|
if ( 'meta:' == substr( $setting_name, 0, 5 ) ) {
|
|
$meta_key = substr( $setting_name, 5 );
|
|
|
|
if ( NULL === $attachment_metadata ) {
|
|
$attachment_metadata = maybe_unserialize( get_metadata( 'post', $post->ID, '_wp_attachment_metadata', true ) );
|
|
}
|
|
|
|
if ( array( $attachment_metadata ) ) {
|
|
$old_value = MLAData::mla_find_array_element( $meta_key, $attachment_metadata, 'array' );
|
|
} else {
|
|
$old_value = '';
|
|
}
|
|
} else {
|
|
if ( is_string( $old_value = get_metadata( 'post', $post->ID, $setting_name, true ) ) ) {
|
|
$old_value = trim( $old_value );
|
|
}
|
|
}
|
|
|
|
if ( ( ! empty( $new_text ) ) && empty( $old_value ) ) {
|
|
$custom_updates[ $setting_name ] = $new_text;
|
|
}
|
|
} else { // } keep_existing
|
|
if ( empty( $new_text ) && $setting_value['no_null'] ) {
|
|
$new_text = NULL;
|
|
}
|
|
|
|
$custom_updates[ $setting_name ] = $new_text;
|
|
}
|
|
} // foreach new setting
|
|
|
|
if ( ! empty( $custom_updates ) ) {
|
|
$updates['custom_updates'] = $custom_updates;
|
|
}
|
|
} // update custom field mappings
|
|
|
|
$updates = apply_filters( 'mla_mapping_updates', $updates, $post->ID, $category, $settings, $attachment_metadata );
|
|
MLACore::mla_debug_add( __LINE__ . " MLAOptions::mla_evaluate_iptc_exif_mapping( {$post->ID}, {$category}, {$data_source_category} ) \$updates = " . var_export( $updates, true ), MLACore::MLA_DEBUG_CATEGORY_METADATA );
|
|
|
|
return $updates;
|
|
} // mla_evaluate_iptc_exif_mapping
|
|
|
|
/**
|
|
* Compose an IPTC Options list with current selection
|
|
*
|
|
* @since 1.00
|
|
* @uses $mla_option_templates contains row and table templates
|
|
*
|
|
* @param string current selection or 'none' (default)
|
|
*
|
|
* @return string HTML markup with select field options
|
|
*/
|
|
public static function mla_compose_iptc_option_list( $selection = 'none' ) {
|
|
MLAOptions::_load_option_templates();
|
|
|
|
$option_template = MLAOptions::$mla_option_templates['iptc-exif-select-option'];
|
|
$option_values = array (
|
|
'selected' => ( 'none' == $selection ) ? 'selected="selected"' : '',
|
|
'value' => 'none',
|
|
'text' => '— ' . __( 'None (select a value)', 'media-library-assistant' ) . ' —'
|
|
);
|
|
|
|
$iptc_options = MLAData::mla_parse_template( $option_template, $option_values );
|
|
foreach ( MLAData::$mla_iptc_keys as $iptc_name => $iptc_code ) {
|
|
$option_values = array (
|
|
'selected' => ( $iptc_code == $selection ) ? 'selected="selected"' : '',
|
|
'value' => $iptc_code,
|
|
'text' => $iptc_code . ' ' . $iptc_name
|
|
);
|
|
|
|
$iptc_options .= MLAData::mla_parse_template( $option_template, $option_values );
|
|
} // foreach iptc_key
|
|
|
|
return $iptc_options;
|
|
} // mla_compose_iptc_option_list
|
|
|
|
/**
|
|
* Compose an hierarchical taxonomy Parent options list with current selection
|
|
*
|
|
* @since 1.00
|
|
* @uses $mla_option_templates contains row and table templates
|
|
*
|
|
* @param string taxonomy slug
|
|
* @param integer current selection or 0 (zero, default)
|
|
*
|
|
* @return string HTML markup with select field options
|
|
*/
|
|
public static function mla_compose_parent_option_list( $taxonomy, $selection = 0 ) {
|
|
$dropdown_options = array(
|
|
'show_option_all' => '',
|
|
'show_option_none' => '— ' . __( 'None (select a value)', 'media-library-assistant' ) . ' —',
|
|
'orderby' => 'name',
|
|
'order' => 'ASC',
|
|
'show_count' => false,
|
|
'hide_empty' => false,
|
|
'child_of' => 0,
|
|
'exclude' => '',
|
|
// 'exclude_tree => '',
|
|
'echo' => true,
|
|
'depth' => 0,
|
|
'tab_index' => 0,
|
|
'name' => 'mla_filter_term',
|
|
'id' => 'name',
|
|
'class' => 'postform',
|
|
'selected' => ( 0 == $selection ) ? -1 : $selection,
|
|
'hierarchical' => true,
|
|
'pad_counts' => false,
|
|
'taxonomy' => $taxonomy,
|
|
'hide_if_empty' => false
|
|
);
|
|
|
|
ob_start();
|
|
wp_dropdown_categories( $dropdown_options );
|
|
$dropdown = ob_get_contents();
|
|
ob_end_clean();
|
|
|
|
$dropdown_options = substr( $dropdown, strpos( $dropdown, ' >' ) + 2 );
|
|
$dropdown_options = substr( $dropdown_options, 0, strpos( $dropdown_options, '</select>' ) );
|
|
$dropdown_options = str_replace( "value='-1'", 'value="0"', $dropdown_options );
|
|
$dropdown_options = str_replace( 'value="-1"', 'value="0"', $dropdown_options );
|
|
|
|
return $dropdown_options;
|
|
} // mla_compose_parent_option_list
|
|
|
|
/**
|
|
* Update Standard field portion of IPTC/EXIF mappings
|
|
*
|
|
* @since 1.00
|
|
*
|
|
* @param array current iptc_exif_mapping values
|
|
* @param array new values
|
|
*
|
|
* @return array ( 'message' => HTML message(s) reflecting results, 'values' => updated iptc_exif_mapping values, 'changed' => true if any changes detected else false )
|
|
*/
|
|
private static function _update_iptc_exif_standard_mapping( $current_values, $new_values ) {
|
|
$error_list = '';
|
|
$message_list = '';
|
|
$settings_changed = false;
|
|
$new_values = stripslashes_deep( $new_values );
|
|
|
|
foreach ( $new_values['standard'] as $new_key => $new_value ) {
|
|
if ( isset( $current_values['standard'][ $new_key ] ) ) {
|
|
$old_values = $current_values['standard'][ $new_key ];
|
|
$any_setting_changed = false;
|
|
} else {
|
|
/* translators: 1: ERROR tag 2: custom field name */
|
|
$error_list .= '<br>' . sprintf( __( '%1$s: No old values for %2$s.', 'media-library-assistant' ), __( 'ERROR', 'media-library-assistant' ), esc_html( $new_key ) ) . "\r\n";
|
|
continue;
|
|
}
|
|
|
|
/*
|
|
* Field Title can change as a result of localization
|
|
*/
|
|
$new_value['name'] = MLACoreOptions::$mla_option_definitions['iptc_exif_mapping']['std']['standard'][ $new_key ]['name'];
|
|
|
|
if ( $old_values['name'] != $new_value['name'] ) {
|
|
$any_setting_changed = true;
|
|
/* translators: 1: custom field name 2: attribute 3: old value 4: new value */
|
|
$message_list .= '<br>' . sprintf( __( '%1$s changing %2$s from %3$s to %4$s.', 'media-library-assistant' ), esc_html( $old_values['name'] ), __( 'Field Title', 'media-library-assistant' ), esc_html( $old_values['name'] ), esc_html( $new_value['name'] ) ) . "\r\n";
|
|
$old_values['name'] = $new_value['name'];
|
|
}
|
|
|
|
if ( $old_values['iptc_value'] != $new_value['iptc_value'] ) {
|
|
$any_setting_changed = true;
|
|
/* translators: 1: custom field name 2: attribute 3: old value 4: new value */
|
|
$message_list .= '<br>' . sprintf( __( '%1$s changing %2$s from %3$s to %4$s.', 'media-library-assistant' ), esc_html( $old_values['name'] ), __( 'IPTC Value', 'media-library-assistant' ), $old_values['iptc_value'], $new_value['iptc_value'] ) . "\r\n";
|
|
$old_values['iptc_value'] = $new_value['iptc_value'];
|
|
}
|
|
|
|
if ( $old_values['exif_value'] != $new_value['exif_value'] ) {
|
|
$any_setting_changed = true;
|
|
/* translators: 1: custom field name 2: attribute 3: old value 4: new value */
|
|
$message_list .= '<br>' . sprintf( __( '%1$s changing %2$s from %3$s to %4$s.', 'media-library-assistant' ), esc_html( $old_values['name'] ), __( 'EXIF Value', 'media-library-assistant' ), $old_values['exif_value'], $new_value['exif_value'] ) . "\r\n";
|
|
$old_values['exif_value'] = $new_value['exif_value'];
|
|
}
|
|
|
|
if ( $new_value['iptc_first'] ) {
|
|
$boolean_value = true;
|
|
$boolean_text = __( 'EXIF to IPTC', 'media-library-assistant' );
|
|
} else {
|
|
$boolean_value = false;
|
|
$boolean_text = __( 'IPTC to EXIF', 'media-library-assistant' );
|
|
}
|
|
if ( $old_values['iptc_first'] != $boolean_value ) {
|
|
$any_setting_changed = true;
|
|
/* translators: 1: custom field name 2: attribute 3: old value 'to' new value */
|
|
$message_list .= '<br>' . sprintf( __( '%1$s changing %2$s value from %3$s.', 'media-library-assistant' ), esc_html( $old_values['name'] ), __( 'Priority', 'media-library-assistant' ), $boolean_text ) . "\r\n";
|
|
$old_values['iptc_first'] = $boolean_value;
|
|
}
|
|
|
|
if ( $new_value['keep_existing'] ) {
|
|
$boolean_value = true;
|
|
$boolean_text = __( 'Replace to Keep', 'media-library-assistant' );
|
|
} else {
|
|
$boolean_value = false;
|
|
$boolean_text = __( 'Keep to Replace', 'media-library-assistant' );
|
|
}
|
|
if ( $old_values['keep_existing'] != $boolean_value ) {
|
|
$any_setting_changed = true;
|
|
/* translators: 1: custom field name 2: attribute 3: old value 'to' new value */
|
|
$message_list .= '<br>' . sprintf( __( '%1$s changing %2$s value from %3$s.', 'media-library-assistant' ), esc_html( $old_values['name'] ), __( 'Existing Text', 'media-library-assistant' ), $boolean_text ) . "\r\n";
|
|
$old_values['keep_existing'] = $boolean_value;
|
|
}
|
|
|
|
if ( $any_setting_changed ) {
|
|
$settings_changed = true;
|
|
$current_values['standard'][ $new_key ] = $old_values;
|
|
}
|
|
} // new standard value
|
|
|
|
/*
|
|
* Uncomment this for debugging.
|
|
*/
|
|
// $error_list .= $message_list;
|
|
|
|
return array( 'message' => $error_list, 'values' => $current_values, 'changed' => $settings_changed );
|
|
} // _update_iptc_exif_standard_mapping
|
|
|
|
/**
|
|
* Update Taxonomy term portion of IPTC/EXIF mappings
|
|
*
|
|
* @since 1.00
|
|
*
|
|
* @param array current iptc_exif_mapping values
|
|
* @param array new values
|
|
*
|
|
* @return array ( 'message' => HTML message(s) reflecting results, 'values' => updated iptc_exif_mapping values, 'changed' => true if any changes detected else false )
|
|
*/
|
|
private static function _update_iptc_exif_taxonomy_mapping( $current_values, $new_values ) {
|
|
$error_list = '';
|
|
$message_list = '';
|
|
$settings_changed = false;
|
|
$new_values = stripslashes_deep( $new_values );
|
|
|
|
/*
|
|
* Remove rules for taxonomies that no longer exist
|
|
*/
|
|
$taxonomies = get_taxonomies( array ( 'show_ui' => true ), 'objects' );
|
|
foreach ( $current_values['taxonomy'] as $new_key => $new_value ) {
|
|
if ( ! isset( $taxonomies[ $new_key ] ) ) {
|
|
$settings_changed = true;
|
|
/* translators: 1: custom field name */
|
|
$message_list .= '<br>' . sprintf( __( 'Deleting rule for %1$s.', 'media-library-assistant' ), esc_html( $new_key ) ) . "\r\n";
|
|
unset( $current_values['taxonomy'][ $new_key ] );
|
|
}
|
|
}
|
|
|
|
foreach ( $new_values['taxonomy'] as $new_key => $new_value ) {
|
|
if ( isset( $current_values['taxonomy'][ $new_key ] ) ) {
|
|
$old_values = $current_values['taxonomy'][ $new_key ];
|
|
} else {
|
|
$old_values = array(
|
|
'name' => $new_value['name'],
|
|
'hierarchical' => $new_value['hierarchical'],
|
|
'iptc_value' => 'none',
|
|
'exif_value' => '',
|
|
'iptc_first' => true,
|
|
'keep_existing' => true,
|
|
'delimiters' => '',
|
|
'parent' => 0
|
|
);
|
|
}
|
|
|
|
$any_setting_changed = false;
|
|
if ( $old_values['iptc_value'] != $new_value['iptc_value'] ) {
|
|
$any_setting_changed = true;
|
|
/* translators: 1: custom field name 2: attribute 3: old value 4: new value */
|
|
$message_list .= '<br>' . sprintf( __( '%1$s changing %2$s from %3$s to %4$s.', 'media-library-assistant' ), esc_html( $old_values['name'] ), __( 'IPTC Value', 'media-library-assistant' ), $old_values['iptc_value'], $new_value['iptc_value'] ) . "\r\n";
|
|
$old_values['iptc_value'] = $new_value['iptc_value'];
|
|
}
|
|
|
|
if ( $old_values['exif_value'] != $new_value['exif_value'] ) {
|
|
$any_setting_changed = true;
|
|
/* translators: 1: custom field name 2: attribute 3: old value 4: new value */
|
|
$message_list .= '<br>' . sprintf( __( '%1$s changing %2$s from %3$s to %4$s.', 'media-library-assistant' ), esc_html( $old_values['name'] ), __( 'EXIF Value', 'media-library-assistant' ), $old_values['exif_value'], $new_value['exif_value'] ) . "\r\n";
|
|
$old_values['exif_value'] = $new_value['exif_value'];
|
|
}
|
|
|
|
if ( $new_value['iptc_first'] ) {
|
|
$boolean_value = true;
|
|
$boolean_text = __( 'EXIF to IPTC', 'media-library-assistant' );
|
|
} else {
|
|
$boolean_value = false;
|
|
$boolean_text = __( 'IPTC to EXIF', 'media-library-assistant' );
|
|
}
|
|
if ( $old_values['iptc_first'] != $boolean_value ) {
|
|
$any_setting_changed = true;
|
|
/* translators: 1: custom field name 2: attribute 3: old value 'to' new value */
|
|
$message_list .= '<br>' . sprintf( __( '%1$s changing %2$s value from %3$s.', 'media-library-assistant' ), esc_html( $old_values['name'] ), __( 'Priority', 'media-library-assistant' ), $boolean_text ) . "\r\n";
|
|
$old_values['iptc_first'] = $boolean_value;
|
|
}
|
|
|
|
if ( $new_value['keep_existing'] ) {
|
|
$boolean_value = true;
|
|
$boolean_text = __( 'Replace to Keep', 'media-library-assistant' );
|
|
} else {
|
|
$boolean_value = false;
|
|
$boolean_text = __( 'Keep to Replace', 'media-library-assistant' );
|
|
}
|
|
if ( $old_values['keep_existing'] != $boolean_value ) {
|
|
$any_setting_changed = true;
|
|
/* translators: 1: custom field name 2: attribute 3: old value 'to' new value */
|
|
$message_list .= '<br>' . sprintf( __( '%1$s changing %2$s value from %3$s.', 'media-library-assistant' ), esc_html( $old_values['name'] ), __( 'Existing Text', 'media-library-assistant' ), $boolean_text ) . "\r\n";
|
|
$old_values['keep_existing'] = $boolean_value;
|
|
}
|
|
|
|
if ( $old_values['delimiters'] != $new_value['delimiters'] ) {
|
|
$any_setting_changed = true;
|
|
/* translators: 1: custom field name 2: attribute 3: old value 4: new value */
|
|
$message_list .= '<br>' . sprintf( __( '%1$s changing %2$s from %3$s to %4$s.', 'media-library-assistant' ), esc_html( $old_values['name'] ), __( 'Delimiter(s)', 'media-library-assistant' ), $old_values['delimiters'], $new_value['delimiters'] ) . "\r\n";
|
|
$old_values['delimiters'] = $new_value['delimiters'];
|
|
}
|
|
|
|
if ( isset( $new_value['parent'] ) && ( $old_values['parent'] != $new_value['parent'] ) ) {
|
|
$any_setting_changed = true;
|
|
/* translators: 1: custom field name 2: attribute 3: old value 4: new value */
|
|
$message_list .= '<br>' . sprintf( __( '%1$s changing %2$s from %3$s to %4$s.', 'media-library-assistant' ), esc_html( $old_values['name'] ), __( 'Parent', 'media-library-assistant' ), $old_values['parent'], $new_value['parent'] ) . "\r\n";
|
|
$old_values['parent'] = $new_value['parent'];
|
|
}
|
|
|
|
if ( $any_setting_changed ) {
|
|
$settings_changed = true;
|
|
$current_values['taxonomy'][ $new_key ] = $old_values;
|
|
}
|
|
} // new taxonomy value
|
|
|
|
/*
|
|
* Uncomment this for debugging.
|
|
*/
|
|
// $error_list .= $message_list;
|
|
|
|
return array( 'message' => $error_list, 'values' => $current_values, 'changed' => $settings_changed );
|
|
} // _update_iptc_exif_taxonomy_mapping
|
|
|
|
/**
|
|
* Update Custom field portion of IPTC/EXIF mappings
|
|
*
|
|
* @since 1.00
|
|
*
|
|
* @param array current iptc_exif_mapping values
|
|
* @param array new values
|
|
*
|
|
* @return array ( 'message' => HTML message(s) reflecting results, 'values' => updated iptc_exif_mapping values, 'changed' => true if any changes detected else false )
|
|
*/
|
|
private static function _update_iptc_exif_custom_mapping( $current_values, $new_values ) {
|
|
$error_list = '';
|
|
$message_list = '';
|
|
$settings_changed = false;
|
|
$custom_field_names = MLAOptions::_get_custom_field_names();
|
|
$new_values = stripslashes_deep( $new_values );
|
|
|
|
if ( empty( $new_values['custom'] ) ) {
|
|
$new_values['custom'] = array();
|
|
}
|
|
|
|
foreach ( $new_values['custom'] as $the_key => $new_value ) {
|
|
$any_setting_changed = false;
|
|
/*
|
|
* Replace index with field name
|
|
*/
|
|
$new_key = trim( $new_value['name'] );
|
|
|
|
/*
|
|
* Check for the addition of a new field or new rule
|
|
*/
|
|
if ( MLACoreOptions::MLA_NEW_CUSTOM_FIELD === $the_key ) {
|
|
if ( empty( $new_key ) ) {
|
|
continue;
|
|
}
|
|
|
|
if ( in_array( $new_key, $custom_field_names ) ) {
|
|
/* translators: 1: ERROR tag 2: custom field name */
|
|
$error_list .= '<br>' . sprintf( __( '%1$s: New field %2$s already exists.', 'media-library-assistant' ), __( 'ERROR', 'media-library-assistant' ), esc_html( $new_key ) ) . "\r\n";
|
|
continue;
|
|
}
|
|
|
|
/* translators: 1: custom field name */
|
|
$message_list .= '<br>' . sprintf( __( 'Adding new field %1$s.', 'media-library-assistant' ), esc_html( $new_key ) ) . "\r\n";
|
|
$any_setting_changed = true;
|
|
} elseif ( MLACoreOptions::MLA_NEW_CUSTOM_RULE === $the_key ) {
|
|
if ( 'none' == $new_key ) {
|
|
continue;
|
|
}
|
|
|
|
/* translators: 1: custom field name */
|
|
$message_list .= '<br>' . sprintf( __( 'Adding new rule for %1$s.', 'media-library-assistant' ), esc_html( $new_key ) ) . "\r\n";
|
|
$any_setting_changed = true;
|
|
}
|
|
|
|
$new_value = $new_value;
|
|
|
|
if ( isset( $current_values['custom'] ) && isset( $current_values['custom'][ $new_key ] ) ) {
|
|
$old_values = $current_values['custom'][ $new_key ];
|
|
$any_setting_changed = false;
|
|
} else {
|
|
$old_values = array(
|
|
'name' => $new_key,
|
|
'iptc_value' => 'none',
|
|
'exif_value' => '',
|
|
'iptc_first' => true,
|
|
'keep_existing' => true,
|
|
'format' => 'native',
|
|
'option' => 'text',
|
|
'no_null' => false
|
|
);
|
|
}
|
|
|
|
if ( isset( $new_value['action'] ) ) {
|
|
if ( array_key_exists( 'delete_rule', $new_value['action'] ) || array_key_exists( 'delete_field', $new_value['action'] ) ) {
|
|
$settings_changed = true;
|
|
/* translators: 1: custom field name */
|
|
$message_list .= '<br>' . sprintf( __( 'Deleting rule for %1$s.', 'media-library-assistant' ), esc_html( $old_values['name'] ) ) . "\r\n";
|
|
unset( $current_values['custom'][ $new_key ] );
|
|
$settings_changed = true;
|
|
continue;
|
|
} // delete rule
|
|
} // isset action
|
|
|
|
if ( $old_values['iptc_value'] != $new_value['iptc_value'] ) {
|
|
$any_setting_changed = true;
|
|
/* translators: 1: custom field name 2: attribute 3: old value 4: new value */
|
|
$message_list .= '<br>' . sprintf( __( '%1$s changing %2$s from %3$s to %4$s.', 'media-library-assistant' ), esc_html( $old_values['name'] ), __( 'IPTC Value', 'media-library-assistant' ), $old_values['iptc_value'], $new_value['iptc_value'] ) . "\r\n";
|
|
$old_values['iptc_value'] = $new_value['iptc_value'];
|
|
}
|
|
|
|
if ( $old_values['exif_value'] != $new_value['exif_value'] ) {
|
|
$any_setting_changed = true;
|
|
/* translators: 1: custom field name 2: attribute 3: old value 4: new value */
|
|
$message_list .= '<br>' . sprintf( __( '%1$s changing %2$s from %3$s to %4$s.', 'media-library-assistant' ), esc_html( $old_values['name'] ), __( 'EXIF Value', 'media-library-assistant' ), $old_values['exif_value'], $new_value['exif_value'] ) . "\r\n";
|
|
$old_values['exif_value'] = $new_value['exif_value'];
|
|
}
|
|
|
|
if ( $new_value['iptc_first'] ) {
|
|
$boolean_value = true;
|
|
$boolean_text = __( 'EXIF to IPTC', 'media-library-assistant' );
|
|
} else {
|
|
$boolean_value = false;
|
|
$boolean_text = __( 'IPTC to EXIF', 'media-library-assistant' );
|
|
}
|
|
if ( $old_values['iptc_first'] != $boolean_value ) {
|
|
$any_setting_changed = true;
|
|
/* translators: 1: custom field name 2: attribute 3: old value 'to' new value */
|
|
$message_list .= '<br>' . sprintf( __( '%1$s changing %2$s value from %3$s.', 'media-library-assistant' ), esc_html( $old_values['name'] ), __( 'Priority', 'media-library-assistant' ), $boolean_text ) . "\r\n";
|
|
$old_values['iptc_first'] = $boolean_value;
|
|
}
|
|
|
|
if ( $new_value['keep_existing'] ) {
|
|
$boolean_value = true;
|
|
$boolean_text = __( 'Replace to Keep', 'media-library-assistant' );
|
|
} else {
|
|
$boolean_value = false;
|
|
$boolean_text = __( 'Keep to Replace', 'media-library-assistant' );
|
|
}
|
|
if ( $old_values['keep_existing'] != $boolean_value ) {
|
|
$any_setting_changed = true;
|
|
/* translators: 1: custom field name 2: attribute 3: old value 'to' new value */
|
|
$message_list .= '<br>' . sprintf( __( '%1$s changing %2$s value from %3$s.', 'media-library-assistant' ), esc_html( $old_values['name'] ), __( 'Existing Text', 'media-library-assistant' ), $boolean_text ) . "\r\n";
|
|
$old_values['keep_existing'] = $boolean_value;
|
|
}
|
|
|
|
if ( $old_values['format'] != $new_value['format'] ) {
|
|
$any_setting_changed = true;
|
|
/* translators: 1: custom field name 2: attribute 3: old value 4: new value */
|
|
$message_list .= '<br>' . sprintf( __( '%1$s changing %2$s from %3$s to %4$s.', 'media-library-assistant' ), esc_html( $old_values['name'] ), __( 'Format', 'media-library-assistant' ), $old_values['format'], $new_value['format'] ) . "\r\n";
|
|
$old_values['format'] = $new_value['format'];
|
|
}
|
|
|
|
if ( $old_values['option'] != $new_value['option'] ) {
|
|
$any_setting_changed = true;
|
|
/* translators: 1: custom field name 2: attribute 3: old value 4: new value */
|
|
$message_list .= '<br>' . sprintf( __( '%1$s changing %2$s from %3$s to %4$s.', 'media-library-assistant' ), esc_html( $old_values['name'] ), __( 'Option', 'media-library-assistant' ), $old_values['option'], $new_value['option'] ) . "\r\n";
|
|
$old_values['option'] = $new_value['option'];
|
|
}
|
|
|
|
if ( isset( $new_value['no_null'] ) ) {
|
|
$boolean_value = true;
|
|
$boolean_text = __( 'unchecked to checked', 'media-library-assistant' );
|
|
} else {
|
|
$boolean_value = false;
|
|
$boolean_text = __( 'checked to unchecked', 'media-library-assistant' );
|
|
}
|
|
if ( $old_values['no_null'] != $boolean_value ) {
|
|
$any_setting_changed = true;
|
|
/* translators: 1: custom field name 2: attribute 3: old value 'to' new value */
|
|
$message_list .= '<br>' . sprintf( __( '%1$s changing %2$s value from %3$s.', 'media-library-assistant' ), esc_html( $old_values['name'] ), __( 'Delete NULL values', 'media-library-assistant' ), $boolean_text ) . "\r\n";
|
|
$old_values['no_null'] = $boolean_value;
|
|
}
|
|
|
|
if ( $any_setting_changed ) {
|
|
$settings_changed = true;
|
|
$current_values['custom'][ $new_key ] = $old_values;
|
|
}
|
|
} // new custom value
|
|
|
|
/*
|
|
* Uncomment this for debugging.
|
|
*/
|
|
// $error_list .= $message_list;
|
|
|
|
return array( 'message' => $error_list, 'values' => $current_values, 'changed' => $settings_changed );
|
|
} // _update_iptc_exif_custom_mapping
|
|
|
|
/**
|
|
* Generate a list of all (post) Custom Field names
|
|
*
|
|
* The list will include any Custom Field and IPTC/EXIF rules that
|
|
* haven't been mapped to any attachments, yet.
|
|
*
|
|
* @since 1.00
|
|
*
|
|
* @return array Custom field names from the postmeta table and MLA rules
|
|
*/
|
|
private static function _get_custom_field_names( ) {
|
|
global $wpdb;
|
|
|
|
$custom_field_mapping = MLACore::mla_get_option( 'custom_field_mapping' );
|
|
$iptc_exif_mapping = MLACore::mla_get_option( 'iptc_exif_mapping' );
|
|
$iptc_exif_mapping = !empty( $iptc_exif_mapping['custom'] ) ? $iptc_exif_mapping['custom'] : array();
|
|
|
|
$limit = (int) apply_filters( 'postmeta_form_limit', 100 );
|
|
$keys = $wpdb->get_col( "
|
|
SELECT meta_key
|
|
FROM $wpdb->postmeta
|
|
GROUP BY meta_key
|
|
HAVING meta_key NOT LIKE '\_%'
|
|
ORDER BY meta_key
|
|
LIMIT $limit" );
|
|
|
|
// Add any names in mapping rules that don't exist in the database
|
|
if ( $keys ) {
|
|
foreach ( $custom_field_mapping as $value ) {
|
|
if ( ! in_array( $value['name'], $keys ) ) {
|
|
$keys[] = $value['name'];
|
|
}
|
|
}
|
|
|
|
foreach ( $iptc_exif_mapping as $value ) {
|
|
if ( ! in_array( $value['name'], $keys ) ) {
|
|
$keys[] = $value['name'];
|
|
}
|
|
}
|
|
|
|
natcasesort($keys);
|
|
}
|
|
|
|
return $keys;
|
|
} // _get_custom_field_names
|
|
|
|
/**
|
|
* Render and manage iptc/exif support options
|
|
*
|
|
* @since 1.00
|
|
* @uses $mla_option_templates contains row and table templates
|
|
*
|
|
* @param string 'render', 'update', 'delete', or 'reset'
|
|
* @param string option name, e.g., 'iptc_exif_mapping'
|
|
* @param array option parameters
|
|
* @param array Optional. null (default) for 'render' else option data, e.g., $_REQUEST
|
|
*
|
|
* @return string HTML table row markup for 'render' else message(s) reflecting the results of the operation.
|
|
*/
|
|
public static function mla_iptc_exif_option_handler( $action, $key, $value, $args = NULL ) {
|
|
error_log( __LINE__ . " MLAOptions::mla_iptc_exif_option_handler( $action, $key )", 0 );
|
|
return " MLAOptions::mla_iptc_exif_option_handler( $action, $key ) deprecated.";
|
|
|
|
// Added in 2.63
|
|
MLAOptions::_load_option_templates();
|
|
|
|
$current_values = MLACore::mla_get_option( 'iptc_exif_mapping' );
|
|
} // mla_iptc_exif_option_handler
|
|
} // class MLAOptions
|
|
?>
|