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

893 lines
31 KiB
PHP

<?php
/**
* Database query support for "where-used" reporting
*
* @package Media Library Assistant
* @since 2.20
*/
/**
* Class MLA (Media Library Assistant) Query provides database query support
* for "where-used" reporting needs
*
* @package Media Library Assistant
* @since 2.20
*/
class MLAReferences {
/**
* Find Featured Image and inserted image/link references to an attachment
*
* Called from MLAQuery::mla_fetch_attachment_references, which handles conditional
* loading of this file.
*
* @since 0.1
*
* @param int post ID of attachment
* @param int post ID of attachment's parent, if any
* @param boolean True to compute references, false to return empty values
*
* @return array Reference information; see $references array comments
*/
public static function mla_fetch_attachment_references_handler( $ID, $parent, $add_references = true ) {
global $wpdb;
static $save_id = -1, $references, $inserted_in_option = NULL;
if ( $save_id == $ID ) {
return $references;
} elseif ( $ID == -1 ) {
$save_id = -1;
return NULL;
}
/*
* inserted_option 'enabled', 'base' or 'disabled'
* tested_reference true if any of the four where-used types was processed
* found_reference true if any where-used array is not empty()
* found_parent true if $parent matches a where-used post ID
* is_unattached true if $parent is zero (0)
* base_file relative path and name of the uploaded file, e.g., 2012/04/image.jpg
* path path to the file, relative to the "uploads/" directory, e.g., 2012/04/
* file The name portion of the base file, e.g., image.jpg
* files base file and any other image size files. Array key is path and file name.
* Non-image file value is a string containing file name without path
* Image file value is an array with file name, width and height
* features Array of objects with the post_type and post_title of each post
* that has the attachment as a "Featured Image"
* inserts Array of specific files (i.e., sizes) found in one or more posts/pages
* as an image (<img>) or link (<a href>). The array key is the path and file name.
* The array value is an array with the ID, post_type and post_title of each reference
* mla_galleries Array of objects with the post_type and post_title of each post
* that was returned by an [mla_gallery] shortcode
* galleries Array of objects with the post_type and post_title of each post
* that was returned by a [gallery] shortcode
* parent_type 'post' or 'page' or the custom post type of the attachment's parent
* parent_status 'publish', 'private', 'future', 'pending', 'draft'
* parent_title post_title of the attachment's parent
* parent_errors UNATTACHED, ORPHAN, BAD/INVALID PARENT
*/
$references = array(
'inserted_option' => '',
'tested_reference' => false,
'found_reference' => false,
'found_parent' => false,
'is_unattached' => ( ( (int) $parent ) === 0 ),
'base_file' => '',
'path' => '',
'file' => '',
'files' => array(),
'features' => array(),
'inserts' => array(),
'mla_galleries' => array(),
'galleries' => array(),
'parent_type' => '',
'parent_status' => '',
'parent_title' => '',
'parent_errors' => ''
);
if ( ! $add_references ) {
return $references;
}
// Fill in Parent data
$parent_data = MLAQuery::mla_fetch_attachment_parent_data( $parent );
if ( isset( $parent_data['parent_type'] ) ) {
$references['parent_type'] = $parent_data['parent_type'];
}
if ( isset( $parent_data['parent_status'] ) ) {
$references['parent_status'] = $parent_data['parent_status'];
}
if ( isset( $parent_data['parent_title'] ) ) {
$references['parent_title'] = $parent_data['parent_title'];
}
$references['base_file'] = get_post_meta( $ID, '_wp_attached_file', true );
$pathinfo = pathinfo($references['base_file']);
$references['file'] = $pathinfo['basename'];
if ( ( ! isset( $pathinfo['dirname'] ) ) || '.' == $pathinfo['dirname'] ) {
$references['path'] = '/';
} else {
$references['path'] = $pathinfo['dirname'] . '/';
}
$attachment_metadata = get_post_meta( $ID, '_wp_attachment_metadata', true );
$sizes = isset( $attachment_metadata['sizes'] ) ? $attachment_metadata['sizes'] : NULL;
if ( is_array( $sizes ) ) {
// Using the name as the array key ensures each name is added only once
foreach ( $sizes as $size => $size_info ) {
$size_info['size'] = $size;
$references['files'][ $references['path'] . $size_info['file'] ] = $size_info;
}
}
$base_type = wp_check_filetype( $references['file'] );
$base_reference = array(
'file' => $references['file'],
'width' => isset( $attachment_metadata['width'] ) ? $attachment_metadata['width'] : 0,
'height' => isset( $attachment_metadata['height'] ) ? $attachment_metadata['height'] : 0,
'mime_type' => isset( $base_type['type'] ) ? $base_type['type'] : 'unknown',
'size' => 'full',
);
$references['files'][ $references['base_file'] ] = $base_reference;
// Process the where-used settings option
if ('checked' == MLACore::mla_get_option( MLACoreOptions::MLA_EXCLUDE_REVISIONS ) ) {
$exclude_revisions = "(post_type <> 'revision') AND ";
} else {
$exclude_revisions = '';
}
// Accumulate reference test types, e.g., 0 = no tests, 4 = all tests
$reference_tests = 0;
// Look for the "Featured Image(s)", if enabled
if ( MLACore::$process_featured_in ) {
$reference_tests++;
$features = $wpdb->get_results(
"
SELECT post_id
FROM {$wpdb->postmeta}
WHERE meta_key = '_thumbnail_id' AND meta_value = {$ID}
"
);
if ( ! empty( $features ) ) {
foreach ( $features as $feature ) {
$feature_results = $wpdb->get_results(
"
SELECT ID, post_type, post_status, post_title
FROM {$wpdb->posts}
WHERE {$exclude_revisions}(ID = {$feature->post_id})
"
);
if ( ! empty( $feature_results ) ) {
$references['found_reference'] = true;
$references['features'][ $feature->post_id ] = $feature_results[0];
if ( $feature->post_id == $parent ) {
$references['found_parent'] = true;
}
} // ! empty
} // foreach $feature
}
} // $process_featured_in
// Look for item(s) inserted in post_content
$references['inserted_option'] = $inserted_in_option;
if ( MLACore::$process_inserted_in ) {
$reference_tests++;
if ( NULL == $inserted_in_option ) {
$inserted_in_option = MLACore::mla_get_option( MLACoreOptions::MLA_INSERTED_IN_TUNING );
$references['inserted_option'] = $inserted_in_option;
}
if ( 'base' == $inserted_in_option ) {
$query_parameters = array();
$query = array();
$query[] = "SELECT ID, post_type, post_status, post_title, CONVERT(`post_content` USING utf8 ) AS POST_CONTENT FROM {$wpdb->posts} WHERE {$exclude_revisions} ( %s=%s";
$query_parameters[] = '1'; // for empty file name array
$query_parameters[] = '0'; // for empty file name array
foreach ( $references['files'] as $file => $file_data ) {
if ( empty( $file ) ) {
continue;
}
$query[] = 'OR ( POST_CONTENT LIKE %s)';
if ( MLAQuery::$wp_4dot0_plus ) {
$query_parameters[] = '%' . $wpdb->esc_like( $file ) . '%';
} else {
$query_parameters[] = '%' . like_escape( $file ) . '%';
}
}
$query[] = ')';
$query = join(' ', $query);
MLACore::mla_debug_add( __LINE__ . " MLAReferences::mla_fetch_attachment_references_handler( {$ID}, {$parent}, {$add_references} ) inserts base query = " . var_export( $query, true ), MLACore::MLA_DEBUG_CATEGORY_WHERE_USED );
MLACore::mla_debug_add( __LINE__ . " MLAReferences::mla_fetch_attachment_references_handler( {$ID}, {$parent}, {$add_references} ) inserts base parms = " . var_export( $query_parameters, true ), MLACore::MLA_DEBUG_CATEGORY_WHERE_USED );
$inserts = $wpdb->get_results(
$wpdb->prepare( $query, $query_parameters )
);
if ( ! empty( $inserts ) ) {
$references['found_reference'] = true;
$references['inserts'][ $pathinfo['filename'] ] = $inserts;
foreach ( $inserts as $index => $insert ) {
unset( $references['inserts'][ $pathinfo['filename'] ][ $index ]->POST_CONTENT );
if ( $insert->ID == $parent ) {
$references['found_parent'] = true;
}
} // foreach $insert
} // ! empty
} else { // process base names
foreach ( $references['files'] as $file => $file_data ) {
if ( empty( $file ) ) {
continue;
}
if ( MLAQuery::$wp_4dot0_plus ) {
$like = $wpdb->esc_like( $file );
} else {
$like = like_escape( $file );
}
MLACore::mla_debug_add( __LINE__ . " MLAReferences::mla_fetch_attachment_references_handler( {$ID}, {$file}, {$like} ) inserts enabled", MLACore::MLA_DEBUG_CATEGORY_WHERE_USED );
$inserts = $wpdb->get_results(
$wpdb->prepare(
"SELECT ID, post_type, post_status, post_title FROM {$wpdb->posts}
WHERE {$exclude_revisions}(CONVERT(`post_content` USING utf8 ) LIKE %s)", "%{$like}%"
)
);
if ( ! empty( $inserts ) ) {
$references['found_reference'] = true;
$references['inserts'][ $file_data['file'] ] = $inserts;
foreach ( $inserts as $insert ) {
if ( $insert->ID == $parent ) {
$references['found_parent'] = true;
}
} // foreach $insert
} // ! empty
} // foreach $file
} // process intermediate sizes
} // $process_inserted_in
// Look for [mla_gallery] references
if ( MLACore::$process_mla_gallery_in ) {
$reference_tests++;
if ( self::_build_mla_galleries( MLACoreOptions::MLA_MLA_GALLERY_IN_TUNING, self::$mla_galleries, '[mla_gallery', $exclude_revisions ) ) {
$galleries = self::_search_mla_galleries( self::$mla_galleries, $ID );
if ( ! empty( $galleries ) ) {
$references['found_reference'] = true;
$references['mla_galleries'] = $galleries;
foreach ( $galleries as $post_id => $gallery ) {
if ( $post_id == $parent ) {
$references['found_parent'] = true;
}
} // foreach $gallery
} else { // ! empty
$references['mla_galleries'] = array();
}
}
} // $process_mla_gallery_in
// Look for [gallery] references
if ( MLACore::$process_gallery_in ) {
$reference_tests++;
if ( self::_build_mla_galleries( MLACoreOptions::MLA_GALLERY_IN_TUNING, self::$galleries, '[gallery', $exclude_revisions ) ) {
$galleries = self::_search_mla_galleries( self::$galleries, $ID );
if ( ! empty( $galleries ) ) {
$references['found_reference'] = true;
$references['galleries'] = $galleries;
foreach ( $galleries as $post_id => $gallery ) {
if ( $post_id == $parent ) {
$references['found_parent'] = true;
}
} // foreach $gallery
} else { // ! empty
$references['galleries'] = array();
}
}
} // $process_gallery_in
// Evaluate and summarize reference tests
$errors = '';
if ( 0 == $reference_tests ) {
$references['tested_reference'] = false;
$errors .= '(' . __( 'NO REFERENCE TESTS', 'media-library-assistant' ) . ')';
} else {
$references['tested_reference'] = true;
$suffix = ( 4 == $reference_tests ) ? '' : '?';
if ( !$references['found_reference'] ) {
$errors .= '(' . sprintf( __( 'ORPHAN', 'media-library-assistant' ) . '%1$s) ', $suffix );
}
if ( !$references['found_parent'] && ! empty( $references['parent_title'] ) ) {
$errors .= '(' . sprintf( __( 'UNUSED', 'media-library-assistant' ) . '%1$s) ', $suffix );
}
}
if ( $references['is_unattached'] ) {
$errors .= '(' . __( 'UNATTACHED', 'media-library-assistant' ) . ')';
} elseif ( empty( $references['parent_title'] ) ) {
$errors .= '(' . __( 'INVALID PARENT', 'media-library-assistant' ) . ')';
}
$references['parent_errors'] = trim( $errors );
$save_id = $ID;
$references = apply_filters( 'mla_fetch_attachment_references', $references, $ID, $parent );
MLACore::mla_debug_add( __LINE__ . " MLAReferences::mla_fetch_attachment_references_handler( {$ID}, {$parent}, {$add_references} ) references = " . var_export( $references, true ), MLACore::MLA_DEBUG_CATEGORY_WHERE_USED );
return $references;
}
/**
* Add Featured Image and inserted image/link references to an array of attachments
*
* Called from MLAQuery::mla_fetch_attachment_references, which handles conditional
* loading of this file.
*
* @since 1.94
*
* @param array WP_Post objects, passed by reference
*
* @return void updates WP_Post objects with new mla_references property
*/
public static function mla_attachment_array_fetch_references_handler( &$attachments ) {
global $wpdb;
/*
* See element definitions above
*/
$initial_references = array(
'inserted_option' => '',
'tested_reference' => false,
'found_reference' => false,
'found_parent' => false,
'is_unattached' => true,
'base_file' => '',
'path' => '',
'file' => '',
'files' => array(),
'features' => array(),
'inserts' => array(),
'mla_galleries' => array(),
'galleries' => array(),
'parent_type' => '',
'parent_status' => '',
'parent_title' => '',
'parent_errors' => ''
);
$inserted_in_option = MLACore::mla_get_option( MLACoreOptions::MLA_INSERTED_IN_TUNING );
$initial_references['inserted_option'] = $inserted_in_option;
/*
* Make sure there's work to do; otherwise initialize the attachment data and return
*/
if ( false == ( MLACore::$process_featured_in || MLACore::$process_inserted_in || MLACore::$process_gallery_in || MLACore::$process_mla_gallery_in ) ) {
foreach ( $attachments as $attachment_index => $attachment ) {
$attachments[ $attachment_index ]->mla_references = $initial_references;
}
return;
}
/*
* Collect the raw data for where-used analysis
*/
$attachment_ids = array();
$files = array();
foreach ( $attachments as $index => $attachment ) {
$attachment_ids[ $index ] = $attachment->ID;
$references = array( 'files' => array() );
if ( isset( $attachment->mla_wp_attached_file ) ) {
$references['base_file'] = $attachment->mla_wp_attached_file;
} else {
$references['base_file'] = '';
}
$pathinfo = pathinfo($references['base_file']);
if ( ( ! isset( $pathinfo['dirname'] ) ) || '.' == $pathinfo['dirname'] ) {
$references['path'] = '/';
} else {
$references['path'] = $pathinfo['dirname'] . '/';
}
$references['file'] = $pathinfo['basename'];
if ( isset( $attachment->mla_wp_attachment_metadata ) ) {
$attachment_metadata = $attachment->mla_wp_attachment_metadata;
} else {
$attachment_metadata = '';
}
$sizes = isset( $attachment_metadata['sizes'] ) ? $attachment_metadata['sizes'] : NULL;
if ( ! empty( $sizes ) && is_array( $sizes ) ) {
/* Using the path and name as the array key ensures each name is added only once */
foreach ( $sizes as $size => $size_info ) {
$size_info['size'] = $size;
$references['files'][ $references['path'] . $size_info['file'] ] = $size_info;
}
}
if ( ! empty( $references['base_file'] ) ) {
$base_type = wp_check_filetype( $references['file'] );
$base_reference = array(
'file' => $references['file'],
'width' => isset( $attachment_metadata['width'] ) ? $attachment_metadata['width'] : 0,
'height' => isset( $attachment_metadata['height'] ) ? $attachment_metadata['height'] : 0,
'mime_type' => ( isset( $base_type['type'] ) && false !== $base_type['type'] ) ? $base_type['type'] : 'unknown',
'size' => 'full',
);
$references['files'][ $references['base_file'] ] = $base_reference;
}
$files[ $index ] = $references;
}
if ('checked' == MLACore::mla_get_option( MLACoreOptions::MLA_EXCLUDE_REVISIONS ) ) {
$exclude_revisions = " AND (p.post_type <> 'revision')";
} else {
$exclude_revisions = '';
}
$features = array();
if ( MLACore::$process_featured_in && ! empty( $attachment_ids ) ) {
$attachment_ids = implode( ',', $attachment_ids );
$results = $wpdb->get_results(
"
SELECT m.meta_value, p.ID, p.post_type, p.post_status, p.post_title
FROM {$wpdb->postmeta} AS m INNER JOIN {$wpdb->posts} AS p ON m.post_id = p.ID
WHERE ( m.meta_key = '_thumbnail_id' )
AND ( m.meta_value IN ( {$attachment_ids} ) ){$exclude_revisions}
"
);
foreach ( $results as $result ) {
$features[ $result->meta_value ][ $result->ID ] = (object) array( 'ID' => $result->ID, 'post_title' => $result->post_title, 'post_type' => $result->post_type, 'post_status' => $result->post_status );
}
} // $process_featured_in
if ( ! empty( $exclude_revisions ) ) {
$exclude_revisions = " AND (post_type <> 'revision')";
}
if ( MLACore::$process_inserted_in ) {
$query_parameters = array();
$query = array();
$query[] = "SELECT ID, post_type, post_status, post_title, CONVERT(`post_content` USING utf8 ) AS POST_CONTENT FROM {$wpdb->posts} WHERE ( %s=%s";
// for empty file name array
$query_parameters[] = '1';
$query_parameters[] = '0';
foreach ( $files as $file ) {
foreach ( $file['files'] as $base_name => $file_data ) {
$query[] = 'OR ( POST_CONTENT LIKE %s)';
if ( MLAQuery::$wp_4dot0_plus ) {
$query_parameters[] = '%' . $wpdb->esc_like( $base_name ) . '%';
} else {
$query_parameters[] = '%' . like_escape( $base_name ) . '%';
}
}
}
$query[] = "){$exclude_revisions}";
$query = join(' ', $query);
$results = $wpdb->get_results(
$wpdb->prepare( $query, $query_parameters )
);
/*
* Match each post with inserts back to the attachments
*/
$inserts = array();
if ( ! empty( $results ) ) {
foreach ( $files as $index => $file ) {
foreach ( $file['files'] as $base_name => $file_data ) {
foreach ( $results as $result ) {
if ( false !== strpos( $result->POST_CONTENT, $base_name ) ) {
$insert = clone $result;
unset( $insert->POST_CONTENT);
$insert->file_name = $file_data['file'];
$inserts[ $index ][] = $insert;
}
} // foreach post with inserts
} // foreach base_name
} // foreach attachment
} // results
} // process_inserted_in
if ( MLACore::$process_mla_gallery_in ) {
$have_mla_galleries = self::_build_mla_galleries( MLACoreOptions::MLA_MLA_GALLERY_IN_TUNING, self::$mla_galleries, '[mla_gallery', $exclude_revisions );
} else {
$have_mla_galleries = false;
}
if ( MLACore::$process_gallery_in ) {
$have_galleries = self::_build_mla_galleries( MLACoreOptions::MLA_GALLERY_IN_TUNING, self::$galleries, '[gallery', $exclude_revisions );
} else {
$have_mla_galleries = false;
}
foreach ( $attachments as $attachment_index => $attachment ) {
$references = array_merge( $initial_references, $files[ $attachment_index ] );
/*
* Fill in Parent data
*/
if ( ( (int) $attachment->post_parent ) === 0 ) {
$references['is_unattached'] = true;
} else {
$references['is_unattached'] = false;
if ( isset( $attachment->parent_type ) ) {
$references['parent_type'] = $attachment->parent_type;
}
if ( isset( $attachment->parent_status ) ) {
$references['parent_status'] = $attachment->parent_status;
}
if ( isset( $attachment->parent_title ) ) {
$references['parent_title'] = $attachment->parent_title;
}
}
/*
* Accumulate reference test types, e.g., 0 = no tests, 4 = all tests
*/
$reference_tests = 0;
/*
* Look for the "Featured Image(s)", if enabled
*/
if ( MLACore::$process_featured_in ) {
$reference_tests++;
if ( isset( $features[ $attachment->ID ] ) ) {
foreach ( $features[ $attachment->ID ] as $id => $feature ) {
$references['found_reference'] = true;
$references['features'][ $id ] = $feature;
if ( $id == $attachment->post_parent ) {
$references['found_parent'] = true;
}
} // foreach $feature
}
} // $process_featured_in
/*
* Look for item(s) inserted in post_content
*/
if ( MLACore::$process_inserted_in ) {
$reference_tests++;
if ( isset( $inserts[ $attachment_index ] ) ) {
$references['found_reference'] = true;
foreach( $inserts[ $attachment_index ] as $insert ) {
$ref_insert = clone $insert;
unset( $ref_insert->file_name );
if ( 'base' == $inserted_in_option ) {
$ref_key = pathinfo( $references['base_file'], PATHINFO_FILENAME );
} else {
$ref_key = $insert->file_name;
}
$references['inserts'][ $ref_key ][ $insert->ID ] = $ref_insert;
if ( $insert->ID == $attachment->post_parent ) {
$references['found_parent'] = true;
}
} // each insert
} else {
$references['inserts'] = array();
}
} // $process_inserted_in
/*
* Look for [mla_gallery] references
*/
if ( MLACore::$process_mla_gallery_in ) {
$reference_tests++;
if ( self::_build_mla_galleries( MLACoreOptions::MLA_MLA_GALLERY_IN_TUNING, self::$mla_galleries, '[mla_gallery', $exclude_revisions ) ) {
$galleries = self::_search_mla_galleries( self::$mla_galleries, $attachment->ID );
if ( ! empty( $galleries ) ) {
$references['found_reference'] = true;
$references['mla_galleries'] = $galleries;
foreach ( $galleries as $post_id => $gallery ) {
if ( $post_id == $attachment->post_parent ) {
$references['found_parent'] = true;
}
} // foreach $gallery
} else { // ! empty
$references['mla_galleries'] = array();
}
}
} // $process_mla_gallery_in
/*
* Look for [gallery] references
*/
if ( MLACore::$process_gallery_in ) {
$reference_tests++;
if ( self::_build_mla_galleries( MLACoreOptions::MLA_GALLERY_IN_TUNING, self::$galleries, '[gallery', $exclude_revisions ) ) {
$galleries = self::_search_mla_galleries( self::$galleries, $attachment->ID );
if ( ! empty( $galleries ) ) {
$references['found_reference'] = true;
$references['galleries'] = $galleries;
foreach ( $galleries as $post_id => $gallery ) {
if ( $post_id == $attachment->post_parent ) {
$references['found_parent'] = true;
}
} // foreach $gallery
} else { // ! empty
$references['galleries'] = array();
}
}
} // $process_gallery_in
/*
* Evaluate and summarize reference tests
*/
$errors = '';
if ( 0 == $reference_tests ) {
$references['tested_reference'] = false;
$errors .= '(' . __( 'NO REFERENCE TESTS', 'media-library-assistant' ) . ')';
} else {
$references['tested_reference'] = true;
$suffix = ( 4 == $reference_tests ) ? '' : '?';
if ( !$references['found_reference'] ) {
$errors .= '(' . sprintf( __( 'ORPHAN', 'media-library-assistant' ) . '%1$s) ', $suffix );
}
if ( !$references['found_parent'] && ! empty( $references['parent_title'] ) ) {
$errors .= '(' . sprintf( __( 'UNUSED', 'media-library-assistant' ) . '%1$s) ', $suffix );
}
}
if ( $references['is_unattached'] ) {
$errors .= '(' . __( 'UNATTACHED', 'media-library-assistant' ) . ')';
} elseif ( empty( $references['parent_title'] ) ) {
$errors .= '(' . __( 'INVALID PARENT', 'media-library-assistant' ) . ')';
}
$references['parent_errors'] = trim( $errors );
$attachments[ $attachment_index ]->mla_references = apply_filters( 'mla_fetch_attachment_references', $references, $attachment->ID, (int) $attachment->post_parent );
} // foreach $attachment
}
/**
* Objects containing [gallery] shortcodes
*
* This array contains all of the objects containing one or more [gallery] shortcodes
* and array(s) of which attachments each [gallery] contains. The arrays are built once
* each page load and cached for subsequent calls.
*
* The outer array is keyed by post_id. It contains an associative array with:
* ['parent_title'] post_title of the gallery parent,
* ['parent_type'] 'post' or 'page' or the custom post_type of the gallery parent,
* ['parent_status'] 'publish', 'private', 'future', 'pending', 'draft'
* ['results'] array ( ID => ID ) of attachments appearing in ANY of the parent's galleries.
* ['galleries'] array of [gallery] entries numbered from one (1), containing:
* galleries[X]['query'] contains a string with the arguments of the [gallery],
* galleries[X]['results'] contains an array ( ID ) of post_ids for the objects in the gallery.
*
* @since 0.70
*
* @var array
*/
private static $galleries = NULL;
/**
* Objects containing [mla_gallery] shortcodes
*
* This array contains all of the objects containing one or more [mla_gallery] shortcodes
* and array(s) of which attachments each [mla_gallery] contains. The arrays are built once
* each page load and cached for subsequent calls.
*
* @since 0.70
*
* @var array
*/
private static $mla_galleries = NULL;
/**
* Invalidates the $mla_galleries or $galleries array and cached values
*
* Called from MLAQuery::mla_flush_mla_galleries, which handles conditional
* loading of this file.
*
* @since 1.00
*
* @param string name of the gallery's cache/option variable
*
* @return void
*/
public static function mla_flush_mla_galleries_handler( $option_name ) {
switch ( $option_name ) {
case MLACoreOptions::MLA_GALLERY_IN_TUNING:
self::$galleries = NULL;
break;
case MLACoreOptions::MLA_MLA_GALLERY_IN_TUNING:
self::$mla_galleries = NULL;
break;
default:
// ignore everything else
} // switch
}
/**
* Builds the $mla_galleries or $galleries array
*
* @since 0.70
*
* @param string name of the gallery's cache/option variable
* @param array by reference to the private static galleries array variable
* @param string the shortcode to be searched for and processed
* @param boolean true to exclude revisions from the search
*
* @return boolean true if the galleries array is not empty
*/
private static function _build_mla_galleries( $option_name, &$galleries_array, $shortcode, $exclude_revisions ) {
global $wpdb, $post;
if ( is_array( $galleries_array ) ) {
if ( ! empty( $galleries_array ) ) {
return true;
} else {
return false;
}
}
$option_value = MLACore::mla_get_option( $option_name );
if ( 'disabled' == $option_value ) {
return false;
} elseif ( 'cached' == $option_value ) {
$galleries_array = get_transient( MLA_OPTION_PREFIX . 't_' . $option_name );
if ( is_array( $galleries_array ) ) {
if ( ! empty( $galleries_array ) ) {
return true;
} else {
return false;
}
} else {
$galleries_array = NULL;
}
} // cached
/*
* The MLAShortcodes class is only loaded when needed.
*/
if ( !class_exists( 'MLAShortcodes' ) ) {
require_once( MLA_PLUGIN_PATH . 'includes/class-mla-shortcodes.php' );
}
/*
* $galleries_array is null, so build the array
*/
$galleries_array = array();
if ( $exclude_revisions ) {
$exclude_revisions = "(post_type <> 'revision') AND ";
} else {
$exclude_revisions = '';
}
if ( MLAQuery::$wp_4dot0_plus ) {
$like = $wpdb->esc_like( $shortcode );
} else {
$like = like_escape( $shortcode );
}
$results = $wpdb->get_results(
$wpdb->prepare(
"
SELECT ID, post_type, post_status, post_title, post_content
FROM {$wpdb->posts}
WHERE {$exclude_revisions}(
CONVERT(`post_content` USING utf8 )
LIKE %s)
", "%{$like}%"
)
);
if ( empty( $results ) ) {
return false;
}
foreach ( $results as $result ) {
$count = preg_match_all( "/\\{$shortcode}([^\\]]*)\\]/", $result->post_content, $matches, PREG_PATTERN_ORDER );
if ( $count ) {
$result_id = $result->ID;
$galleries_array[ $result_id ]['parent_title'] = $result->post_title;
$galleries_array[ $result_id ]['parent_type'] = $result->post_type;
$galleries_array[ $result_id ]['parent_status'] = $result->post_status;
$galleries_array[ $result_id ]['results'] = array();
$galleries_array[ $result_id ]['galleries'] = array();
$instance = 0;
foreach ( $matches[1] as $index => $match ) {
/*
* Filter out shortcodes that are not an exact match
*/
if ( empty( $match ) || ( ' ' == substr( $match, 0, 1 ) ) ) {
$instance++;
/*
* Remove trailing "/" from XHTML-style self-closing shortcodes
*/
$galleries_array[ $result_id ]['galleries'][ $instance ]['query'] = trim( rtrim( $matches[1][$index], '/' ) );
$galleries_array[ $result_id ]['galleries'][ $instance ]['results'] = array();
$post = $result; // set global variable for mla_gallery_shortcode
$attachments = MLAShortcodes::mla_get_shortcode_attachments( $result_id, $galleries_array[ $result_id ]['galleries'][ $instance ]['query'] . ' cache_results=false update_post_meta_cache=false update_post_term_cache=false where_used_query=this-is-a-where-used-query' );
if ( is_string( $attachments ) ) {
/* translators: 1: post_type, 2: post_title, 3: post ID, 4: query string, 5: error message */
trigger_error( htmlentities( sprintf( __( '(%1$s) %2$s (ID %3$d) query "%4$s" failed, returning "%5$s"', 'media-library-assistant' ), $result->post_type, $result->post_title, $result->ID, $galleries_array[ $result_id ]['galleries'][ $instance ]['query'], $attachments) ), E_USER_WARNING );
} elseif ( ! empty( $attachments ) ) {
foreach ( $attachments as $attachment ) {
$galleries_array[ $result_id ]['results'][ $attachment->ID ] = $attachment->ID;
$galleries_array[ $result_id ]['galleries'][ $instance ]['results'][] = $attachment->ID;
}
}
} // exact match
} // foreach $match
} // if $count
} // foreach $result
/*
* Maybe cache the results
*/
if ( 'cached' == $option_value ) {
set_transient( MLA_OPTION_PREFIX . 't_' . $option_name, $galleries_array, 900 ); // fifteen minutes
}
return true;
}
/**
* Search the $mla_galleries or $galleries array
*
* @since 0.70
*
* @param array by reference to the private static galleries array variable
* @param int the attachment ID to be searched for and processed
*
* @return array All posts/pages with one or more galleries that include the attachment.
* The array key is the parent_post ID; each entry contains post_title and post_type.
*/
private static function _search_mla_galleries( &$galleries_array, $attachment_id ) {
$gallery_refs = array();
if ( ! empty( $galleries_array ) ) {
foreach ( $galleries_array as $parent_id => $gallery ) {
if ( in_array( $attachment_id, $gallery['results'] ) ) {
$gallery_refs[ $parent_id ] = array ( 'ID' => $parent_id, 'post_title' => $gallery['parent_title'], 'post_type' => $gallery['parent_type'], 'post_status' => $gallery['parent_status'] );
}
} // foreach gallery
} // ! empty
return $gallery_refs;
}
} // class MLAReferences
?>