indexable-social-image-trait.php
4.71 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
150
151
152
153
154
155
156
157
158
<?php
namespace Yoast\WP\SEO\Builders;
use WPSEO_Utils;
use Yoast\WP\SEO\Helpers\Image_Helper;
use Yoast\WP\SEO\Helpers\Open_Graph\Image_Helper as Open_Graph_Image_Helper;
use Yoast\WP\SEO\Helpers\Twitter\Image_Helper as Twitter_Image_Helper;
use Yoast\WP\SEO\Models\Indexable;
/**
* Trait for determine the social image to use in the indexable.
*
* Represents the trait used in builders for handling social images.
*/
trait Indexable_Social_Image_Trait {
/**
* The image helper.
*
* @var Image_Helper
*/
protected $image;
/**
* The Open Graph image helper.
*
* @var Open_Graph_Image_Helper
*/
protected $open_graph_image;
/**
* The Twitter image helper.
*
* @var Twitter_Image_Helper
*/
protected $twitter_image;
/**
* Sets the helpers for the trait.
*
* @required
*
* @param Image_Helper $image The image helper.
* @param Open_Graph_Image_Helper $open_graph_image The Open Graph image helper.
* @param Twitter_Image_Helper $twitter_image The Twitter image helper.
*/
public function set_social_image_helpers(
Image_Helper $image,
Open_Graph_Image_Helper $open_graph_image,
Twitter_Image_Helper $twitter_image
) {
$this->image = $image;
$this->open_graph_image = $open_graph_image;
$this->twitter_image = $twitter_image;
}
/**
* Sets the alternative on an indexable.
*
* @param array $alternative_image The alternative image to set.
* @param Indexable $indexable The indexable to set image for.
*/
protected function set_alternative_image( array $alternative_image, Indexable $indexable ) {
if ( ! empty( $alternative_image['image_id'] ) ) {
if ( ! $indexable->open_graph_image_source && ! $indexable->open_graph_image_id ) {
$indexable->open_graph_image_id = $alternative_image['image_id'];
$indexable->open_graph_image_source = $alternative_image['source'];
$this->set_open_graph_image_meta_data( $indexable );
}
if ( ! $indexable->twitter_image && ! $indexable->twitter_image_id ) {
$indexable->twitter_image = $this->twitter_image->get_by_id( $alternative_image['image_id'] );
$indexable->twitter_image_id = $alternative_image['image_id'];
$indexable->twitter_image_source = $alternative_image['source'];
}
}
if ( ! empty( $alternative_image['image'] ) ) {
if ( ! $indexable->open_graph_image_source && ! $indexable->open_graph_image_id ) {
$indexable->open_graph_image = $alternative_image['image'];
$indexable->open_graph_image_source = $alternative_image['source'];
}
if ( ! $indexable->twitter_image && ! $indexable->twitter_image_id ) {
$indexable->twitter_image = $alternative_image['image'];
$indexable->twitter_image_source = $alternative_image['source'];
}
}
}
/**
* Sets the Open Graph image meta data for an og image
*
* @param Indexable $indexable The indexable.
*/
protected function set_open_graph_image_meta_data( Indexable $indexable ) {
if ( ! $indexable->open_graph_image_id ) {
return;
}
$image = $this->open_graph_image->get_image_by_id( $indexable->open_graph_image_id );
if ( ! empty( $image ) ) {
$indexable->open_graph_image = $image['url'];
$indexable->open_graph_image_meta = WPSEO_Utils::format_json_encode( $image );
}
}
/**
* Handles the social images.
*
* @param Indexable $indexable The indexable to handle.
*/
protected function handle_social_images( Indexable $indexable ) {
// When the image or image id is set.
if ( $indexable->open_graph_image || $indexable->open_graph_image_id ) {
$indexable->open_graph_image_source = 'set-by-user';
$this->set_open_graph_image_meta_data( $indexable );
}
if ( $indexable->twitter_image || $indexable->twitter_image_id ) {
$indexable->twitter_image_source = 'set-by-user';
}
if ( $indexable->twitter_image_id ) {
$indexable->twitter_image = $this->twitter_image->get_by_id( $indexable->twitter_image_id );
}
// When image sources are set already.
if ( $indexable->open_graph_image_source && $indexable->twitter_image_source ) {
return;
}
$alternative_image = $this->find_alternative_image( $indexable );
if ( ! empty( $alternative_image ) ) {
$this->set_alternative_image( $alternative_image, $indexable );
}
}
/**
* Resets the social images.
*
* @param Indexable $indexable The indexable to set images for.
*/
protected function reset_social_images( Indexable $indexable ) {
$indexable->open_graph_image = null;
$indexable->open_graph_image_id = null;
$indexable->open_graph_image_source = null;
$indexable->open_graph_image_meta = null;
$indexable->twitter_image = null;
$indexable->twitter_image_id = null;
$indexable->twitter_image_source = null;
}
}