PluginProbe
Polylang / trunk
Polylang vtrunk
3.8.9 3.8.8 3.8.7 3.8.6 3.8.5 3.8.4 3.8.3 2.7 2.7.0.1 2.7.1 2.7.2 2.7.3 2.7.4 2.8 2.8.1 2.8.2 2.8.3 2.8.4 2.9 2.9.1 2.9.2 3.0 3.0.1 3.0.2 3.0.3 All 233 releases
← All changes | uninstall.php +94 -35 3.0.1 → trunk View file →
@@ -2,15 +2,15 @@
2 2 /**
3 3 * @package Polylang
4 4 */
5 5
6 -if ( ! defined( 'WP_UNINSTALL_PLUGIN' ) ) { // If uninstall not called from WordPress exit
6 +if ( ! defined( 'WP_UNINSTALL_PLUGIN' ) ) { // If uninstall not called from WordPress exit.
7 7 exit;
8 8 }
9 9
10 10 /**
11 - * Manages Polylang uninstallation
12 - * The goal is to remove ALL Polylang related data in db
11 + * Manages Polylang uninstallation.
12 + * The goal is to remove **all** Polylang related data in db.
13 13 *
14 14 * @since 0.5
15 15 */
16 16 class PLL_Uninstall {
@@ -15,9 +15,9 @@
15 15 */
16 16 class PLL_Uninstall {
17 17
18 18 /**
19 - * Constructor: manages uninstall for multisite
19 + * Constructor: manages uninstall for multisite.
20 20 *
21 21 * @since 0.5
22 22 */
23 23 public function __construct() {
@@ -22,14 +22,14 @@
22 22 */
23 23 public function __construct() {
24 24 global $wpdb;
25 25
26 - // Don't do anything except if the constant PLL_REMOVE_ALL_DATA is explicitely defined and true.
26 + // Don't do anything except if the constant PLL_REMOVE_ALL_DATA is explicitly defined and true.
27 27 if ( ! defined( 'PLL_REMOVE_ALL_DATA' ) || ! PLL_REMOVE_ALL_DATA ) {
28 28 return;
29 29 }
30 30
31 - // Check if it is a multisite uninstall - if so, run the uninstall function for each blog id
31 + // Check if it is a multisite uninstall - if so, run the uninstall function for each blog id.
32 32 if ( is_multisite() ) {
33 33 foreach ( $wpdb->get_col( "SELECT blog_id FROM $wpdb->blogs" ) as $blog_id ) {
34 34 switch_to_blog( $blog_id );
35 35 $this->uninstall();
@@ -34,17 +34,15 @@
34 34 switch_to_blog( $blog_id );
35 35 $this->uninstall();
36 36 }
37 37 restore_current_blog();
38 - }
39 - else {
38 + } else {
40 39 $this->uninstall();
41 40 }
42 41 }
43 42
44 43 /**
45 - * Removes ALL plugin data
46 - * only when the relevant option is active
44 + * Removes **all** plugin data.
47 45 *
48 46 * @since 0.5
49 47 */
50 48 public function uninstall() {
@@ -51,26 +49,44 @@
51 49 global $wpdb;
52 50
53 51 do_action( 'pll_uninstall' );
54 52
55 - // Need to register the taxonomies
56 - $pll_taxonomies = array( 'language', 'term_language', 'post_translations', 'term_translations' );
53 + // We need to register the taxonomies.
54 + $pll_taxonomies = array(
55 + 'language',
56 + 'term_language',
57 + 'post_translations',
58 + 'term_translations',
59 + );
60 +
57 61 foreach ( $pll_taxonomies as $taxonomy ) {
58 - register_taxonomy( $taxonomy, null, array( 'label' => false, 'public' => false, 'query_var' => false, 'rewrite' => false ) );
62 + register_taxonomy(
63 + $taxonomy,
64 + null,
65 + array(
66 + 'label' => false,
67 + 'public' => false,
68 + 'query_var' => false,
69 + 'rewrite' => false,
70 + )
71 + );
59 72 }
60 73
61 - $languages = get_terms( 'language', array( 'hide_empty' => false ) );
74 + $languages = get_terms(
75 + array(
76 + 'taxonomy' => 'language',
77 + 'hide_empty' => false,
78 + )
79 + );
62 80
63 - // Delete users options
64 - foreach ( get_users( array( 'fields' => 'ID' ) ) as $user_id ) {
65 - delete_user_meta( $user_id, 'pll_filter_content' );
66 - delete_user_meta( $user_id, 'pll_dismissed_notices' ); // Legacy meta.
67 - foreach ( $languages as $lang ) {
68 - delete_user_meta( $user_id, 'description_' . $lang->slug );
69 - }
81 + // Delete users options.
82 + delete_metadata( 'user', 0, 'pll_filter_content', '', true );
83 + delete_metadata( 'user', 0, 'pll_dismissed_notices', '', true ); // Legacy meta.
84 + foreach ( $languages as $lang ) {
85 + delete_metadata( 'user', 0, "description_{$lang->slug}", '', true );
70 86 }
71 87
72 - // Delete menu language switchers
88 + // Delete menu language switchers.
73 89 $ids = get_posts(
74 90 array(
75 91 'post_type' => 'nav_menu_item',
76 92 'numberposts' => -1,
@@ -83,10 +99,19 @@
83 99 foreach ( $ids as $id ) {
84 100 wp_delete_post( $id, true );
85 101 }
86 102
87 - // Delete the strings translations.
88 - register_post_type( 'polylang_mo', array( 'rewrite' => false, 'query_var' => false ) );
103 + /*
104 + * Backward compatibility with Polylang < 3.4.
105 + * Delete the legacy strings translations.
106 + */
107 + register_post_type(
108 + 'polylang_mo',
109 + array(
110 + 'rewrite' => false,
111 + 'query_var' => false,
112 + )
113 + );
89 114 $ids = get_posts(
90 115 array(
91 116 'post_type' => 'polylang_mo',
92 117 'post_status' => 'any',
@@ -98,37 +123,71 @@
98 123 foreach ( $ids as $id ) {
99 124 wp_delete_post( $id, true );
100 125 }
101 126
102 - // Delete all what is related to languages and translations
127 + // Delete all what is related to languages and translations.
103 128 $term_ids = array();
104 129 $tt_ids = array();
105 130
106 - foreach ( get_terms( $pll_taxonomies, array( 'hide_empty' => false ) ) as $term ) {
131 + $terms = get_terms(
132 + array(
133 + 'taxonomy' => $pll_taxonomies,
134 + 'hide_empty' => false,
135 + )
136 + );
137 +
138 + foreach ( $terms as $term ) {
107 139 $term_ids[] = (int) $term->term_id;
108 - $tt_ids[] = (int) $term->term_taxonomy_id;
140 + $tt_ids[] = (int) $term->term_taxonomy_id;
109 141 }
110 142
111 143 if ( ! empty( $term_ids ) ) {
112 144 $term_ids = array_unique( $term_ids );
113 - $wpdb->query( "DELETE FROM {$wpdb->terms} WHERE term_id IN ( " . implode( ',', $term_ids ) . ' )' ); // PHPCS:ignore WordPress.DB.PreparedSQL.NotPrepared
114 - $wpdb->query( "DELETE FROM {$wpdb->term_taxonomy} WHERE term_id IN ( " . implode( ',', $term_ids ) . ' )' ); // PHPCS:ignore WordPress.DB.PreparedSQL.NotPrepared
145 + $wpdb->query(
146 + $wpdb->prepare(
147 + sprintf(
148 + "DELETE FROM {$wpdb->terms} WHERE term_id IN (%s)",
149 + implode( ',', array_fill( 0, count( $term_ids ), '%d' ) )
150 + ),
151 + $term_ids
152 + )
153 + );
154 + $wpdb->query(
155 + $wpdb->prepare(
156 + sprintf(
157 + "DELETE FROM {$wpdb->term_taxonomy} WHERE term_id IN (%s)",
158 + implode( ',', array_fill( 0, count( $term_ids ), '%d' ) )
159 + ),
160 + $term_ids
161 + )
162 + );
163 + $wpdb->query(
164 + $wpdb->prepare(
165 + sprintf(
166 + "DELETE FROM {$wpdb->termmeta} WHERE term_id IN (%s) AND meta_key='_pll_strings_translations'",
167 + implode( ',', array_fill( 0, count( $term_ids ), '%d' ) )
168 + ),
169 + $term_ids
170 + )
171 + );
115 172 }
116 173
117 174 if ( ! empty( $tt_ids ) ) {
118 175 $tt_ids = array_unique( $tt_ids );
119 - $wpdb->query( "DELETE FROM {$wpdb->term_relationships} WHERE term_taxonomy_id IN ( " . implode( ',', $tt_ids ) . ' )' ); // PHPCS:ignore WordPress.DB.PreparedSQL.NotPrepared
176 + $wpdb->query( $wpdb->prepare( sprintf( "DELETE FROM {$wpdb->term_relationships} WHERE term_taxonomy_id IN (%s)", implode( ',', array_fill( 0, count( $tt_ids ), '%d' ) ) ), $tt_ids ) );
120 177 }
121 178
122 - // Delete options
179 + // Delete options.
123 180 delete_option( 'polylang' );
124 - delete_option( 'widget_polylang' ); // Automatically created by WP
125 - delete_option( 'polylang_wpml_strings' ); // Strings registered with icl_register_string
181 + delete_option( 'widget_polylang' ); // Automatically created by WP.
182 + delete_option( 'polylang_wpml_strings' ); // Strings registered with icl_register_string.
126 183 delete_option( 'polylang_licenses' );
127 184 delete_option( 'pll_dismissed_notices' );
185 + delete_option( 'pll_language_from_content_available' );
186 + delete_option( 'pll_language_taxonomies' );
128 187
129 - // Delete transients
130 - delete_transient( 'pll_languages_list' );
188 + // Delete transients.
189 + delete_option( '_transient_pll_languages_list' ); // Force deletion of the transient from the options table even in case external object cache is used.
131 190 }
132 191 }
133 192
134 193 new PLL_Uninstall();