PluginProbe
Polylang / 2.8
Polylang v2.8
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.8, at uninstall.php

154 lines 4.6 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * @package Polylang
4 */
5
6 if ( ! defined( 'WP_UNINSTALL_PLUGIN' ) ) { // If uninstall not called from WordPress exit
7 exit;
8 }
9
10 /**
11 * Manages Polylang uninstallation
12 * The goal is to remove ALL Polylang related data in db
13 *
14 * @since 0.5
15 */
16 class PLL_Uninstall {
17
18 /**
19 * Constructor: manages uninstall for multisite
20 *
21 * @since 0.5
22 */
23 public function __construct() {
24 global $wpdb;
25
26 // Don't do anything except if the constant PLL_REMOVE_ALL_DATA is explicitely defined and true.
27 if ( ! defined( 'PLL_REMOVE_ALL_DATA' ) || ! PLL_REMOVE_ALL_DATA ) {
28 return;
29 }
30
31 // Check if it is a multisite uninstall - if so, run the uninstall function for each blog id
32 if ( is_multisite() ) {
33 foreach ( $wpdb->get_col( "SELECT blog_id FROM $wpdb->blogs" ) as $blog_id ) {
34 switch_to_blog( $blog_id );
35 $this->uninstall();
36 }
37 restore_current_blog();
38 }
39 else {
40 $this->uninstall();
41 }
42 }
43
44 /**
45 * Removes ALL plugin data
46 * only when the relevant option is active
47 *
48 * @since 0.5
49 */
50 public function uninstall() {
51 global $wpdb;
52
53 do_action( 'pll_uninstall' );
54
55 // Suppress data of the old model < 1.2
56 // FIXME: to remove when support for v1.1.6 will be dropped
57 $wpdb->termmeta = $wpdb->prefix . 'termmeta'; // registers the termmeta table in wpdb
58
59 // Do nothing if the termmeta table does not exists
60 if ( count( $wpdb->get_results( "SHOW TABLES LIKE '$wpdb->termmeta'" ) ) ) {
61 $wpdb->query( "DELETE FROM $wpdb->postmeta WHERE meta_key = '_translations'" );
62 $wpdb->query( "DELETE FROM $wpdb->termmeta WHERE meta_key = '_language'" );
63 $wpdb->query( "DELETE FROM $wpdb->termmeta WHERE meta_key = '_rtl'" );
64 $wpdb->query( "DELETE FROM $wpdb->termmeta WHERE meta_key = '_translations'" );
65 }
66
67 // Need to register the taxonomies
68 $pll_taxonomies = array( 'language', 'term_language', 'post_translations', 'term_translations' );
69 foreach ( $pll_taxonomies as $taxonomy ) {
70 register_taxonomy( $taxonomy, null, array( 'label' => false, 'public' => false, 'query_var' => false, 'rewrite' => false ) );
71 }
72
73 $languages = get_terms( 'language', array( 'hide_empty' => false ) );
74
75 // Delete users options
76 foreach ( get_users( array( 'fields' => 'ID' ) ) as $user_id ) {
77 delete_user_meta( $user_id, 'pll_filter_content' );
78 delete_user_meta( $user_id, 'pll_dismissed_notices' ); // Legacy meta.
79 foreach ( $languages as $lang ) {
80 delete_user_meta( $user_id, 'description_' . $lang->slug );
81 }
82 }
83
84 // Delete menu language switchers
85 $ids = get_posts(
86 array(
87 'post_type' => 'nav_menu_item',
88 'numberposts' => -1,
89 'nopaging' => true,
90 'fields' => 'ids',
91 'meta_key' => '_pll_menu_item',
92 )
93 );
94
95 foreach ( $ids as $id ) {
96 wp_delete_post( $id, true );
97 }
98
99 // Delete the strings translations ( <1.2 )
100 // FIXME: to remove when support for v1.1.6 will be dropped
101 foreach ( $languages as $lang ) {
102 delete_option( 'polylang_mo' . $lang->term_id );
103 }
104
105 // Delete the strings translations 1.2+
106 register_post_type( 'polylang_mo', array( 'rewrite' => false, 'query_var' => false ) );
107 $ids = get_posts(
108 array(
109 'post_type' => 'polylang_mo',
110 'post_status' => 'any',
111 'numberposts' => -1,
112 'nopaging' => true,
113 'fields' => 'ids',
114 )
115 );
116 foreach ( $ids as $id ) {
117 wp_delete_post( $id, true );
118 }
119
120 // Delete all what is related to languages and translations
121 $term_ids = array();
122 $tt_ids = array();
123
124 foreach ( get_terms( $pll_taxonomies, array( 'hide_empty' => false ) ) as $term ) {
125 $term_ids[] = (int) $term->term_id;
126 $tt_ids[] = (int) $term->term_taxonomy_id;
127 }
128
129 if ( ! empty( $term_ids ) ) {
130 $term_ids = array_unique( $term_ids );
131 $wpdb->query( "DELETE FROM {$wpdb->terms} WHERE term_id IN ( " . implode( ',', $term_ids ) . ' )' ); // PHPCS:ignore WordPress.DB.PreparedSQL.NotPrepared
132 $wpdb->query( "DELETE FROM {$wpdb->term_taxonomy} WHERE term_id IN ( " . implode( ',', $term_ids ) . ' )' ); // PHPCS:ignore WordPress.DB.PreparedSQL.NotPrepared
133 }
134
135 if ( ! empty( $tt_ids ) ) {
136 $tt_ids = array_unique( $tt_ids );
137 $wpdb->query( "DELETE FROM {$wpdb->term_relationships} WHERE term_taxonomy_id IN ( " . implode( ',', $tt_ids ) . ' )' ); // PHPCS:ignore WordPress.DB.PreparedSQL.NotPrepared
138 }
139
140 // Delete options
141 delete_option( 'polylang' );
142 delete_option( 'widget_polylang' ); // Automatically created by WP
143 delete_option( 'polylang_wpml_strings' ); // Strings registered with icl_register_string
144 delete_option( 'polylang_licenses' );
145 delete_option( 'pll_dismissed_notices' );
146
147 // Delete transients
148 delete_transient( 'pll_languages_list' );
149 delete_transient( 'pll_upgrade_1_4' );
150 }
151 }
152
153 new PLL_Uninstall();
154