class-import-wpseo.php
5.95 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
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
<?php
/**
* @package WPSEO\Admin\Import\External
*/
/**
* Class WPSEO_Import_WPSEO
*
* Class with functionality to import Yoast SEO settings from wpSEO
*/
class WPSEO_Import_WPSEO extends WPSEO_Import_External {
/**
* Import wpSEO settings
*/
public function __construct() {
parent::__construct();
$this->import_post_metas();
$this->import_taxonomy_metas();
$this->set_msg(
__(
sprintf(
'wpSEO data successfully imported. Would you like to %sdisable the wpSEO plugin%s?',
'<a href="' . esc_url( admin_url( 'admin.php?page=wpseo_tools&tool=import-export&deactivate_wpseo=1#top#import-seo' ) ) . '">',
'</a>'
),
'wordpress-seo'
)
);
}
/**
* Import the post meta values to Yoast SEO by replacing the wpSEO fields by Yoast SEO fields
*/
private function import_post_metas() {
WPSEO_Meta::replace_meta( '_wpseo_edit_title', WPSEO_Meta::$meta_prefix . 'title', $this->replace );
WPSEO_Meta::replace_meta( '_wpseo_edit_description', WPSEO_Meta::$meta_prefix . 'metadesc', $this->replace );
WPSEO_Meta::replace_meta( '_wpseo_edit_keywords', WPSEO_Meta::$meta_prefix . 'keywords', $this->replace );
WPSEO_Meta::replace_meta( '_wpseo_edit_canonical', WPSEO_Meta::$meta_prefix . 'canonical', $this->replace );
$this->import_post_robots();
}
/**
* Importing the robot values from WPSEO plugin. These have to be converted to the Yoast format.
*/
private function import_post_robots() {
$query_posts = new WP_Query( 'post_type=any&meta_key=_wpseo_edit_robots&order=ASC' );
if ( ! empty( $query_posts->posts ) ) {
foreach ( $query_posts->posts as $post ) {
$this->import_post_robot( $post->ID );
}
}
}
/**
* Getting the wpSEO robot value and map this to Yoast SEO values.
*
* @param integer $post_id The post id of the current post.
*/
private function import_post_robot( $post_id ) {
$wpseo_robots = get_post_meta( $post_id, '_wpseo_edit_robots', true );
// Does the value exists in our mapping.
if ( $robot_value = $this->get_robot_value( $wpseo_robots ) ) {
// Saving the new meta values for Yoast SEO.
WPSEO_Meta::set_value( $robot_value['index'], 'meta-robots-noindex', $post_id );
WPSEO_Meta::set_value( $robot_value['follow'], 'meta-robots-nofollow', $post_id );
}
$this->delete_post_robot( $post_id );
}
/**
* Delete the wpSEO robot values, because they aren't needed anymore.
*
* @param integer $post_id The post id of the current post.
*/
private function delete_post_robot( $post_id ) {
if ( $this->replace ) {
delete_post_meta( $post_id, '_wpseo_edit_robots' );
}
}
/**
* Import the taxonomy metas from wpSEO
*/
private function import_taxonomy_metas() {
$terms = get_terms( get_taxonomies(), array( 'hide_empty' => false ) );
$tax_meta = get_option( 'wpseo_taxonomy_meta' );
foreach ( $terms as $term ) {
$this->import_taxonomy_description( $tax_meta, $term->taxonomy, $term->term_id );
$this->import_taxonomy_robots( $tax_meta, $term->taxonomy, $term->term_id );
$this->delete_taxonomy_metas( $term->taxonomy, $term->term_id );
}
update_option( 'wpseo_taxonomy_meta', $tax_meta );
}
/**
* Import the meta description to Yoast SEO
*
* @param array $tax_meta The array with the current metadata.
* @param string $taxonomy String with the name of the taxonomy.
* @param string $term_id The ID of the current term.
*/
private function import_taxonomy_description( & $tax_meta, $taxonomy, $term_id ) {
$description = get_option( 'wpseo_' . $taxonomy . '_' . $term_id, false );
if ( $description !== false ) {
// Import description.
$tax_meta[ $taxonomy ][ $term_id ]['wpseo_desc'] = $description;
}
}
/**
* Import the robot value to Yoast SEO
*
* @param array $tax_meta The array with the current metadata.
* @param string $taxonomy String with the name of the taxonomy.
* @param string $term_id The ID of the current term.
*/
private function import_taxonomy_robots( & $tax_meta, $taxonomy, $term_id ) {
$wpseo_robots = get_option( 'wpseo_' . $taxonomy . '_' . $term_id . '_robots', false );
if ( $wpseo_robots !== false ) {
// The value 1, 2 and 6 are the index values in wpSEO.
$new_robot_value = ( in_array( $wpseo_robots, array( 1, 2, 6 ) ) ) ? 'index' : 'noindex';
$tax_meta[ $taxonomy ][ $term_id ]['wpseo_noindex'] = $new_robot_value;
}
}
/**
* Delete the wpSEO taxonomy meta data.
*
* @param string $taxonomy String with the name of the taxonomy.
* @param string $term_id The ID of the current term.
*/
private function delete_taxonomy_metas( $taxonomy, $term_id ) {
if ( $this->replace ) {
delete_option( 'wpseo_' . $taxonomy . '_' . $term_id );
delete_option( 'wpseo_' . $taxonomy . '_' . $term_id . '_robots' );
}
}
/**
* Getting the robot config by given wpSEO robots value.
*
* @param string $wpseo_robots The value in wpSEO that needs to be converted to the Yoast format.
*
* @return array
*/
private function get_robot_value( $wpseo_robots ) {
static $robot_values;
if ( $robot_values === null ) {
/**
* The values 1 - 6 are the configured values from wpSEO. This array will map the values of wpSEO to our values.
*
* There are some double array like 1-6 and 3-4. The reason is they only set the index value. The follow value is
* the default we use in the cases there isn't a follow value present.
*
* @var array
*/
$robot_values = array(
1 => array( 'index' => 2, 'follow' => 0 ), // In wpSEO: index, follow.
2 => array( 'index' => 2, 'follow' => 1 ), // In wpSEO: index, nofollow.
3 => array( 'index' => 1, 'follow' => 0 ), // In wpSEO: noindex.
4 => array( 'index' => 1, 'follow' => 0 ), // In wpSEO: noindex, follow.
5 => array( 'index' => 1, 'follow' => 1 ), // In wpSEO: noindex, nofollow.
6 => array( 'index' => 2, 'follow' => 0 ), // In wpSEO: index.
);
}
if ( array_key_exists( $wpseo_robots, $robot_values ) ) {
return $robot_values[ $wpseo_robots ];
}
return array( 'index' => 2, 'follow' => 0 );
}
}