/** * Load and return all ids of redirections that are involved in circular redirection. * * @since 1.0.0 * @access public * * @return array Ids of all circular redirections. */ public function get_circular_redirections($force_reload = false) { if (isset($this->_circular_ids) && !$force_reload) { return $this->_circular_ids; } global $wpdb; $query = "SELECT redirection_id, redirect_from, redirect_to, status_code FROM " . self::get_database_table() . " ORDER BY redirect_from DESC"; $circulars = $wpdb->get_results($query, ARRAY_A); // Clean up results and make a readable array. $circulars_clean = array(); foreach ($circulars as $circular) { extract($circular); $redirect_from = '/' . trim(am_str_replace_recursive('//', '/', $redirect_from), '/'); $redirect_to = am_str_replace_recursive('//', '/', $redirect_to); if ('/' !== $redirect_to) { $redirect_to = rtrim($redirect_to, '/'); } $circulars_clean[$redirection_id] = compact('redirect_from', 'redirect_to', 'status_code'); } $this->_circular_ids = array(); //fu($circulars_clean); $circular_redirection_ids = array(); foreach ($circulars_clean as $redirection_id => $circular) { // If the current redirection has already been handled, continue. if (array_key_exists($redirection_id, $this->_parsed_redirections) || in_array($redirection_id, $this->_circular_ids)) { continue; } $is_circular = false; extract($circular); $current_circular_redirection_ids = array($redirection_id); //fu($this->get_next_redirection( $circulars_clean, $redirect_to ) ); while ($redirection_id_new = $this->get_next_redirection($circulars_clean, $redirect_to)) { if ($redirection_id == $redirection_id_new || in_array($redirection_id_new, $current_circular_redirection_ids)) { $is_circular = true; $this->_circular_ids = array_unique(array_merge($this->_circular_ids, $current_circular_redirection_ids)); break; } $current_circular_redirection_ids[] = $redirection_id_new; $redirect_to = $circulars_clean[$redirection_id_new]['redirect_to']; } //fu($redirect_to); if (!$is_circular) { // $this->_parsed_redirections[ $redirection_id ] = compact( 'redirect_from', 'redirect_to', 'status_code' ); // Set all chain redirections as parsed. if (!empty($current_circular_redirection_ids)) { foreach ($current_circular_redirection_ids as $redirection_id) { $this->_parsed_redirections[$redirection_id] = $circulars_clean[$redirection_id]; $this->_parsed_redirections[$redirection_id]['redirect_to'] = $redirect_to; } } //fu($this->_parsed_redirections); } } return $this->_circular_ids; }
/** * Clean up and set the "redirect_to" field. * * @param string $redirect_to */ public function set_redirect_to($redirect_to) { $redirect_to = am_str_replace_recursive('//', '/', $redirect_to); if ('/' !== $redirect_to) { $redirect_to = rtrim($redirect_to, '/'); } $this->_redirect_to = $redirect_to; }
/** ************************************************************************ * Optional. You can handle your bulk actions anywhere or anyhow you prefer. * For this example package, we will handle it in the class to keep things * clean and organized. * * @see $this->prepare_items() **************************************************************************/ function save_redirections($data, $action = 'save') { if (!isset($data) || !isset($action)) { return null; } global $wpdb; if ('save' == $action) { // Remove the "add-new-redirection" entry. if (isset($data[-1])) { unset($data[-1]); } $result = null; foreach ($data as $redirection_id => $redirection) { extract($redirection); // Correct all slash issues. $redirect_from = '/' . trim(am_str_replace_recursive('//', '/', $redirect_from), '/'); $redirect_to = am_str_replace_recursive('//', '/', $redirect_to); if ('/' !== $redirect_to) { $redirect_to = rtrim($redirect_to, '/'); } $result = $wpdb->update(RedirectMan::get_database_table(), compact('redirect_from', 'redirect_to', 'status_code'), array('redirection_id' => $redirection_id), array('%s', '%s', '%d'), array('%d')); if (false !== $result) { if (0 < $result) { $this->_affected_ids[] = $redirection_id; } } else { $this->_operation = 'error'; $this->_status_message = _n('Error occured while saving Redirection!', 'Error occured while saving Redirections!', count($data), 'redirectman'); break; } } if (false !== $result) { //&& count( $this->_affected_ids ) > 0 ) { $this->_status_message = sprintf(_n('%d Redirection updated!', '%d Redirections updated!', count($this->_affected_ids), 'redirectman'), count($this->_affected_ids)); $this->_operation = 'updated'; } } elseif ('save_new' == $action) { if (isset($data[-1]) && ($redirection = $data[-1])) { extract($redirection); if (am_strornull($redirect_from)) { // Correct all slash issues. $redirect_from = '/' . trim(am_str_replace_recursive('//', '/', $redirect_from), '/'); $redirect_to = am_str_replace_recursive('//', '/', $redirect_to); if ('/' !== $redirect_to) { $redirect_to = rtrim($redirect_to, '/'); } $result = $wpdb->insert(RedirectMan::get_database_table(), compact('redirect_from', 'redirect_to', 'status_code'), array('%s', '%s', '%d')); if ($result) { if (isset($wpdb->insert_id)) { $this->_affected_ids = array($wpdb->insert_id); } $this->_operation = 'added'; $this->_status_message = __('New Redirection Added!', 'redirectman'); } else { $this->_operation = 'error'; $this->_status_message = __('Error occured while adding new Redirection!', 'redirectman'); } } } } }