Skip to content

Instantly share code, notes, and snippets.

@andrewinsidelazarev
Last active November 14, 2024 12:05
Show Gist options
  • Save andrewinsidelazarev/a154843e447333fd2247585d74c9cea3 to your computer and use it in GitHub Desktop.
Save andrewinsidelazarev/a154843e447333fd2247585d74c9cea3 to your computer and use it in GitHub Desktop.
Advanced 404-page snippet for WordPress
function handle_custom_404() {
// Получаем запрашиваемый путь URL
$request_uri = $_SERVER['REQUEST_URI'];
$request_path = trim(urldecode($request_uri), '/');
// Извлекаем только последний сегмент пути
$last_segment = basename($request_path);
// Функция для поиска существующего пути в других папках
function find_existing_path($path) {
global $wpdb;
// Выполняем объединенный запрос для поиска слага в постах и тегах без ограничения LIMIT 1
$results = $wpdb->get_results($wpdb->prepare(
"(SELECT ID AS item_id, 'post' AS item_type FROM {$wpdb->posts}
WHERE post_name = %s AND post_status = 'publish')
UNION ALL
(SELECT t.term_id AS item_id, 'tag' AS item_type FROM {$wpdb->terms} t
INNER JOIN {$wpdb->term_taxonomy} tt ON t.term_id = tt.term_id
WHERE t.slug = %s AND tt.taxonomy = 'post_tag')",
$path, $path
));
// Если найдена ровно одна запись, возвращаем её URL
if (count($results) === 1) {
$result = $results[0];
if ($result->item_type === 'post') {
return get_permalink($result->item_id);
} elseif ($result->item_type === 'tag') {
return get_tag_link($result->item_id);
}
}
// Если результатов несколько или ничего не найдено, используем старую логику
$paths_to_check = ['blog', 'category', 'news', 'tag', 'news/news-photo'];
foreach ($paths_to_check as $folder) {
$potential_path = $folder . '/' . $path;
// Проверяем, существует ли страница по этому пути или термин в нужной таксономии
if (url_to_postid(site_url($potential_path)) != 0 || term_exists($path, $folder)) {
return site_url($potential_path);
}
}
return false;
}
// Проверка, существует ли похожий путь в других папках
$existing_path = find_existing_path($last_segment);
if ($existing_path) {
// Если найден похожий путь, выполняем редирект
wp_redirect($existing_path, 301);
exit;
}
// Поиск по ключевым словам, заменяя "-" и "_" на плюсы
$search_query = str_replace(['-', '_', '%20'], '+', $last_segment);
// Выполняем поиск по ключевым словам
$search = new WP_Query([
's' => $search_query,
'posts_per_page' => 5
]);
// Выводим результаты, если они найдены
if ($search->have_posts()) {
echo '</br>';
$locale = get_locale();
if ($locale === 'ru_RU') {
echo '<h2>Возможно, Вы искали это:</h2>';
} elseif ($locale === 'it_IT') {
echo '<h2>Forse stavi cercando questo:</h2>';
} else {
echo '<h2>Perhaps you were looking for this:</h2>';
}
echo '</br>';
echo '<div>';
// Вместо вывода ссылок, выводим миниатюры постов
while ($search->have_posts()) :
$search->the_post();
echo '<div class="post-thumbnail">';
get_template_part('content', get_post_format());
echo '</div>';
endwhile;
// Выводим пагинацию
// the_posts_pagination();
echo '</div>';
wp_reset_postdata();
}
}
@andrewinsidelazarev
Copy link
Author

В файл 404.php в теме вставить:

@andrewinsidelazarev
Copy link
Author

<?php // Вызов функции для проверки и вывода предложений handle_custom_404(); ?>

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment