Created
March 5, 2015 13:49
-
-
Save shankie-codes/dc5595be4d6093fc2571 to your computer and use it in GitHub Desktop.
Get_The_Image
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
/** | |
* Plugin Name: Get The Image | |
* Plugin URI: http://themehybrid.com/plugins/get-the-image | |
* Description: This is a highly intuitive script that can grab an image by custom field, featured image, post attachment, or extracting it from the post's content. | |
* Version: 1.0.1 | |
* Author: Justin Tadlock | |
* Author URI: http://justintadlock.com | |
*/ | |
/** | |
* Get the Image - An advanced post image script for WordPress. | |
* | |
* Get the Image was created to be a highly-intuitive image script that displays post-specific images (an | |
* image-based representation of a post). The script handles old-style post images via custom fields for | |
* backwards compatibility. It also supports WordPress' built-in featured image functionality. On top of | |
* those things, it can automatically set attachment images as the post image or scan the post content for | |
* the first image element used. It can also fall back to a given default image. | |
* | |
* This program is free software; you can redistribute it and/or modify it under the terms of the GNU | |
* General Public License as published by the Free Software Foundation; either version 2 of the License, | |
* or (at your option) any later version. | |
* | |
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without | |
* even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. | |
* | |
* @package GetTheImage | |
* @version 1.0.1 | |
* @author Justin Tadlock <[email protected]> | |
* @copyright Copyright (c) 2008 - 2014, Justin Tadlock | |
* @link http://justintadlock.com/archives/2008/05/27/get-the-image-wordpress-plugin | |
* @license http://www.gnu.org/licenses/old-licenses/gpl-2.0.html | |
*/ | |
/* Adds theme support for WordPress 'featured images'. */ | |
add_theme_support( 'post-thumbnails' ); | |
/* Delete the cache when a post or post metadata is updated. */ | |
add_action( 'save_post', 'get_the_image_delete_cache_by_post' ); | |
add_action( 'deleted_post_meta', 'get_the_image_delete_cache_by_meta', 10, 2 ); | |
add_action( 'updated_post_meta', 'get_the_image_delete_cache_by_meta', 10, 2 ); | |
add_action( 'added_post_meta', 'get_the_image_delete_cache_by_meta', 10, 2 ); | |
/** | |
* The main image function for displaying an image. This is a wrapper for the Get_The_Image class. Use this | |
* function in themes rather than the class. | |
* | |
* @since 0.1.0 | |
* @access public | |
* @param array $args Arguments for how to load and display the image. | |
* @return string|array The HTML for the image. | Image attributes in an array. | |
*/ | |
function get_the_image( $args = array() ) { | |
$image = new Get_The_Image( $args ); | |
return $image->get_image(); | |
} | |
/* === Internal Plugin Code: Don't use the below unless you know what you're doing. Expect breakage. === */ | |
/** | |
* Class for getting images related to a post. Only use this class in your projects if you absolutely know | |
* what you're doing and expect your code to break in future versions. Use the the `get_the_image()` | |
* wrapper function instead. That's the reason it exists. | |
* | |
* @since 1.0.0 | |
* @access private | |
*/ | |
final class Get_The_Image { | |
/** | |
* Array of arguments passed in by the user and merged with the defaults. | |
* | |
* @since 1.0.0 | |
* @access public | |
* @var array | |
*/ | |
public $args = array(); | |
/** | |
* Image arguments array filled by the class. This is used to store data about the image (src, | |
* width, height, etc.). In some scenarios, it may not be set, particularly when getting the | |
* raw image HTML. | |
* | |
* @since 1.0.0 | |
* @access public | |
* @var array | |
*/ | |
public $image_args = array(); | |
/** | |
* The image HTML to output. | |
* | |
* @since 1.0.0 | |
* @access public | |
* @var string | |
*/ | |
public $image = ''; | |
/** | |
* Original image HTML. This is set when splitting an image from the content. By default, this | |
* is only used when 'scan_raw' is set. | |
* | |
* @since 1.0.0 | |
* @access public | |
* @var array | |
*/ | |
public $original_image = ''; | |
/** | |
* Constructor method. This sets up and runs the show. | |
* | |
* @since 1.0.0 | |
* @access public | |
* @param array $args | |
* @return void | |
*/ | |
public function __construct( $args = array() ) { | |
global $wp_embed; | |
/* Use WP's embed functionality to handle the [embed] shortcode and autoembeds. */ | |
add_filter( 'get_the_image_post_content', array( $wp_embed, 'run_shortcode' ) ); | |
add_filter( 'get_the_image_post_content', array( $wp_embed, 'autoembed' ) ); | |
/* Set the default arguments. */ | |
$defaults = array( | |
/* Post the image is associated with. */ | |
'post_id' => get_the_ID(), | |
/* Method order (see methods below). */ | |
'order' => array( 'meta_key', 'featured', 'attachment', 'scan', 'scan_raw', 'callback', 'default' ), | |
/* Methods of getting an image (in order). */ | |
'meta_key' => array( 'Thumbnail', 'thumbnail' ), // array|string | |
'featured' => true, | |
'attachment' => true, | |
'scan' => false, | |
'scan_raw' => false, // Note: don't use the array format option with this. | |
'callback' => null, | |
'default' => false, | |
/* Split image from post content (by default, only used with the 'scan_raw' option). */ | |
'split_content' => false, | |
/* Attachment-specific arguments. */ | |
'size' => has_image_size( 'post-thumbnail' ) ? 'post-thumbnail' : 'thumbnail', | |
/* Format/display of image. */ | |
'link_to_post' => true, | |
'image_class' => false, | |
'width' => false, | |
'height' => false, | |
'before' => '', | |
'after' => '', | |
/* Minimum allowed sizes. */ | |
'min_width' => 0, | |
'min_height' => 0, | |
/* Captions. */ | |
'caption' => false, // Default WP [caption] requires a width. | |
/* Saving the image. */ | |
'meta_key_save' => false, // Save as metadata (string). | |
'thumbnail_id_save' => false, // Set 'featured image'. | |
'cache' => true, // Cache the image. | |
/* Return/echo image. */ | |
'format' => 'img', | |
'echo' => true, | |
/* Deprecated arguments. */ | |
'custom_key' => null, // @deprecated 0.6.0 Use 'meta_key'. | |
'default_size' => null, // @deprecated 0.5.0 Use 'size'. | |
'the_post_thumbnail' => null, // @deprecated 1.0.0 Use 'featured'. | |
'image_scan' => null, // @deprecated 1.0.0 Use 'scan' or 'scan_raw'. | |
'default_image' => null, // @deprecated 1.0.0 Use 'default'. | |
'order_of_image' => null, // @deprecated 1.0.0 No replacement. | |
); | |
/* Allow plugins/themes to filter the arguments. */ | |
$this->args = apply_filters( | |
'get_the_image_args', | |
wp_parse_args( $args, $defaults ) | |
); | |
/* If no post ID, return. */ | |
if ( empty( $this->args['post_id'] ) ) | |
return false; | |
/* === Handle deprecated arguments. === */ | |
/* If $default_size is given, overwrite $size. */ | |
if ( !is_null( $this->args['default_size'] ) ) | |
$this->args['size'] = $this->args['default_size']; | |
/* If $custom_key is set, overwrite $meta_key. */ | |
if ( !is_null( $this->args['custom_key'] ) ) | |
$this->args['meta_key'] = $this->args['custom_key']; | |
/* If 'the_post_thumbnail' is set, overwrite 'featured'. */ | |
if ( !is_null( $this->args['the_post_thumbnail'] ) ) | |
$this->args['featured'] = $this->args['the_post_thumbnail']; | |
/* If 'image_scan' is set, overwrite 'scan'. */ | |
if ( !is_null( $this->args['image_scan'] ) ) | |
$this->args['scan'] = $this->args['image_scan']; | |
/* If 'default_image' is set, overwrite 'default'. */ | |
if ( !is_null( $this->args['default_image'] ) ) | |
$this->args['default'] = $this->args['default_image']; | |
/* === End deprecated arguments. === */ | |
/* If $format is set to 'array', don't link to the post. */ | |
if ( 'array' == $this->args['format'] ) | |
$this->args['link_to_post'] = false; | |
/* Find images. */ | |
$this->find(); | |
/* Only used if $original_image is set. */ | |
if ( true === $this->args['split_content'] && !empty( $this->original_image ) ) | |
add_filter( 'the_content', array( $this, 'split_content' ), 9 ); | |
} | |
/** | |
* Returns the image HTML or image array. | |
* | |
* @since 1.0.0 | |
* @access public | |
* @return void | |
*/ | |
public function get_image() { | |
/* Allow plugins/theme to override the final output. */ | |
$image_html = apply_filters( 'get_the_image', $this->image ); | |
/* If $format is set to 'array', return an array of image attributes. */ | |
if ( 'array' === $this->args['format'] ) { | |
/* Set up a default empty array. */ | |
$out = array(); | |
/* Get the image attributes. */ | |
$atts = wp_kses_hair( $image_html, array( 'http', 'https' ) ); | |
/* Loop through the image attributes and add them in key/value pairs for the return array. */ | |
foreach ( $atts as $att ) | |
$out[ $att['name'] ] = $att['value']; | |
/* Return the array of attributes. */ | |
return $out; | |
} | |
/* Or, if $echo is set to false, return the formatted image. */ | |
elseif ( false === $this->args['echo'] ) { | |
return !empty( $image_html ) ? $this->args['before'] . $image_html . $this->args['after'] : $image_html; | |
} | |
/* If there is a $post_thumbnail_id, do the actions associated with get_the_post_thumbnail(). */ | |
if ( isset( $this->image_args['post_thumbnail_id'] ) ) | |
do_action( 'begin_fetch_post_thumbnail_html', $this->args['post_id'], $this->image_args['post_thumbnail_id'], $this->args['size'] ); | |
/* Display the image if we get to this point. */ | |
echo !empty( $image_html ) ? $this->args['before'] . $image_html . $this->args['after'] : $image_html; | |
/* If there is a $post_thumbnail_id, do the actions associated with get_the_post_thumbnail(). */ | |
if ( isset( $this->image_args['post_thumbnail_id'] ) ) | |
do_action( 'end_fetch_post_thumbnail_html', $this->args['post_id'], $this->image_args['post_thumbnail_id'], $this->args['size'] ); | |
} | |
/** | |
* Figures out if we have an image related to the post. Runs through the various methods of getting | |
* an image. If there's a cached image, we'll just use that. | |
* | |
* @since 1.0.0 | |
* @access public | |
* @return void | |
*/ | |
public function find() { | |
/* Get cache key based on $this->args. */ | |
$key = md5( serialize( compact( array_keys( $this->args ) ) ) ); | |
/* Check for a cached image. */ | |
$image_cache = wp_cache_get( $this->args['post_id'], 'get_the_image' ); | |
if ( !is_array( $image_cache ) ) | |
$image_cache = array(); | |
/* If there is no cached image, let's see if one exists. */ | |
if ( !isset( $image_cache[ $key ] ) || empty( $cache ) ) { | |
foreach ( $this->args['order'] as $method ) { | |
if ( !empty( $this->image ) || !empty( $this->image_args ) ) | |
break; | |
if ( 'meta_key' === $method && !empty( $this->args['meta_key'] ) ) | |
$this->get_meta_key_image(); | |
elseif ( 'featured' === $method && true === $this->args['featured'] ) | |
$this->get_featured_image(); | |
elseif ( 'attachment' === $method && true === $this->args['attachment'] ) | |
$this->get_attachment_image(); | |
elseif ( 'scan' === $method && true === $this->args['scan'] ) | |
$this->get_scan_image(); | |
elseif ( 'scan_raw' === $method && true === $this->args['scan_raw']) | |
$this->get_scan_raw_image(); | |
elseif ( 'callback' === $method && !is_null( $this->args['callback'] ) ) | |
$this->get_callback_image(); | |
elseif ( 'default' === $method && !empty( $this->args['default'] ) ) | |
$this->get_default_image(); | |
} | |
/* Format the image HTML. */ | |
if ( empty( $this->image ) && !empty( $this->image_args ) ) | |
$this->format_image(); | |
/* If we have image HTML. */ | |
if ( !empty( $this->image ) ) { | |
/* Save the image as metadata. */ | |
if ( !empty( $this->args['meta_key_save'] ) ) | |
$this->meta_key_save(); | |
/* Set the image cache for the specific post. */ | |
$image_cache[ $key ] = $this->image; | |
wp_cache_set( $this->args['post_id'], $image_cache, 'get_the_image' ); | |
} | |
} | |
/* If an image was already cached for the post and arguments, use it. */ | |
else { | |
$this->image = $image_cache[ $key ]; | |
} | |
} | |
/** | |
* Gets a image by post meta key. | |
* | |
* @since 1.0.0 | |
* @access public | |
* @return void | |
*/ | |
public function get_meta_key_image() { | |
/* If $meta_key is not an array. */ | |
if ( !is_array( $this->args['meta_key'] ) ) | |
$this->args['meta_key'] = array( $this->args['meta_key'] ); | |
/* Loop through each of the given meta keys. */ | |
foreach ( $this->args['meta_key'] as $meta_key ) { | |
/* Get the image URL by the current meta key in the loop. */ | |
$image = get_post_meta( $this->args['post_id'], $meta_key, true ); | |
/* If an image was found, break out of the loop. */ | |
if ( !empty( $image ) ) | |
break; | |
} | |
/* If there's an image and it is numeric, assume it is an attachment ID. */ | |
if ( !empty( $image ) && is_numeric( $image ) ) | |
$this->_get_image_attachment( absint( $image ) ); | |
/* Else, assume the image is a file URL. */ | |
elseif ( !empty( $image ) ) | |
$this->image_args = array( 'src' => $image ); | |
} | |
/** | |
* Gets the featured image (i.e., WP's post thumbnail). | |
* | |
* @since 1.0.0 | |
* @access public | |
* @return void | |
*/ | |
public function get_featured_image() { | |
/* Check for a post image ID (set by WP as a custom field). */ | |
$post_thumbnail_id = get_post_thumbnail_id( $this->args['post_id'] ); | |
/* If no post image ID is found, return. */ | |
if ( empty( $post_thumbnail_id ) ) | |
return; | |
/* Apply filters on post_thumbnail_size because this is a default WP filter used with its image feature. */ | |
$this->args['size'] = apply_filters( 'post_thumbnail_size', $this->args['size'] ); | |
/* Set the image args. */ | |
$this->_get_image_attachment( $post_thumbnail_id ); | |
/* Add the post thumbnail ID. */ | |
$this->image_args['post_thumbnail_id'] = $post_thumbnail_id; | |
} | |
/** | |
* Gets the first image attached to the post. If the post itself is an attachment image, that will | |
* be the image used. This method also works with sub-attachments (images for audio/video attachments | |
* are a good example). | |
* | |
* @since 1.0.0 | |
* @access public | |
* @return void | |
*/ | |
public function get_attachment_image() { | |
/* Check if the post itself is an image attachment. */ | |
if ( wp_attachment_is_image( $this->args['post_id'] ) ) { | |
$attachment_id = $this->args['post_id']; | |
} | |
/* If the post is not an image attachment, check if it has any image attachments. */ | |
else { | |
/* Get attachments for the inputted $post_id. */ | |
$attachments = get_children( | |
array( | |
'numberposts' => 1, | |
'post_parent' => $this->args['post_id'], | |
'post_status' => 'inherit', | |
'post_type' => 'attachment', | |
'post_mime_type' => 'image', | |
'order' => 'ASC', | |
'orderby' => 'menu_order ID', | |
'fields' => 'ids' | |
) | |
); | |
/* Check if any attachments were found. */ | |
if ( !empty( $attachments ) ) | |
$attachment_id = array_shift( $attachments ); | |
} | |
if ( !empty( $attachment_id ) ) | |
$this->_get_image_attachment( $attachment_id ); | |
} | |
/** | |
* Scans the post content for an image. It first scans and checks for an image with the | |
* "wp-image-xxx" ID. If that exists, it'll grab the actual image attachment. If not, it looks | |
* for the image source. | |
* | |
* @since 1.0.0 | |
* @access public | |
* @return void | |
*/ | |
public function get_scan_image() { | |
/* Get the post content. */ | |
$post_content = get_post_field( 'post_content', $this->args['post_id'] ); | |
/* Apply filters to content. */ | |
$post_content = apply_filters( 'get_the_image_post_content', $post_content ); | |
/* Check the content for `id="wp-image-%d"`. */ | |
preg_match( '/id=[\'"]wp-image-([\d]*)[\'"]/i', $post_content, $image_ids ); | |
/* Loop through any found image IDs. */ | |
if ( is_array( $image_ids ) ) { | |
foreach ( $image_ids as $image_id ) { | |
$this->_get_image_attachment( $image_id ); | |
if ( !empty( $this->image_args ) ) | |
return; | |
} | |
} | |
/* Search the post's content for the <img /> tag and get its URL. */ | |
preg_match_all( '|<img.*?src=[\'"](.*?)[\'"].*?>|i', $post_content, $matches ); | |
/* If there is a match for the image, set the image args. */ | |
if ( isset( $matches ) && !empty( $matches[1][0] ) ) | |
$this->image_args = array( 'src' => $matches[1][0] ); | |
} | |
/** | |
* Scans the post content for a complete image. This method will attempt to grab the complete | |
* HTML for an image. If an image is found, pretty much all arguments passed in may be ignored | |
* in favor of getting the actual image used in the post content. It works with both captions | |
* and linked images. However, it can't account for all possible HTML wrappers for images used | |
* in all setups. | |
* | |
* This method was created for use with the WordPress "image" post format where theme authors | |
* might want to pull the whole image from the content as the user added it. It's also meant | |
* to be used (not required) with the `split_content` option. | |
* | |
* Note: This option should not be used if returning the image as an array. If that's desired, | |
* use the `scan` option instead. | |
* | |
* @since 1.0.0 | |
* @access public | |
* @return void | |
*/ | |
public function get_scan_raw_image() { | |
/* Get the post content. */ | |
$post_content = get_post_field( 'post_content', $this->args['post_id'] ); | |
/* Apply filters to content. */ | |
$post_content = apply_filters( 'get_the_image_post_content', $post_content ); | |
/* Finds matches for shortcodes in the content. */ | |
preg_match_all( '/' . get_shortcode_regex() . '/s', $post_content, $matches, PREG_SET_ORDER ); | |
if ( !empty( $matches ) ) { | |
foreach ( $matches as $shortcode ) { | |
if ( in_array( $shortcode[2], array( 'caption', 'wp_caption' ) ) ) { | |
preg_match( '#id=[\'"]attachment_([\d]*)[\'"]|class=[\'"].*?wp-image-([\d]*).*?[\'"]#i', $shortcode[0], $matches ); | |
if ( !empty( $matches ) && isset( $matches[1] ) || isset( $matches[2] ) ) { | |
$attachment_id = !empty( $matches[1] ) ? absint( $matches[1] ) : absint( $matches[2] ); | |
$image_src = wp_get_attachment_image_src( $attachment_id, $this->args['size'] ); | |
if ( !empty( $image_src ) ) { | |
/* old-style captions. */ | |
if ( preg_match( '#.*?[\s]caption=[\'"](.+?)[\'"]#i', $shortcode[0], $caption_matches ) ) | |
$image_caption = trim( $caption_matches[1] ); | |
$caption_args = array( | |
'width' => $image_src[1], | |
'align' => 'center' | |
); | |
if ( !empty( $image_caption ) ) | |
$caption_args['caption'] = $image_caption; | |
/* Set up the patterns for the 'src', 'width', and 'height' attributes. */ | |
$patterns = array( | |
'/(src=[\'"]).+?([\'"])/i', | |
'/(width=[\'"]).+?([\'"])/i', | |
'/(height=[\'"]).+?([\'"])/i', | |
); | |
/* Set up the replacements for the 'src', 'width', and 'height' attributes. */ | |
$replacements = array( | |
'${1}' . $image_src[0] . '${2}', | |
'${1}' . $image_src[1] . '${2}', | |
'${1}' . $image_src[2] . '${2}', | |
); | |
/* Filter the image attributes. */ | |
$shortcode_content = preg_replace( $patterns, $replacements, $shortcode[5] ); | |
$this->image = img_caption_shortcode( $caption_args, $shortcode_content ); | |
$this->original_image = $shortcode[0]; | |
return; | |
} | |
else { | |
$this->image = do_shortcode( $shortcode[0] ); | |
$this->original_image = $shortcode[0]; | |
return; | |
} | |
} | |
} | |
} | |
} | |
/* Pull a raw HTML image + link if it exists. */ | |
if ( preg_match( '#((?:<a [^>]+>\s*)?<img [^>]+>(?:\s*</a>)?)#is', $post_content, $matches ) ) | |
$this->image = $this->original_image = $matches[0]; | |
} | |
/** | |
* Allows developers to create a custom callback function. If the `callback` argument is set, theme | |
* developers are expected to **always** return an array. Even if nothing is found, return an empty | |
* array. | |
* | |
* @since 1.0.0 | |
* @access public | |
* @return void | |
*/ | |
public function get_callback_image() { | |
$this->image_args = call_user_func( $this->args['callback'], $this->args ); | |
} | |
/** | |
* Sets the default image. | |
* | |
* @since 1.0.0 | |
* @access public | |
* @return void | |
*/ | |
public function get_default_image() { | |
$this->image_args = array( 'src' => $this->args['default'] ); | |
} | |
/** | |
* Handles an image attachment. Other methods rely on this method for getting the image data since | |
* most images are actually attachments. | |
* | |
* @since 1.0.0 | |
* @access public | |
* @param int $attachment_id | |
* @return void | |
*/ | |
public function _get_image_attachment( $attachment_id ) { | |
/* Get the attachment image. */ | |
$image = wp_get_attachment_image_src( $attachment_id, $this->args['size'] ); | |
/* Get the attachment alt text. */ | |
$alt = trim( strip_tags( get_post_meta( $attachment_id, '_wp_attachment_image_alt', true ) ) ); | |
/* Get the attachment caption. */ | |
$caption = get_post_field( 'post_excerpt', $attachment_id ); | |
/* Save the attachment as the 'featured image'. */ | |
if ( true === $this->args['thumbnail_id_save'] ) | |
$this->thumbnail_id_save( $attachment_id ); | |
/* Set the image args. */ | |
$this->image_args = array( | |
'src' => $image[0], | |
'width' => $image[1], | |
'height' => $image[2], | |
'alt' => $alt, | |
'caption' => $caption | |
); | |
} | |
/** | |
* Formats the image HTML. This method is only called if the `$image` property isn't set. It uses | |
* the `$image_args` property to set up the image. | |
* | |
* @since 1.0.0 | |
* @access public | |
* @return void | |
*/ | |
public function format_image() { | |
/* If there is no image URL, return false. */ | |
if ( empty( $this->image_args['src'] ) ) | |
return; | |
/* Check against min. width. If the image width is too small return. */ | |
if ( 0 < $this->args['min_width'] && isset( $this->image_args['width'] ) && $this->image_args['width'] < $this->args['min_width'] ) | |
return; | |
/* Check against min. height. If the image height is too small return. */ | |
if ( 0 < $this->args['min_height'] && isset( $this->image_args['height'] ) && $this->image_args['height'] < $this->args['min_height'] ) | |
return; | |
/* Empty classes array. */ | |
$classes = array(); | |
/* If there is alt text, set it. Otherwise, default to the post title. */ | |
$image_alt = !empty( $this->image_args['alt'] ) ? $this->image_args['alt'] : get_post_field( 'post_title', $this->args['post_id'] ); | |
/* If there's a width/height for the image. */ | |
if ( isset( $this->image_args['width'] ) && isset( $this->image_args['height'] ) ) { | |
/* Set a class based on the orientation. */ | |
$classes[] = ( $this->image_args['height'] > $this->image_args['width'] ) ? 'portrait' : 'landscape'; | |
/* If an explicit width/height is not set, use the info from the image. */ | |
if ( empty( $this->args['width'] ) && empty( $this->args['height'] ) ) { | |
$this->args['width'] = $this->image_args['width']; | |
$this->args['height'] = $this->image_args['height']; | |
} | |
} | |
/* If there is a width or height, set them as HMTL-ready attributes. */ | |
$width = $this->args['width'] ? ' width="' . esc_attr( $this->args['width'] ) . '"' : ''; | |
$height = $this->args['height'] ? ' height="' . esc_attr( $this->args['height'] ) . '"' : ''; | |
/* Add the meta key(s) to the classes array. */ | |
if ( !empty( $this->args['meta_key'] ) ) | |
$classes = array_merge( $classes, (array)$this->args['meta_key'] ); | |
/* Add the $size to the class. */ | |
$classes[] = $this->args['size']; | |
/* Get the custom image class. */ | |
if ( !empty( $this->args['image_class'] ) ) { | |
if ( !is_array( $this->args['image_class'] ) ) | |
$this->args['image_class'] = preg_split( '#\s+#', $this->args['image_class'] ); | |
$classes = array_merge( $classes, $this->args['image_class'] ); | |
} | |
/* Sanitize all the classes. */ | |
$classes = $this->sanitize_class( $classes ); | |
/* Join all the classes into a single string and make sure there are no duplicates. */ | |
$class = join( ' ', $classes ); | |
/* Add the image attributes to the <img /> element. */ | |
$html = sprintf( '<img src="%s" alt="%s" class="%s"%s itemprop="image" />', esc_attr( $this->image_args['src'] ), esc_attr( strip_tags( $image_alt ) ), $class, $width . $height ); | |
/* If $link_to_post is set to true, link the image to its post. */ | |
if ( $this->args['link_to_post'] ) | |
$html = '<a href="' . get_permalink( $this->args['post_id'] ) . '" title="' . esc_attr( get_post_field( 'post_title', $this->args['post_id'] ) ) . '">' . $html . '</a>'; | |
/* If there is a $post_thumbnail_id, apply the WP filters normally associated with get_the_post_thumbnail(). */ | |
if ( !empty( $this->image_args['post_thumbnail_id'] ) ) | |
$html = apply_filters( 'post_thumbnail_html', $html, $this->args['post_id'], $this->image_args['post_thumbnail_id'], $this->args['size'], '' ); | |
/* If we're showing a caption. */ | |
if ( true === $this->args['caption'] && !empty( $this->image_args['caption'] ) ) | |
$html = img_caption_shortcode( array( 'caption' => $this->image_args['caption'], 'width' => $this->args['width'] ), $html ); | |
$this->image = $html; | |
} | |
/** | |
* Saves the image source as metadata. Saving the image as meta is actually quite a bit quicker | |
* if the user doesn't have a persistent caching plugin available. However, it doesn't play as | |
* nicely with custom image sizes used across multiple themes where one might want to resize images. | |
* This option should be reserved for advanced users only. Don't use in publicly-distributed | |
* themes. | |
* | |
* @since 1.0.0 | |
* @access public | |
* @return void | |
*/ | |
public function meta_key_save() { | |
/* If the $meta_key_save argument is empty or there is no image $url given, return. */ | |
if ( empty( $this->args['meta_key_save'] ) || empty( $this->image_args['src'] ) ) | |
return; | |
/* Get the current value of the meta key. */ | |
$meta = get_post_meta( $this->args['post_id'], $this->args['meta_key_save'], true ); | |
/* If there is no value for the meta key, set a new value with the image $url. */ | |
if ( empty( $meta ) ) | |
add_post_meta( $this->args['post_id'], $this->args['meta_key_save'], $this->image_args['src'] ); | |
/* If the current value doesn't match the image $url, update it. */ | |
elseif ( $meta !== $this->image_args['src'] ) | |
update_post_meta( $this->args['post_id'], $this->args['meta_key_save'], $this->image_args['src'], $meta ); | |
} | |
/** | |
* Saves the image attachment as the WordPress featured image. This is useful for setting the | |
* featured image for the post in the case that the user forgot to (win for client work!). It | |
* should not be used in publicly-distributed themes where you don't know how the user will be | |
* setting up their site. | |
* | |
* @since 1.0.0 | |
* @access public | |
* @return void | |
*/ | |
public function thumbnail_id_save( $attachment_id ) { | |
/* Save the attachment as the 'featured image'. */ | |
if ( true === $this->args['thumbnail_id_save'] ) | |
set_post_thumbnail( $this->args['post_id'], $attachment_id ); | |
} | |
/** | |
* Sanitizes the image class. | |
* | |
* @since 1.0.0 | |
* @access public | |
* @param array $classes | |
* @return array | |
*/ | |
public function sanitize_class( $classes ) { | |
$classes = array_map( 'strtolower', $classes ); | |
$classes = array_map( 'sanitize_html_class', $classes ); | |
return array_unique( $classes ); | |
} | |
/** | |
* Splits the original image HTML from the post content. | |
* | |
* @since 1.0.0 | |
* @access public | |
* @param string $content | |
* @return string | |
*/ | |
public function split_content( $content ) { | |
remove_filter( 'the_content', array( $this, 'split_content' ), 9 ); | |
return str_replace( $this->original_image, '', $content ); | |
} | |
} | |
/** | |
* Deletes the image cache for the specific post when the 'save_post' hook is fired. | |
* | |
* @since 0.7.0 | |
* @access private | |
* @param int $post_id The ID of the post to delete the cache for. | |
* @return void | |
*/ | |
function get_the_image_delete_cache_by_post( $post_id ) { | |
wp_cache_delete( $post_id, 'get_the_image' ); | |
} | |
/** | |
* Deletes the image cache for a specific post when the 'added_post_meta', 'deleted_post_meta', | |
* or 'updated_post_meta' hooks are called. | |
* | |
* @since 0.7.0 | |
* @access private | |
* @param int $meta_id The ID of the metadata being updated. | |
* @param int $post_id The ID of the post to delete the cache for. | |
* @return void | |
*/ | |
function get_the_image_delete_cache_by_meta( $meta_id, $post_id ) { | |
wp_cache_delete( $post_id, 'get_the_image' ); | |
} | |
/* === Deprecated functions === */ | |
/** | |
* @since 0.1.0 | |
* @deprecated 0.3.0 | |
* @access public | |
*/ | |
function get_the_image_link() { | |
_deprecated_function( __FUNCTION__, '0.3.0', 'get_the_image' ); | |
get_the_image( array( 'link_to_post' => true ) ); | |
} | |
/** | |
* @since 0.3.0 | |
* @deprecated 0.7.0 | |
* @access private | |
*/ | |
function image_by_custom_field() {} | |
/** | |
* @since 0.4.0 | |
* @deprecated 0.7.0 | |
* @access private | |
*/ | |
function image_by_the_post_thumbnail() {} | |
/** | |
* @since 0.3.0 | |
* @deprecated 0.7.0 | |
* @access private | |
*/ | |
function image_by_attachment() {} | |
/** | |
* @since 0.3.0 | |
* @deprecated 0.7.0 | |
* @access private | |
*/ | |
function image_by_scan() {} | |
/** | |
* @since 0.3.0 | |
* @deprecated 0.7.0 | |
* @access private | |
*/ | |
function image_by_default() {} | |
/** | |
* @since 0.1.0 | |
* @deprecated 0.7.0 | |
* @access private | |
*/ | |
function display_the_image() {} | |
/** | |
* @since 0.5.0 | |
* @deprecated 0.7.0 | |
* @access private | |
*/ | |
function get_the_image_delete_cache() {} | |
/** | |
* @since 0.7.0 | |
* @deprecated 1.0.0 | |
* @access private | |
*/ | |
function get_the_image_by_meta_key() {} | |
/** | |
* @since 0.7.0 | |
* @deprecated 1.0.0 | |
* @access private | |
*/ | |
function get_the_image_by_post_thumbnail() {} | |
/** | |
* @since 0.7.0 | |
* @deprecated 1.0.0 | |
* @access private | |
*/ | |
function get_the_image_by_attachment() {} | |
/** | |
* @since 0.7.0 | |
* @deprecated 1.0.0 | |
* @access private | |
*/ | |
function get_the_image_by_scan() {} | |
/** | |
* @since 0.7.0 | |
* @deprecated 1.0.0 | |
* @access private | |
*/ | |
function get_the_image_by_default() {} | |
/** | |
* @since 0.7.0 | |
* @deprecated 1.0.0 | |
* @access private | |
*/ | |
function get_the_image_format() {} | |
/** | |
* @since 0.6.0 | |
* @deprecated 1.0.0 | |
* @access private | |
*/ | |
function get_the_image_meta_key_save() {} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment