image-presenter.php
2.53 KB
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
100
101
102
103
104
105
106
107
108
109
110
<?php
namespace Yoast\WP\SEO\Presenters\Open_Graph;
use Yoast\WP\SEO\Presentations\Indexable_Presentation;
use Yoast\WP\SEO\Presenters\Abstract_Indexable_Presenter;
/**
* Presenter class for the Open Graph image.
*/
class Image_Presenter extends Abstract_Indexable_Presenter {
/**
* The tag key name.
*
* @var string
*/
protected $key = 'og:image';
/**
* Image tags that we output for each image.
*
* @var array
*/
protected static $image_tags = [
'width' => 'width',
'height' => 'height',
'type' => 'type',
];
/**
* Returns the image for a post.
*
* @return string The image tag.
*/
public function present() {
$images = $this->get();
if ( empty( $images ) ) {
return '';
}
$return = '';
foreach ( $images as $image_meta ) {
$image_url = $image_meta['url'];
if ( \is_attachment() ) {
global $wp;
$image_url = \home_url( $wp->request );
}
$class = \is_admin_bar_showing() ? ' class="yoast-seo-meta-tag"' : '';
$return .= '<meta property="og:image" content="' . \esc_url( $image_url, null, 'attribute' ) . '"' . $class . ' />';
foreach ( static::$image_tags as $key => $value ) {
if ( empty( $image_meta[ $key ] ) ) {
continue;
}
$return .= \PHP_EOL . "\t" . '<meta property="og:image:' . \esc_attr( $key ) . '" content="' . \esc_attr( $image_meta[ $key ] ) . '"' . $class . ' />';
}
}
return $return;
}
/**
* Gets the raw value of a presentation.
*
* @return array The raw value.
*/
public function get() {
$images = [];
foreach ( $this->presentation->open_graph_images as $open_graph_image ) {
$images[] = \array_intersect_key(
// First filter the object.
$this->filter( $open_graph_image ),
// Then strip all keys that aren't in the image tags or the url.
\array_flip( \array_merge( static::$image_tags, [ 'url' ] ) )
);
}
return \array_filter( $images );
}
/**
* Run the image content through the `wpseo_opengraph_image` filter.
*
* @param array $image The image.
*
* @return array The filtered image.
*/
protected function filter( $image ) {
/**
* Filter: 'wpseo_opengraph_image' - Allow changing the Open Graph image.
*
* @api string - The URL of the Open Graph image.
*
* @param Indexable_Presentation $presentation The presentation of an indexable.
*/
$image_url = \trim( \apply_filters( 'wpseo_opengraph_image', $image['url'], $this->presentation ) );
if ( ! empty( $image_url ) && \is_string( $image_url ) ) {
$image['url'] = $image_url;
}
return $image;
}
}