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 +97 -65 2.7.1 → trunk View file →
@@ -1,13 +1,16 @@
1 1 <?php
2 +/**
3 + * @package Polylang
4 + */
2 5
3 -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.
4 7 exit;
5 8 }
6 9
7 10 /**
8 - * Manages Polylang uninstallation
9 - * 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.
10 13 *
11 14 * @since 0.5
12 15 */
13 16 class PLL_Uninstall {
@@ -12,9 +15,9 @@
12 15 */
13 16 class PLL_Uninstall {
14 17
15 18 /**
16 - * Constructor: manages uninstall for multisite
19 + * Constructor: manages uninstall for multisite.
17 20 *
18 21 * @since 0.5
19 22 */
20 23 public function __construct() {
@@ -19,14 +22,14 @@
19 22 */
20 23 public function __construct() {
21 24 global $wpdb;
22 25
23 - // 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.
24 27 if ( ! defined( 'PLL_REMOVE_ALL_DATA' ) || ! PLL_REMOVE_ALL_DATA ) {
25 28 return;
26 29 }
27 30
28 - // 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.
29 32 if ( is_multisite() ) {
30 33 foreach ( $wpdb->get_col( "SELECT blog_id FROM $wpdb->blogs" ) as $blog_id ) {
31 34 switch_to_blog( $blog_id );
32 35 $this->uninstall();
@@ -31,17 +34,15 @@
31 34 switch_to_blog( $blog_id );
32 35 $this->uninstall();
33 36 }
34 37 restore_current_blog();
35 - }
36 - else {
38 + } else {
37 39 $this->uninstall();
38 40 }
39 41 }
40 42
41 43 /**
42 - * Removes ALL plugin data
43 - * only when the relevant option is active
44 + * Removes **all** plugin data.
44 45 *
45 46 * @since 0.5
46 47 */
47 48 public function uninstall() {
@@ -46,51 +47,46 @@
46 47 */
47 48 public function uninstall() {
48 49 global $wpdb;
49 50
50 - // Executes each module's uninstall script, if it exists
51 - $pll_modules_dir = dirname( __FILE__ ) . '/modules';
52 - opendir( $pll_modules_dir );
53 - while ( ( $module = readdir() ) != false ) {
54 - if ( substr( $module, 0, 1 ) !== '.' ) {
55 - $uninstall_script = $pll_modules_dir . '/' . $module . '/uninstall.php';
56 - if ( file_exists( $uninstall_script ) ) {
57 - require $uninstall_script; // phpcs:ignore WordPressVIPMinimum.Files.IncludingFile.UsingVariable
58 - }
59 - }
60 - }
61 - closedir();
51 + do_action( 'pll_uninstall' );
62 52
63 - // Suppress data of the old model < 1.2
64 - // FIXME: to remove when support for v1.1.6 will be dropped
65 - $wpdb->termmeta = $wpdb->prefix . 'termmeta'; // registers the termmeta table in wpdb
53 + // We need to register the taxonomies.
54 + $pll_taxonomies = array(
55 + 'language',
56 + 'term_language',
57 + 'post_translations',
58 + 'term_translations',
59 + );
66 60
67 - // Do nothing if the termmeta table does not exists
68 - if ( count( $wpdb->get_results( "SHOW TABLES LIKE '$wpdb->termmeta'" ) ) ) {
69 - $wpdb->query( "DELETE FROM $wpdb->postmeta WHERE meta_key = '_translations'" );
70 - $wpdb->query( "DELETE FROM $wpdb->termmeta WHERE meta_key = '_language'" );
71 - $wpdb->query( "DELETE FROM $wpdb->termmeta WHERE meta_key = '_rtl'" );
72 - $wpdb->query( "DELETE FROM $wpdb->termmeta WHERE meta_key = '_translations'" );
73 - }
74 -
75 - // Need to register the taxonomies
76 - $pll_taxonomies = array( 'language', 'term_language', 'post_translations', 'term_translations' );
77 61 foreach ( $pll_taxonomies as $taxonomy ) {
78 - 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 + );
79 72 }
80 73
81 - $languages = get_terms( 'language', array( 'hide_empty' => false ) );
74 + $languages = get_terms(
75 + array(
76 + 'taxonomy' => 'language',
77 + 'hide_empty' => false,
78 + )
79 + );
82 80
83 - // Delete users options
84 - foreach ( get_users( array( 'fields' => 'ID' ) ) as $user_id ) {
85 - delete_user_meta( $user_id, 'pll_filter_content' );
86 - delete_user_meta( $user_id, 'pll_dismissed_notices' ); // Legacy meta.
87 - foreach ( $languages as $lang ) {
88 - delete_user_meta( $user_id, 'description_' . $lang->slug );
89 - }
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 );
90 86 }
91 87
92 - // Delete menu language switchers
88 + // Delete menu language switchers.
93 89 $ids = get_posts(
94 90 array(
95 91 'post_type' => 'nav_menu_item',
96 92 'numberposts' => -1,
@@ -103,16 +99,19 @@
103 99 foreach ( $ids as $id ) {
104 100 wp_delete_post( $id, true );
105 101 }
106 102
107 - // Delete the strings translations ( <1.2 )
108 - // FIXME: to remove when support for v1.1.6 will be dropped
109 - foreach ( $languages as $lang ) {
110 - delete_option( 'polylang_mo' . $lang->term_id );
111 - }
112 -
113 - // Delete the strings translations 1.2+
114 - 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 + );
115 114 $ids = get_posts(
116 115 array(
117 116 'post_type' => 'polylang_mo',
118 117 'post_status' => 'any',
@@ -124,38 +123,71 @@
124 123 foreach ( $ids as $id ) {
125 124 wp_delete_post( $id, true );
126 125 }
127 126
128 - // Delete all what is related to languages and translations
127 + // Delete all what is related to languages and translations.
129 128 $term_ids = array();
130 129 $tt_ids = array();
131 130
132 - 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 ) {
133 139 $term_ids[] = (int) $term->term_id;
134 - $tt_ids[] = (int) $term->term_taxonomy_id;
140 + $tt_ids[] = (int) $term->term_taxonomy_id;
135 141 }
136 142
137 143 if ( ! empty( $term_ids ) ) {
138 144 $term_ids = array_unique( $term_ids );
139 - $wpdb->query( "DELETE FROM {$wpdb->terms} WHERE term_id IN ( " . implode( ',', $term_ids ) . ' )' ); // PHPCS:ignore WordPress.DB.PreparedSQL.NotPrepared
140 - $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 + );
141 172 }
142 173
143 174 if ( ! empty( $tt_ids ) ) {
144 175 $tt_ids = array_unique( $tt_ids );
145 - $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 ) );
146 177 }
147 178
148 - // Delete options
179 + // Delete options.
149 180 delete_option( 'polylang' );
150 - delete_option( 'widget_polylang' ); // Automatically created by WP
151 - 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.
152 183 delete_option( 'polylang_licenses' );
153 184 delete_option( 'pll_dismissed_notices' );
185 + delete_option( 'pll_language_from_content_available' );
186 + delete_option( 'pll_language_taxonomies' );
154 187
155 - // Delete transients
156 - delete_transient( 'pll_languages_list' );
157 - delete_transient( 'pll_upgrade_1_4' );
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.
158 190 }
159 191 }
160 192
161 193 new PLL_Uninstall();