Last active
November 14, 2024 12:05
-
-
Save andrewinsidelazarev/a154843e447333fd2247585d74c9cea3 to your computer and use it in GitHub Desktop.
Advanced 404-page snippet for WordPress
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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(); | |
} | |
} | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
<?php // Вызов функции для проверки и вывода предложений handle_custom_404(); ?>