PluginProbe
Polylang / 2.7.2
Polylang v2.7.2
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
polylang / uninstall.php

uninstall.php in Polylang 2.7.2, at uninstall.php

162 lines 5.0 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 if ( ! defined( 'WP_UNINSTALL_PLUGIN' ) ) { // If uninstall not called from WordPress exit
4 exit;
5 }
6
7 /**
8 * Manages Polylang uninstallation
9 * The goal is to remove ALL Polylang related data in db
10 *
11 * @since 0.5
12 */
13 class PLL_Uninstall {
14
15 /**
16 * Constructor: manages uninstall for multisite
17 *
18 * @since 0.5
19 */
20 public function __construct() {
21 global $wpdb;
22
23 // Don't do anything except if the constant PLL_REMOVE_ALL_DATA is explicitely defined and true.
24 if ( ! defined( 'PLL_REMOVE_ALL_DATA' ) || ! PLL_REMOVE_ALL_DATA ) {
25 return;
26 }
27
28 // Check if it is a multisite uninstall - if so, run the uninstall function for each blog id
29 if ( is_multisite() ) {
30 foreach ( $wpdb->get_col( "SELECT blog_id FROM $wpdb->blogs" ) as $blog_id ) {
31 switch_to_blog( $blog_id );
32 $this->uninstall();
33 }
34 restore_current_blog();
35 }
36 else {
37 $this->uninstall();
38 }
39 }
40
41 /**
42 * Removes ALL plugin data
43 * only when the relevant option is active
44 *
45 * @since 0.5
46 */
47 public function uninstall() {
48 global $wpdb;
49
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();
62
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
66
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 foreach ( $pll_taxonomies as $taxonomy ) {
78 register_taxonomy( $taxonomy, null, array( 'label' => false, 'public' => false, 'query_var' => false, 'rewrite' => false ) );
79 }
80
81 $languages = get_terms( 'language', array( 'hide_empty' => false ) );
82
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 }
90 }
91
92 // Delete menu language switchers
93 $ids = get_posts(
94 array(
95 'post_type' => 'nav_menu_item',
96 'numberposts' => -1,
97 'nopaging' => true,
98 'fields' => 'ids',
99 'meta_key' => '_pll_menu_item',
100 )
101 );
102
103 foreach ( $ids as $id ) {
104 wp_delete_post( $id, true );
105 }
106
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 ) );
115 $ids = get_posts(
116 array(
117 'post_type' => 'polylang_mo',
118 'post_status' => 'any',
119 'numberposts' => -1,
120 'nopaging' => true,
121 'fields' => 'ids',
122 )
123 );
124 foreach ( $ids as $id ) {
125 wp_delete_post( $id, true );
126 }
127
128 // Delete all what is related to languages and translations
129 $term_ids = array();
130 $tt_ids = array();
131
132 foreach ( get_terms( $pll_taxonomies, array( 'hide_empty' => false ) ) as $term ) {
133 $term_ids[] = (int) $term->term_id;
134 $tt_ids[] = (int) $term->term_taxonomy_id;
135 }
136
137 if ( ! empty( $term_ids ) ) {
138 $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
141 }
142
143 if ( ! empty( $tt_ids ) ) {
144 $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
146 }
147
148 // Delete options
149 delete_option( 'polylang' );
150 delete_option( 'widget_polylang' ); // Automatically created by WP
151 delete_option( 'polylang_wpml_strings' ); // Strings registered with icl_register_string
152 delete_option( 'polylang_licenses' );
153 delete_option( 'pll_dismissed_notices' );
154
155 // Delete transients
156 delete_transient( 'pll_languages_list' );
157 delete_transient( 'pll_upgrade_1_4' );
158 }
159 }
160
161 new PLL_Uninstall();
162