1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
/**
 * Default images for themes
 * 
 * Builds an default <img> for use in themes or plugins before any other images are added.
 * Resizes & crops the image using the built-in (retireved via `get_intermediate_image_sizes();`) 
 * or custom image (added via `add_image_size();`) sizes.
 * 
 * Retrieves calculated resize dimension @uses image_resize_dimensions();
 * Builds the width and height string @uses image_hwstring();
 * 
 * @param $args (array)
 * 		string $url URl to the given default image.
 * 		string $size Optional. Default is 'medium'.
 * 		string (optional) $alt Image Description for the alt attribute.
 * 		string (optional) $title Image Description for the title attribute.
 * 		string (optional) $align Part of the class name for aligning the image.
 * 		string (optional) $echo Wheter to return or echo the $image
 * @return string HTML IMG element for given image attachment
 */
function wp_default_img( $attr )
{
	// Sizes registered via add_image_size();
	global $_wp_additional_image_sizes;

	$defaults = array(
		 'size'		=> 'medium'
		,'classes'	=> false
		,'alt'		=> false
		,'title'	=> false
		,'align'	=> 'none'
		,'echo'		=> true 
	);

	$attr = wp_parse_args( $attr, $defaults );

	if ( 'thumb' === $attr['size'] )
		$attr['size'] = 'thumbnail';

	// Size in built in sizes - call size setting from DB
	# behavoir in here dependent on @link http://core.trac.wordpress.org/ticket/18947
	if ( ! in_array( $attr['size'], array_keys( $_wp_additional_image_sizes ) ) )
	{
		$sizes				= get_intermediate_image_sizes();
		// Get option - gladly autoloaded/can use wp_cache_get();
		$size_data['width']	= intval( get_option( "{$attr['size']}_size_w") );
		$size_data['height']= intval( get_option( "{$attr['size']}_size_h") );
		// Not sure how this will behave if cropped is false (autoloaded option not added)
		$size_data['crop']	= get_option( "{$attr['size']}_crop" ) ? get_option( "{$attr['size']}_crop" ) : false;
	}
	// Size array from global registered additional/custom sizes array
	else 
	{
		$size_data = $_wp_additional_image_sizes[ $attr['size'] ];
	}

	// Retrieve image width & height
	$img_info	= @getimagesize( $attr['url'] );

	// Calculate final dimensions - if "crop" was set to true during add_image_size(), the img will get ... cropped
	$end_sizes	= image_resize_dimensions( $img_info[0], $img_info[1], $size_data['width'], $size_data['height'], $size_data['crop'] );

	// defaults to px units - can't get changed, as applying units is not possible
	$hwstring	= ' '.trim( image_hwstring( $end_sizes[4], $end_sizes[5] ) );

	// Attributes:
	// Not made required as users tend to do funky things (...and lock screen readers out)
	$attr['alt'] = $attr['alt'] ? ' alt="'.esc_attr( $attr['alt'] ).'"' : '';

	if ( ! $attr['title'] )
	{
		$mime = explode( "/", $img_info['mime'] );
		$attr['title'] = sprintf( __('default image of type: %1$s'), ucfirst( $mime[1] ) );
	}
	$attr['title'] = $attr['title'] ? ' title="'.esc_attr( $attr['title'] ).'"' : '';

	$attr['classes'] = "wp-img-default ".esc_attr( $attr['classes'] ? $attr['classes'] : '' );
	$attr['align'] = $attr['align'] ? "align".esc_attr( $attr['align'] ) : '';
	$attr['size'] = "size-".esc_attr( $attr['size'] );

	// Allow filtering of the default attributes
	$attributes	= apply_filters( 'wp_default_img_attr', $attr );

	// Build class attribute, considering that maybe some attribute was unset via the filter
	$classes  = ' class="';
	$classes .= 'wp-img-default'.esc_attr( $attr['classes'] ? ' '.$attr['classes'] : '' );
	$classes .= $attr['align'] ? ' '.esc_attr( $attr['align'] ) : '';
	$classes .= $attr['size'] ? ' '.esc_attr( $attr['size'] ).'" ' : '" ';

	$url		= trim( $attr['url'] );
	$image		= "<img src='{$url}'{$hwstring}{$classes}".$attr['alt'].$attr['title']."' />";

	// Allow filtering of output
	$image 		= apply_filters( 'wp_default_img', $image );

	if ( ! $attr['echo'] )
		return $image;

	return print $image;
}