getOptions(); $shouldUpdateURL = true; // if we're not supposed to update the URL then don't. if (!array_key_exists('update_suggest_url', $options) || !isset($options['update_suggest_url']) || $options['update_suggest_url'] != 1) { $shouldUpdateURL = false; $debugMessage .= "do not update (update_suggest_url is off), "; } // if the cookie we need isn't set then give up. $updateURLCookieName = ABJ404_PP . '_REQUEST_URI'; $updateURLCookieName .= '_UPDATE_URL'; if (!isset($_REQUEST[$updateURLCookieName]) || empty($_REQUEST[$updateURLCookieName])) { $shouldUpdateURL = false; $debugMessage .= "do not update (no cookie found), "; } $dest404page = (isset($options['dest404page']) ? $options['dest404page'] : ABJ404_TYPE_404_DISPLAYED . '|' . ABJ404_TYPE_404_DISPLAYED); // if we're not currently loading the custom 404 page then don't change the URL. if ($abj404logic->thereIsAUserSpecified404Page($dest404page)) { // get the user specified 404 page. $permalink = ABJ_404_Solution_Functions::permalinkInfoToArray($dest404page, 0, null, $options); // if the last part of the URL does not match the custom 404 page then // don't update the URL. if (!$f->endsWithCaseSensitive($permalink['link'], $_SERVER['REQUEST_URI']) && $permalink['status'] != 'trash') { $shouldUpdateURL = false; $debugMessage .= "do not update (not on custom 404 page (" . $permalink['link'] . ")), "; } else { $debugMessage .= "ok to update (displaying custom 404 page (" . $permalink['link'] . ")), "; } } else { // the 404 page is the default 404 page. so we shouldn't change the URL. $shouldUpdateURL = false; $debugMessage .= "do not update (no custom 404 page specified), "; } $content = ''; if ($shouldUpdateURL) { // replace the current URL with the user's actual requested URL. $requestedURL = $_REQUEST[$updateURLCookieName]; $userFriendlyURL = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? "https" : "http") . "://" . $_SERVER['HTTP_HOST'] . esc_url($requestedURL); // Use wp_json_encode to safely encode the URL for JavaScript to prevent XSS $content .= "window.history.replaceState({}, null, " . wp_json_encode($userFriendlyURL) . ");\n"; $debugMessage .= "Updating the URL from " . $_SERVER['REQUEST_URI'] . " to " . esc_url($userFriendlyURL) . ", "; } if ($content != '') { $content = '\n\n"; echo $content; } $debugMessage .= "is404: " . is_404() . ", " . esc_html('auto_redirects: ' . $options['auto_redirects'] . ', auto_score: ' . $options['auto_score'] . ', template_redirect_priority: ' . $options['template_redirect_priority'] . ', auto_cats: ' . $options['auto_cats'] . ', auto_tags: ' . $options['auto_tags'] . ', dest404page: ' . $options['dest404page']) . ", "; $debugMessage .= "is_single(): " . is_single() . " | " . "is_page(): " . is_page() . " | is_feed(): " . is_feed() . " | is_trackback(): " . is_trackback() . " | is_preview(): " . is_preview(); $abj404logging->debugMessage("updateURLbarIfNecessary: " . $debugMessage); } /** * @param array $atts */ static function shortcodePageSuggestions( $atts ) { $abj404logic = ABJ_404_Solution_PluginLogic::getInstance(); $abj404spellChecker = ABJ_404_Solution_SpellChecker::getInstance(); $f = ABJ_404_Solution_Functions::getInstance(); $abj404dao = ABJ_404_Solution_DataAccess::getInstance(); // Attributes $atts = shortcode_atts( array( ), $atts ); $options = $abj404logic->getOptions(); $content = "\n\n"; // get the slug that caused the 404 from the session. $urlRequest = ''; $cookieName = ABJ404_PP . '_REQUEST_URI'; if (isset($_COOKIE[$cookieName]) && !empty($_COOKIE[$cookieName])) { $urlRequest = esc_url($f->regexReplace('\?.*', '', esc_url($_COOKIE[$cookieName]))); // delete the cookie because the request was a one-time thing. // we use javascript to delete the cookie because the headers have already been sent. $content .= " \n"; } // we delete the UPDATE_URL cookie here, where the shortcode is used so that it won't // get deleted too early if multiple redirects happen. $updateURLCookieName = ABJ404_PP . '_REQUEST_URI'; $updateURLCookieName .= '_UPDATE_URL'; if (isset($_COOKIE[$updateURLCookieName]) && !empty($_COOKIE[$updateURLCookieName])) { // delete the cookie since we're done with it. it's a one-time use thing. $content .= " \n"; } if (isset($_REQUEST[ABJ404_PP]) && isset($_REQUEST[ABJ404_PP][$cookieName])) { $urlRequest = $_REQUEST[ABJ404_PP][$cookieName]; } if ($urlRequest == '') { // if no 404 was detected then we don't offer any suggestions return "\n"; } $urlSlugOnly = $abj404logic->removeHomeDirectory($urlRequest); $permalinkSuggestionsPacket = $abj404spellChecker->findMatchingPosts($urlSlugOnly, @$options['suggest_cats'], @$options['suggest_tags']); $permalinkSuggestions = $permalinkSuggestionsPacket[0]; $rowType = $permalinkSuggestionsPacket[1]; $showExtraAdminData = (is_user_logged_in() && $abj404logic->userIsPluginAdmin()); $extraData = null; $extraDataById = []; // <--- New: Array to hold extra data indexed by ID $adminDebugData = []; // <--- New: Array to collect data for JS if ($showExtraAdminData) { // add extra information to the permalinkSuggestionsPacket. for each permalink, // retrieve the post_type, taxonomy, post_author (this is an id not a name), // post_date, post_name (this is the slug), $postIDs = array_keys($permalinkSuggestions); if (!empty($postIDs)) { // for each id remove the part after '|' using substring foreach ($postIDs as $index => $id) { $postIDs[$index] = $f->substr($id, 0, $f->strpos($id, '|')); } $rawExtraData = $abj404dao->getExtraDataToPermalinkSuggestions($postIDs); foreach ($rawExtraData as $dataItem) { $extraDataById['post_id_' . $dataItem['post_id']] = $dataItem; $extraDataById['term_id_' . $dataItem['term_id']] = $dataItem; } } } // allow some HTML. $content .= '