Make WordPress Core

Opened 8 years ago

Closed 8 years ago

Last modified 8 years ago

#38452 closed defect (bug) (invalid)

register_uninstall_hook was not called on multisite enabled.

Reported by: okvee's profile okvee Owned by:
Milestone: Priority: normal
Severity: normal Version: 4.6.1
Component: Plugins Keywords:
Focuses: multisite Cc:

Description

I have this plugin on wordpress.org. https://wordpress.org/plugins/rundiz-postorder/

And this is the uninstall code.

<?php


namespace RdPostOrder\App\Controllers\Admin;

if (!class_exists('\\RdPostOrder\\App\\Controllers\\Admin\\Uninstall')) {
    /**
     * The controller that will be working on uninstall (delete) the plugin.
     */
    class Uninstall implements \RdPostOrder\App\Controllers\ControllerInterface
    {


        use \RdPostOrder\App\AppTrait;


        /**
         * {@inheritDoc}
         */
        public function registerHooks()
        {
            // register uninstall hook
            register_uninstall_hook(RDPOSTORDER_FILE, ['\\RdPostOrder\\App\\Controllers\\Admin\\Uninstall', 'uninstallAction']);
            error_log('register hook uninstall.');
        }// registerHooks


        /**
         * Do the uninstallation action (reset all values to its default).
         * 
         * @global \wpdb $wpdb
         */
        private function doUninstallAction()
        {
            global $wpdb;

            // reset order number in `term_relationships` table.
            /*$results = $wpdb->get_results(
                'SELECT ' . 
                    '`' . $wpdb->term_relationships . '`.`object_id`, ' . 
                    '`' . $wpdb->term_relationships . '`.`term_taxonomy_id`, ' . 
                    '`' . $wpdb->term_taxonomy . '`.`term_taxonomy_id`, ' . 
                    '`' . $wpdb->term_taxonomy . '`.`term_id`, ' . 
                    '`' . $wpdb->term_taxonomy . '`.`taxonomy`, ' . 
                    '`' . $wpdb->posts . '`.`ID`, ' . 
                    '`' . $wpdb->posts . '`.`post_date`, ' . 
                    '`' . $wpdb->posts . '`.`post_name`, ' . 
                    '`' . $wpdb->posts . '`.`post_status`' . 
                    ' FROM `' . $wpdb->term_relationships . '`' . 
                    ' LEFT JOIN `' . $wpdb->term_taxonomy . '` ON `' . $wpdb->term_relationships . '`.`term_taxonomy_id` = `' . $wpdb->term_taxonomy . '`.`term_taxonomy_id`' . 
                    ' LEFT JOIN `' . $wpdb->posts . '` ON `' . $wpdb->term_relationships . '`.`object_id` = `' . $wpdb->posts . '`.`ID`' . 
                    ' WHERE `' . $wpdb->term_taxonomy . '`.`taxonomy` = \'category\'' . 
                    ' AND `' . $wpdb->posts . '`.`post_status` IN(\'' . implode('\', \'', $this->allowed_order_post_status) . '\')' . 
                    ' ORDER BY `' . $wpdb->posts . '`.`post_date` ASC',
                OBJECT
            );
            if (is_array($results)) {
                foreach ($results as $row) {
                    $wpdb->update(
                        $wpdb->term_relationships, 
                        ['term_order' => 0], 
                        ['object_id' => $row->object_id, 'term_taxonomy_id' => $row->term_taxonomy_id],
                        ['%d'],
                        ['%d', '%d']
                    );
                }// endforeach;
                unset($row);
            }
            unset($results);*/ // please read the comment in /Activate controller, it's the same reason.

            // reset order number in `posts` table.
            $results = $wpdb->get_results(
                'SELECT ' . 
                    '`ID`, ' . 
                    '`post_date`, ' . 
                    '`post_name`, ' . 
                    '`post_status`, ' . 
                    '`post_type`' . 
                    ' FROM `' . $wpdb->posts . '`' . 
                    ' WHERE `' . $wpdb->posts . '`.`post_type` = \'post\'' . 
                    ' AND `' . $wpdb->posts . '`.`post_status` IN(\'' . implode('\', \'', $this->allowed_order_post_status) . '\')' . 
                    ' ORDER BY `' . $wpdb->posts . '`.`post_date` ASC',
                OBJECT
            );
            if (is_array($results)) {
                foreach ($results as $row) {
                    $wpdb->update(
                        $wpdb->posts,
                        ['menu_order' => 0],
                        ['ID' => $row->ID],
                        ['%d'],
                        ['%d']
                    );
                }// endforeach;
                unset($row);
            }
            unset($results);

            error_log('did uninstallation. reset data on table `' . $wpdb->posts . '`');
        }// doUninstallAction


        /**
         * Uninstall the plugin.<br>
         * Do the same way as activate the plugin but set the order number to 0 which is its default value.
         * 
         * @global \wpdb $wpdb
         */
        public static function uninstallAction()
        {
            global $wpdb;
            $ThisClass = new self;
            error_log('called to uninstallAction method.');

            if (is_multisite()) {
                $blog_ids = $wpdb->get_col('SELECT blog_id FROM '.$wpdb->blogs);
                $original_blog_id = get_current_blog_id();

                if (is_array($blog_ids)) {
                    // loop thru each sites to do uninstall action (reset data to its default value).
                    foreach ($blog_ids as $blog_id) {
                        error_log('switching to blog id: ' . $blog_id);
                        switch_to_blog($blog_id);
                        $ThisClass->doUninstallAction();
                    }
                }

                // switch back to current site.
                switch_to_blog($original_blog_id);
                unset($blog_id, $blog_ids, $original_blog_id);
            } else {
                $ThisClass->doUninstallAction();
            }
        }// uninstallAction


    }
}

The method registerHooks will be called automatically by my autoload. This plugin is working fine on single site or non multisite enabled. It can be uninstall (delete) the plugin correctly.
In multisite enabled it is not being called, never.

Attachments (1)

rd-postorder.zip (574.0 KB) - added by okvee 8 years ago.
rundiz postorder plugin

Download all attachments as: .zip

Change History (3)

@okvee
8 years ago

rundiz postorder plugin

#1 @okvee
8 years ago

  • Resolution set to invalid
  • Status changed from new to closed

#2 @netweb
8 years ago

  • Milestone Awaiting Review deleted
Note: See TracTickets for help on using tickets.