query; // if it's not set then don't use it. if (!array_key_exists('p', $query) || !isset($query['p'])) { return; } $pageid = $query['p']; if (!empty($pageid)) { $permalink = urldecode(get_permalink($pageid)); $status = get_post_status($pageid); if (($permalink != false) && ($status == 'publish')) { $urlHomeDirectory = rtrim(parse_url(get_home_url(), PHP_URL_PATH), '/'); $fromURL = $urlHomeDirectory . '/?p=' . $pageid; $redirect = $abj404dao->getExistingRedirectForURL($fromURL); if (!isset($redirect['id']) || $redirect['id'] == 0) { $abj404dao->setupRedirect($fromURL, ABJ404_STATUS_AUTO, ABJ404_TYPE_POST, $pageid, $options['default_redirect'], 0); } $abj404dao->logRedirectHit($fromURL, $permalink, 'page ID'); $this->forceRedirect($permalink, esc_html($options['default_redirect'])); exit; } } } /** * @global type $abj404logging * @global type $abj404logic * @param type $urlRequest the requested URL. e.g. /404killer/aboutt * @param type $urlSlugOnly only the slug. e.g. /aboutt */ function initializeIgnoreValues($urlRequest, $urlSlugOnly) { global $abj404logging; global $abj404logic; $options = $abj404logic->getOptions(); $ignoreReasonDoNotProcess = null; $ignoreReasonDoProcess = null; // Note: is_admin() does not mean the user is an admin - it returns true when the user is on an admin screen. // ignore requests that are supposed to be for an admin. $adminURL = parse_url(admin_url(), PHP_URL_PATH); if (is_admin() || mb_substr($urlRequest, 0, mb_strlen($adminURL)) == $adminURL) { $abj404logging->debugMessage("Ignoring admin URL: " . $urlRequest); $ignoreReasonDoNotProcess = 'Admin URL'; } // The user agent Zemanta Aggregator http://www.zemanta.com causes a lot of false positives on // posts that are still drafts and not actually published yet. It's from the plugin "WordPress Related Posts" // by https://www.sovrn.com/. $userAgents = preg_split("@\n@", mb_strtolower($options['ignore_dontprocess']), NULL, PREG_SPLIT_NO_EMPTY); $httpUserAgent = mb_strtolower(@$_SERVER['HTTP_USER_AGENT']); foreach ($userAgents as $agentToIgnore) { if (stripos($httpUserAgent, trim($agentToIgnore)) !== false) { $abj404logging->debugMessage("Ignoring user agent (do not redirect): " . esc_html($_SERVER['HTTP_USER_AGENT']) . " for URL: " . esc_html($urlRequest)); $ignoreReasonDoNotProcess = 'User agent (do not redirect): ' . $_SERVER['HTTP_USER_AGENT']; } } // ----- ignore based on regex file path $patternsToIgnore = $options['folders_files_ignore_usable']; if (!empty($patternsToIgnore)) { foreach ($patternsToIgnore as $patternToIgnore) { $_REQUEST[ABJ404_PP]['debug_info'] = 'Applying regex pattern to ignore\"' . $patternToIgnore . '" to URL slug: ' . $urlSlugOnly; if (preg_match("/" . $patternToIgnore . "/", $urlSlugOnly, $matches)) { $abj404logging->debugMessage("Ignoring file/folder (do not redirect) for URL: " . esc_html($urlSlugOnly) . ", pattern used: " . $patternToIgnore); $ignoreReasonDoNotProcess = 'Files and folders (do not redirect) pattern: ' . esc_html($patternToIgnore); } $_REQUEST[ABJ404_PP]['debug_info'] = 'Cleared after regex pattern to ignore.'; } } $_REQUEST[ABJ404_PP]['ignore_donotprocess'] = $ignoreReasonDoNotProcess; // ----- // ignore and process $userAgents = preg_split("@\n@", mb_strtolower($options['ignore_doprocess']), NULL, PREG_SPLIT_NO_EMPTY); $httpUserAgent = mb_strtolower(@$_SERVER['HTTP_USER_AGENT']); foreach ($userAgents as $agentToIgnore) { if (stripos($httpUserAgent, trim($agentToIgnore)) !== false) { $abj404logging->debugMessage("Ignoring user agent (process ok): " . esc_html($_SERVER['HTTP_USER_AGENT']) . " for URL: " . esc_html($urlRequest)); $ignoreReasonDoProcess = 'User agent (process ok): ' . $agentToIgnore; } } $_REQUEST[ABJ404_PP]['ignore_doprocess'] = $ignoreReasonDoProcess; } /** The passed in reason will be appended to the automatically generated reason. * @param type $reason */ function sendTo404Page($requestedURL, $reason = '') { global $abj404dao; global $abj404logic; global $abj404logging; // this may be used later when displaying suggestions. $cookieName = ABJ404_PP . '_REQUEST_URI'; try { setcookie($cookieName, urldecode(esc_url($_SERVER['REQUEST_URI'])), time() + (60 * 4), "/"); } catch (Exception $e) { $abj404logging->debugMessage("There was an issue setting a cookie: " . $e->getMessage()); // This javascript redirect will only appear if the header redirect did not work for some reason. // document.cookie = "username=John Doe; expires=Thu, 18 Dec 2013 12:00:00 UTC"; $expireTime = date("D, d M Y H:i:s T", time() + (60 * 4)); $c = "\n" . '' . "\n"; echo $c; } $_REQUEST[ABJ404_PP][$cookieName] = urldecode(esc_url($_SERVER['REQUEST_URI'])); $options = $abj404logic->getOptions(); // --------------------------------------- // if there's a default 404 page specified then use that. $dest404page = (array_key_exists('dest404page', $options) && isset($options['dest404page']) ? $options['dest404page'] : ABJ404_TYPE_404_DISPLAYED . '|' . ABJ404_TYPE_404_DISPLAYED); if (($dest404page != ABJ404_TYPE_404_DISPLAYED . '|' . ABJ404_TYPE_404_DISPLAYED) && ($dest404page != ABJ404_TYPE_404_DISPLAYED)) { $permalink = ABJ_404_Solution_Functions::permalinkInfoToArray($dest404page, 0); // get the existing redirect before adding a new one. $redirect = $abj404dao->getExistingRedirectForURL($requestedURL); if (!isset($redirect['id']) || $redirect['id'] == 0) { $abj404dao->setupRedirect($requestedURL, ABJ404_STATUS_CAPTURED, $permalink['type'], $permalink['id'], $options['default_redirect'], 0); } $abj404dao->logRedirectHit($requestedURL, $permalink['link'], 'user specified 404 page. ' . $reason); $abj404logic->forceRedirect(esc_url($permalink['link']), esc_html($options['default_redirect'])); exit; } // --------------------------------------- // give up. log the 404. if (@$options['capture_404'] == '1') { // get the existing redirect before adding a new one. $redirect = $abj404dao->getExistingRedirectForURL($requestedURL); if (!isset($redirect['id']) || $redirect['id'] == 0) { $abj404dao->setupRedirect($requestedURL, ABJ404_STATUS_CAPTURED, ABJ404_TYPE_404_DISPLAYED, ABJ404_TYPE_404_DISPLAYED, $options['default_redirect'], 0); } $abj404dao->logRedirectHit($requestedURL, '404', 'gave up. ' . $reason); } else { if ($abj404logging->isDebug()) { $abj404logging->debugMessage("No permalink found to redirect to. capture_404 is off. Requested URL: " . $requestedURL . " | Redirect: " . wp_kses_post(json_encode($redirect)) . " | is_single(): " . is_single() . " | " . "is_page(): " . is_page() . " | is_feed(): " . is_feed() . " | is_trackback(): " . is_trackback() . " | is_preview(): " . is_preview() . " | options: " . wp_kses_post(json_encode($options))); } } } /** * @param type $skip_db_check * @return array */ function getOptions($skip_db_check = false) { $options = get_option('abj404_settings'); if (!is_array($options)) { add_option('abj404_settings', '', '', 'no'); $options = array(); } // Check to make sure we aren't missing any new options. $defaults = $this->getDefaultOptions(); $missing = false; foreach ($defaults as $key => $value) { if (!isset($options) || $options == '' || !array_key_exists($key, $options) || !isset($options[$key]) || '' == $options[$key]) { $options[$key] = $value; $missing = true; } } if ($missing) { update_option('abj404_settings', $options); } if ($skip_db_check == false) { if (!array_key_exists('DB_VERSION', $options) || $options['DB_VERSION'] != ABJ404_VERSION) { $options = $this->updateToNewVersion($options); } } return $options; } /** Do any maintenance when upgrading to a new version. * @global type $abj404logging * @param type $options * @return type */ function updateToNewVersion($options) { global $abj404logging; if ($this->currentlyUpdatingDatabaseVersion) { $abj404logging->errorMessage("Avoiding infinite loop on database update."); return $options; } try { $this->currentlyUpdatingDatabaseVersion = true; $returnValue = $this->updateToNewVersionAction($options); } catch (Exception $e) { $this->errorMessage("Error updating to new version. ", $e); } $this->currentlyUpdatingDatabaseVersion = false; return $returnValue; } /** Do any maintenance when upgrading to a new version. * @global type $abj404logic * @global type $abj404logging * @global type $wpdb * @param type $options * @return type */ function updateToNewVersionAction($options) { global $abj404logic; global $abj404logging; global $wpdb; $currentDBVersion = "(unknown)"; if (array_key_exists('DB_VERSION', $options)) { $currentDBVersion = $options['DB_VERSION']; } $abj404logging->infoMessage("Updating database version from " . $currentDBVersion . " to " . ABJ404_VERSION . " (begin)."); // wp_abj404_logsv2 exists since 1.7. $upgradesEtc = new ABJ_404_Solution_DatabaseUpgradesEtc(); $upgradesEtc->createDatabaseTables(); // abj404_duplicateCronAction is no longer needed as of 1.7. wp_clear_scheduled_hook('abj404_duplicateCronAction'); ABJ_404_Solution_PluginLogic::doUnregisterCrons(); // added in 1.8.2 ABJ_404_Solution_PluginLogic::doRegisterCrons(); // since 1.9.0. ignore_doprocess add SeznamBot, Pinterestbot, UptimeRobot and "Slurp" -> "Yahoo! Slurp" if (version_compare($currentDBVersion, '1.9.0') < 0) { $userAgents = preg_split("@\n@", $options['ignore_doprocess'], NULL, PREG_SPLIT_NO_EMPTY); $uasForSearch = preg_split("@\n@", mb_strtolower($options['ignore_doprocess']), NULL, PREG_SPLIT_NO_EMPTY); foreach ($userAgents as &$str) { if (mb_strtolower(trim($str)) == "slurp") { $str = "Yahoo! Slurp"; $abj404logging->infoMessage('Changed user agent "Slurp" to "Yahoo! Slurp" in the do not log list.'); } } if (!in_array("seznambot", $uasForSearch)) { $userAgents[] = 'SeznamBot'; $abj404logging->infoMessage('Added user agent "SeznamBot" to do not log list."'); } if (!in_array("pinterestbot", $uasForSearch)) { $userAgents[] = 'Pinterestbot'; $abj404logging->infoMessage('Added user agent "Pinterestbot" to do not log list."'); } if (!in_array("uptimerobot", $uasForSearch)) { $userAgents[] = 'UptimeRobot'; $abj404logging->infoMessage('Added user agent "UptimeRobot" to do not log list."'); } $options['ignore_doprocess'] = implode("\n",$userAgents); update_option('abj404_settings', $options); } // move to the new log table if (version_compare($currentDBVersion, '1.8.0') < 0) { $query = "SHOW TABLES LIKE '" . $wpdb->prefix . 'abj404_logs' . "'"; $result = ABJ_404_Solution_DataAccess::queryAndGetResults($query); $rows = $result['rows']; // make sure empty() only sees a variable and not a function for older PHP versions, due to // https://stackoverflow.com/a/2173318 and // https://wordpress.org/support/topic/fatal-error-will-latest-release/ $filteredRows = array_filter($rows); if (!empty($filteredRows)) { $query = ABJ_404_Solution_Functions::readFileContents(__DIR__ . "/sql/migrateToNewLogsTable.sql"); $query = str_replace('{wp_abj404_logsv2}', $wpdb->prefix . 'abj404_logsv2', $query); $query = str_replace('{wp_abj404_logs}', $wpdb->prefix . 'abj404_logs', $query); $query = str_replace('{wp_abj404_redirects}', $wpdb->prefix . 'abj404_redirects', $query); $result = ABJ_404_Solution_DataAccess::queryAndGetResults($query); // if anything was successfully imported then delete the old table. if ($result['rows_affected'] > 0) { $abj404logging->infoMessage($result['rows_affected'] . ' log rows were migrated to the new table structre.'); // log the rows inserted/migrated. $wpdb->query('drop table ' . $wpdb->prefix . 'abj404_logs'); } } } // add the second part of the default destination page. $dest404page = $options['dest404page']; if (mb_strpos($dest404page, '|') === false) { // not found if ($dest404page == '0') { $dest404page .= "|" . ABJ404_TYPE_404_DISPLAYED; } else { $dest404page .= '|' . ABJ404_TYPE_POST; } $options['dest404page'] = $dest404page; update_option('abj404_settings', $options); } $options = $abj404logic->doUpdateDBVersionOption(); $abj404logging->infoMessage("Updating database version to " . ABJ404_VERSION . " (end)."); return $options; } /** * @return array */ function getDefaultOptions() { $options = array( 'default_redirect' => '301', 'send_error_logs' => '0', 'capture_404' => '1', 'capture_deletion' => 1095, 'manual_deletion' => '0', 'log_deletion' => '365', 'admin_notification' => '200', 'remove_matches' => '1', 'suggest_minscore' => '25', 'suggest_max' => '5', 'suggest_title' => '
' . __('No suggestions. :/ ', '404-solution') . '
', 'suggest_cats' => '1', 'suggest_tags' => '1', 'auto_redirects' => '1', 'auto_score' => '90', 'auto_deletion' => '1095', 'auto_cats' => '1', 'auto_tags' => '1', 'dest404page' => '0|' . ABJ404_TYPE_404_DISPLAYED, 'maximum_log_disk_usage' => '100', 'ignore_dontprocess' => 'zemanta aggregator', 'ignore_doprocess' => "Googlebot\nMediapartners-Google\nAdsBot-Google\ndevelopers.google.com\n" . "Bingbot\nYahoo! Slurp\nDuckDuckBot\nBaiduspider\nYandexBot\nwww.sogou.com\nSogou-Test-Spider\n" . "Exabot\nfacebot\nfacebookexternalhit\nia_archiver\nSeznamBot\nPinterestbot\nUptimeRobot\nMJ12bot", 'recognized_post_types' => "page\npost\nproduct", 'recognized_categories' => "", 'folders_files_ignore' => "", 'folders_files_ignore_usable' => "", 'debug_mode' => 0, 'DB_VERSION' => '0.0.0', 'menuLocation' => 'underSettings', 'admin_notification_email' => '', 'page_redirects_order_by' => 'url', 'page_redirects_order' => 'ASC', 'captured_order_by' => 'logshits', 'captured_order' => 'DESC', ); return $options; } function doUpdateDBVersionOption() { global $abj404logic; $options = $abj404logic->getOptions(true); $options['DB_VERSION'] = ABJ404_VERSION; update_option('abj404_settings', $options); return $options; } /** Remove cron jobs. */ static function doUnregisterCrons() { $crons = array('abj404_cleanupCronAction', 'abj404_duplicateCronAction', 'removeDuplicatesCron', 'deleteOldRedirectsCron'); for ($i = 0; $i < count($crons); $i++) { $cron_name = $crons[$i]; $timestamp1 = wp_next_scheduled($cron_name); while ($timestamp1 != False) { wp_unschedule_event($timestamp1, $cron_name); $timestamp1 = wp_next_scheduled($cron_name); } $timestamp2 = wp_next_scheduled($cron_name, ''); while ($timestamp2 != False) { wp_unschedule_event($timestamp2, $cron_name, ''); $timestamp2 = wp_next_scheduled($cron_name, ''); } wp_clear_scheduled_hook($cron_name); } } /** Create database tables. Register crons. etc. * @global type $abj404logic * @global type $abj404dao */ static function runOnPluginActivation() { global $abj404logic; global $abj404dao; global $abj404logging; add_option('abj404_settings', '', '', 'no'); if (!isset($abj404logging)) { $abj404logging = new ABJ_404_Solution_Logging(); } if (!isset($abj404dao)) { $abj404dao = new ABJ_404_Solution_DataAccess(); } if (!isset($abj404logic)) { $abj404logic = new ABJ_404_Solution_PluginLogic(); } $upgradesEtc = new ABJ_404_Solution_DatabaseUpgradesEtc(); $upgradesEtc->createDatabaseTables(); ABJ_404_Solution_PluginLogic::doRegisterCrons(); $abj404logic->doUpdateDBVersionOption(); } static function doRegisterCrons() { if (!wp_next_scheduled('abj404_cleanupCronAction')) { // we randomize this so that when the geo2ip file is downloaded, there aren't a whole // lot of users that request the file at the same time. $timeForEvent = '0' . rand(0, 5) . ':' . rand(10, 59) . ':' . rand(10, 59); wp_schedule_event(strtotime($timeForEvent), 'daily', 'abj404_cleanupCronAction'); } } function getDebugLogFileLink() { return "?page=" . ABJ404_PP . "&subpage=abj404_debugfile"; } /** Do the passed in action and return the associated message. * @global type $abj404logic * @param type $action * @param string $sub * @return type */ function handlePluginAction($action, &$sub) { global $abj404logic; global $abj404dao; global $abj404logging; $message = ""; if ($action == "updateOptions") { if (check_admin_referer('abj404UpdateOptions') && is_admin()) { // delete the debug file and lose all changes, or $shouldDeleteDebugFile = @$_POST['deleteDebugFile']; if ($shouldDeleteDebugFile) { $filepath = $abj404logging->getDebugFilePath(); if (!file_exists($filepath)) { $message = sprintf(__("Debug file not found. (%s)", '404-solution'), $filepath); } else if ($abj404logging->deleteDebugFile()) { $message = sprintf(__("Debug file(s) deleted. (%s)", '404-solution'), $filepath); } else { $message = sprintf(__("Issue deleting debug file. (%s)", '404-solution'), $filepath); } return $message; } // save all changes. saveOptions, saveSettings $sub = "abj404_options"; $message = $this->updateOptionsFromPOST(); if ($message == "") { $message = __('Options Saved Successfully!', '404-solution'); } else { $message .= __('Some options were not saved successfully.', '404-solution'); } } else { $abj404logging->debugMessage("Unexpected result. How did we get here? is_admin: " . is_admin() . ", Action: " . esc_html($action) . ", Sub: " . esc_html($sub)); } } else if ($action == "addRedirect") { if (check_admin_referer('abj404addRedirect') && is_admin()) { $message = $this->addAdminRedirect(); if ($message == "") { $message = __('New Redirect Added Successfully!', '404-solution'); } else { $message .= __('Error: unable to add new redirect.', '404-solution'); } } else { $abj404logging->debugMessage("Unexpected result. How did we get here? is_admin: " . is_admin() . ", Action: " . esc_html($action) . ", Sub: " . esc_html($sub)); } } else if ($action == "emptyRedirectTrash") { if (check_admin_referer('abj404_emptyRedirectTrash') && is_admin()) { $abj404logic->doEmptyTrash('abj404_redirects'); $message = __('All trashed URLs have been deleted!', '404-solution'); } else { $abj404logging->debugMessage("Unexpected result. How did we get here? is_admin: " . is_admin() . ", Action: " . esc_html($action) . ", Sub: " . esc_html($sub)); } } else if ($action == "emptyCapturedTrash") { if (check_admin_referer('abj404_bulkProcess') && is_admin()) { $abj404logic->doEmptyTrash('abj404_captured'); $message = __('All trashed URLs have been deleted!', '404-solution'); } else { $abj404logging->debugMessage("Unexpected result. How did we get here? is_admin: " . is_admin() . ", Action: " . esc_html($action) . ", Sub: " . esc_html($sub)); } } else if ($action == "purgeRedirects") { if (check_admin_referer('abj404_purgeRedirects') && is_admin()) { $message = $abj404dao->deleteSpecifiedRedirects(); } else { $abj404logging->debugMessage("Unexpected result. How did we get here? is_admin: " . is_admin() . ", Action: " . esc_html($action) . ", Sub: " . esc_html($sub)); } } else if ($action == "runMaintenance") { if (check_admin_referer('abj404_runMaintenance') && is_admin()) { $message = $abj404dao->deleteOldRedirectsCron(); } else { $abj404logging->debugMessage("Unexpected result. How did we get here? is_admin: " . is_admin() . ", Action: " . esc_html($action) . ", Sub: " . esc_html($sub)); } } else if (substr($action . '', 0, 4) == "bulk") { if (check_admin_referer('abj404_bulkProcess') && is_admin()) { if (!array_key_exists('idnum', $_POST) || !isset($_POST['idnum'])) { $abj404logging->debugMessage("No ID(s) specified for bulk action: " . esc_html($action)); echo sprintf(__("Error: No ID(s) specified for bulk action. (%s)", '404-solution'), esc_html($action), false); return; } $message = $abj404logic->doBulkAction($action, array_map('absint', $_POST['idnum'])); } else { $abj404logging->debugMessage("Unexpected result. How did we get here? is_admin: " . is_admin() . ", Action: " . esc_html($action) . ", Sub: " . esc_html($sub)); } } return $message; } /** Move redirects to trash. * @return type */ function hanldeTrashAction() { global $abj404dao; global $abj404logging; $message = ""; // Handle Trash Functionality if (array_key_exists('trash', $_GET) && isset($_GET['trash'])) { if (check_admin_referer('abj404_trashRedirect') && is_admin()) { $trash = ""; if ($_GET['trash'] == 0) { $trash = 0; } else if ($_GET['trash'] == 1) { $trash = 1; } else { $abj404logging->errorMessage("Unexpected trash operation: " . esc_html($_GET['trash'])); $message = __('Error: Bad trash operation specified.', '404-solution'); return $message; } $message = $abj404dao->moveRedirectsToTrash(absint($_GET['id']), $trash); if ($message == "") { if ($trash == 1) { $message = __('Redirect moved to trash successfully!', '404-solution'); } else { $message = __('Redirect restored from trash successfully!', '404-solution'); } } else { if ($trash == 1) { $message = __('Error: Unable to move redirect to trash.', '404-solution'); } else { $message = __('Error: Unable to move redirect from trash.', '404-solution'); } } } } return $message; } function handleActionChangeItemsPerRow() { global $abj404dao; if ($abj404dao->getPostOrGetSanitize('action') == 'changeItemsPerRow') { $showRows = max(absint($abj404dao->getPostOrGetSanitize('perpage')), ABJ404_OPTION_MIN_PERPAGE); $options = $this->getOptions(); $options['perpage'] = $showRows; update_option('abj404_settings', $options); } } /** * * @global type $abj404dao * @global type $abj404logging * @return string */ function handleActionImportRedirects() { global $abj404dao; global $abj404logging; $message = ""; if ($abj404dao->getPostOrGetSanitize('action') == 'importRedirects') { if ($abj404dao->getPostOrGetSanitize('sanity_404redirected') != '1') { $message = __("Error: You didn't check the I understand checkbox. No importing for you!", '404-solution'); return $message; } check_admin_referer('abj404_importRedirects'); try { $result = $abj404dao->importDataFromPluginRedirectioner(); if ($result['last_error'] != '') { $message = sprintf(__("Error: No records were imported. SQL result: %s", '404-solution'), wp_kses_post(json_encode($result['last_error']))); } else { $message = sprintf(__("Records imported: %s", '404-solution'), esc_html($result['rows_affected'])); } } catch (Exception $e) { $message = "Error: Importing failed. Message: " . $e->getMessage(); $abj404logging->errorMessage('Error importing redirects.', $e); } } return $message; } function handleActionDeleteLog() { $message = ""; //Handle Delete Functionality if (array_key_exists('deleteDebugFile', $_GET) && @$_GET['deleteDebugFile'] == '1') { if (check_admin_referer('abj404_deleteDebugFile') && is_admin()) { $abj404dao->deleteRedirect(absint($_GET['id'])); $message = __('Redirect Removed Successfully!', '404-solution'); } } return $message; } /** Delete redirects. * @global type $abj404dao * @return type */ function handleDeleteAction() { global $abj404dao; $message = ""; //Handle Delete Functionality if (array_key_exists('remove', $_GET) && @$_GET['remove'] == 1) { if (check_admin_referer('abj404_removeRedirect') && is_admin()) { if (preg_match('/[0-9]+/', $_GET['id'])) { $abj404dao->deleteRedirect(absint($_GET['id'])); $message = __('Redirect Removed Successfully!', '404-solution'); } } } return $message; } /** Set a redirect as ignored. * @return type */ function handleIgnoreAction() { global $abj404dao; global $abj404logging; $message = ""; //Handle Ignore Functionality if (array_key_exists('ignore', $_GET) && isset($_GET['ignore'])) { if (check_admin_referer('abj404_ignore404') && is_admin()) { if ($_GET['ignore'] != 0 && $_GET['ignore'] != 1) { $abj404logging->debugMessage("Unexpected ignore operation: " . esc_html($_GET['ignore'])); $message = __('Error: Bad ignore operation specified.', '404-solution'); return $message; } if (preg_match('/[0-9]+/', $_GET['id'])) { if ($_GET['ignore'] == 1) { $newstatus = ABJ404_STATUS_IGNORED; } else { $newstatus = ABJ404_STATUS_CAPTURED; } $message = $abj404dao->updateRedirectTypeStatus(absint($_GET['id']), $newstatus); if ($message == "") { if ($newstatus == ABJ404_STATUS_CAPTURED) { $message = __('Removed 404 URL from ignored list successfully!', '404-solution'); } else { $message = __('404 URL marked as ignored successfully!', '404-solution'); } } else { if ($newstatus == ABJ404_STATUS_CAPTURED) { $message = __('Error: unable to remove URL from ignored list', '404-solution'); } else { $message = __('Error: unable to mark URL as ignored', '404-solution'); } } } } } return $message; } /** Set a redirect as "organize later". * @return type */ function handleLaterAction() { global $abj404dao; global $abj404logging; $message = ""; //Handle Ignore Functionality if (array_key_exists('later', $_GET) && isset($_GET['later'])) { if (check_admin_referer('abj404_organizeLater') && is_admin()) { if ($_GET['later'] != 0 && $_GET['later'] != 1) { $abj404logging->debugMessage("Unexpected organize later operation: " . esc_html($_GET['later'])); $message = __('Error: Bad organize later operation specified.', '404-solution'); return $message; } if (preg_match('/[0-9]+/', $_GET['id'])) { if ($_GET['later'] == 1) { $newstatus = ABJ404_STATUS_LATER; } else { $newstatus = ABJ404_STATUS_CAPTURED; } $message = $abj404dao->updateRedirectTypeStatus(absint($_GET['id']), $newstatus); if ($message == "") { if ($newstatus == ABJ404_STATUS_CAPTURED) { $message = __('Removed 404 URL from organize later list successfully!', '404-solution'); } else { $message = __('404 URL marked as organize later successfully!', '404-solution'); } } else { if ($newstatus == ABJ404_STATUS_CAPTURED) { $message = __('Error: unable to remove URL from organize later list', '404-solution'); } else { $message = __('Error: unable to mark URL as organize later', '404-solution'); } } } } } return $message; } /** Edit redirect data. * @global type $abj404dao * @param string $sub * @param type $action * @return type */ function handleActionEdit(&$sub, &$action) { global $abj404dao; $message = ""; //Handle edit posts if (array_key_exists('action', $_POST) && @$_POST['action'] == "editRedirect") { $id = $abj404dao->getPostOrGetSanitize('id'); $ids = $abj404dao->getPostOrGetSanitize('ids_multiple'); if (!($id === null && $ids === null) && (preg_match('/[0-9]+/', '' . $id) || preg_match('/[0-9]+/', '' . $ids))) { if (check_admin_referer('abj404editRedirect') && is_admin()) { $message = $this->updateRedirectData(); if ($message == "") { $message .= __('Redirect Information Updated Successfully!', '404-solution'); $sub = 'abj404_redirects'; $action = ''; } else { $message .= __('Error: Unable to update redirect data.', '404-solution'); } } } } return $message; } /** * @global type $abj404dao * @param type $action * @param type $ids * @return string */ function doBulkAction($action, $ids) { global $abj404dao; global $abj404logging; $message = ""; // nonce already verified. $abj404logging->debugMessage("In doBulkAction. Action: " . esc_html($action == '' ? '(none)' : $action)) . ", ids: " . wp_kses_post(json_encode($ids)); if ($action == "bulkignore" || $action == "bulkcaptured" || $action == "bulklater" || $action == "bulk_trash_restore") { if ($action == "bulkignore") { $status = ABJ404_STATUS_IGNORED; } else if ($action == "bulkcaptured") { $status = ABJ404_STATUS_CAPTURED; } else if ($action == "bulklater") { $status = ABJ404_STATUS_LATER; } else if ($action == "bulk_trash_restore") { // don't change the status for this case. } else { $abj404logging->errorMessage("Unrecognized bulk action: " . esc_html($action)); echo sprintf(__("Error: Unrecognized bulk action. (%s)", '404-solution'), esc_html($action)); return; } $count = 0; foreach ($ids as $id) { $s = $abj404dao->moveRedirectsToTrash($id, 0); if ($action != "bulk_trash_restore") { $s = $abj404dao->updateRedirectTypeStatus($id, $status); } if ($s == "") { $count++; } } if ($action == "bulkignore") { $message = $count . " " . __('URL(s) marked as Ignored.', '404-solution'); } else if ($action == "bulkcaptured") { $message = $count . " " . __('URL(s) marked as Captured.', '404-solution'); } else if ($action == "bulklater") { $message = $count . " " . __('URL(s) marked as Later.', '404-solution'); } else if ($action == "bulk_trash_restore") { $message = $count . " " . __('URL(s) restored.', '404-solution'); } else { $abj404logging->errorMessage("Unrecognized bulk action: " . esc_html($action)); echo sprintf(__("Error: Unrecognized bulk action. (%s)", '404-solution'), esc_html($action)); } } else if ($action == "bulk_trash_delete_permanently") { $count = 0; foreach ($ids as $id) { $abj404dao->deleteRedirect(absint($id)); $count ++; } $message = $count . " " . __('URL(s) deleted', '404-solution'); } else if ($action == "bulktrash") { $count = 0; foreach ($ids as $id) { $s = $abj404dao->moveRedirectsToTrash($id, 1); if ($s == "") { $count ++; } } $message = $count . " " . __('URL(s) moved to trash', '404-solution'); } else { $abj404logging->errorMessage("Unrecognized bulk action: " . esc_html($action)); echo sprintf(__("Error: Unrecognized bulk action. (%s)", '404-solution'), esc_html($action)); } return $message; } /** * This is for both empty trash buttons (page redirects and captured 404 URLs). * @param type $sub */ function doEmptyTrash($sub) { global $abj404logging; global $wpdb; global $abj404_redirect_types; global $abj404_captured_types; $redirectsTable = $wpdb->prefix . "abj404_redirects"; $query = ""; if ($sub == "abj404_captured") { $query = "delete FROM " . $redirectsTable . " \n" . "where disabled = 1 \n" . " and status in (" . implode(", ", $abj404_captured_types) . ")"; } else if ($sub == "abj404_redirects") { $query = "delete FROM " . $redirectsTable . " \n" . "where disabled = 1 \n" . " and status in (" . implode(", ", $abj404_redirect_types) . ")"; } else { $abj404logging->errorMessage("Unrecognized type in doEmptyTrash(" . $sub . ")"); } $result = ABJ_404_Solution_DataAccess::queryAndGetResults($query); $abj404logging->debugMessage("doEmptyTrash deleted " . $result['rows_affected'] . " rows total. (" . $sub . ")"); ABJ_404_Solution_DataAccess::queryAndGetResults("optimize table " . $redirectsTable); } /** * @global type $abj404dao * @return string */ function updateRedirectData() { global $abj404dao; global $abj404logging; $message = ""; $fromURL = ""; $ids_multiple = ""; if (@$_POST['url'] == "" && @$_POST['ids_multiple'] != "") { $ids_multiple = array_map('absint', explode(',', $_POST['ids_multiple'])); } else if (@$_POST['url'] != "" && @$_POST['ids_multiple'] == "") { $fromURL = $_POST['url']; } else { $message .= __('Error: URL is a required field.', '404-solution') . "