open-graph-oembed.php
3.22 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
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
<?php
namespace Yoast\WP\SEO\Integrations\Front_End;
use WP_Post;
use Yoast\WP\SEO\Conditionals\Front_End_Conditional;
use Yoast\WP\SEO\Conditionals\Open_Graph_Conditional;
use Yoast\WP\SEO\Integrations\Integration_Interface;
use Yoast\WP\SEO\Surfaces\Meta_Surface;
/**
* Class Open_Graph_OEmbed.
*/
class Open_Graph_OEmbed implements Integration_Interface {
/**
* The meta surface.
*
* @var Meta_Surface
*/
private $meta;
/**
* The oEmbed data.
*
* @var array
*/
private $data;
/**
* The post ID for the current post.
*
* @var int
*/
private $post_id;
/**
* The post meta.
*
* @var Meta|false
*/
private $post_meta;
/**
* Returns the conditionals based in which this loadable should be active.
*
* @return array
*/
public static function get_conditionals() {
return [ Front_End_Conditional::class, Open_Graph_Conditional::class ];
}
/**
* Initializes the integration.
*
* This is the place to register hooks and filters.
*
* @return void
*/
public function register_hooks() {
\add_filter( 'oembed_response_data', [ $this, 'set_oembed_data' ], 10, 2 );
}
/**
* Open_Graph_OEmbed constructor.
*
* @param Meta_Surface $meta The meta surface.
*/
public function __construct( Meta_Surface $meta ) {
$this->meta = $meta;
}
/**
* Callback function to pass to the oEmbed's response data that will enable
* support for using the image and title set by the WordPress SEO plugin's fields. This
* address the concern where some social channels/subscribed use oEmebed data over Open Graph data
* if both are present.
*
* @link https://developer.wordpress.org/reference/hooks/oembed_response_data/ for hook info.
*
* @param array $data The oEmbed data.
* @param WP_Post $post The current Post object.
*
* @return array An array of oEmbed data with modified values where appropriate.
*/
public function set_oembed_data( $data, $post ) {
// Data to be returned.
$this->data = $data;
$this->post_id = $post->ID;
$this->post_meta = $this->meta->for_post( $this->post_id );
if ( ! empty( $this->post_meta ) ) {
$this->set_title();
$this->set_description();
$this->set_image();
}
return $this->data;
}
/**
* Sets the OpenGraph title if configured.
*/
protected function set_title() {
$opengraph_title = $this->post_meta->open_graph_title;
if ( ! empty( $opengraph_title ) ) {
$this->data['title'] = $opengraph_title;
}
}
/**
* Sets the OpenGraph description if configured.
*/
protected function set_description() {
$opengraph_description = $this->post_meta->open_graph_description;
if ( ! empty( $opengraph_description ) ) {
$this->data['description'] = $opengraph_description;
}
}
/**
* Sets the image if it has been configured.
*/
protected function set_image() {
$images = $this->post_meta->open_graph_images;
if ( ! \is_array( $images ) ) {
return;
}
$image = \reset( $images );
if ( empty( $image ) || ! isset( $image['url'] ) ) {
return;
}
$this->data['thumbnail_url'] = $image['url'];
if ( isset( $image['width'] ) ) {
$this->data['thumbnail_width'] = $image['width'];
}
if ( isset( $image['height'] ) ) {
$this->data['thumbnail_height'] = $image['height'];
}
}
}