Files
sevastopol-tort.ru/wp-content/themes/sevastopol-tort-child/inc/routes.php
2026-07-12 13:05:13 +03:00

343 lines
13 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
add_action( 'init', 'sev_tort_register_rewrite_rules' );
function sev_tort_register_rewrite_rules() {
foreach ( sev_tort_pages() as $slug => $page ) {
add_rewrite_rule( '^' . preg_quote( $slug, '/' ) . '/?$', 'index.php?sev_tort_page=' . $slug, 'top' );
}
}
add_filter( 'query_vars', 'sev_tort_query_vars' );
function sev_tort_query_vars( $vars ) {
$vars[] = 'sev_tort_page';
return $vars;
}
add_filter( 'wp_sitemaps_enabled', '__return_false' );
add_action( 'template_redirect', 'sev_tort_redirect_order_page_to_home', 1 );
function sev_tort_redirect_order_page_to_home() {
$path = isset( $_SERVER['REQUEST_URI'] ) ? parse_url( wp_unslash( $_SERVER['REQUEST_URI'] ), PHP_URL_PATH ) : '';
$path = trim( (string) $path, '/' );
if ( 'torty-na-zakaz' !== $path ) {
return;
}
wp_safe_redirect( home_url( '/' ), 301, 'Sevastopol Tort' );
exit;
}
add_filter( 'redirect_canonical', 'sev_tort_disable_static_seo_redirects', 10, 2 );
function sev_tort_disable_static_seo_redirects( $redirect_url, $requested_url ) {
if ( sev_tort_is_static_seo_path() ) {
return false;
}
return $redirect_url;
}
add_action( 'init', 'sev_tort_static_seo_files', 0 );
function sev_tort_static_seo_files() {
if ( ! sev_tort_is_static_seo_path() ) {
return;
}
$path = isset( $_SERVER['REQUEST_URI'] ) ? parse_url( wp_unslash( $_SERVER['REQUEST_URI'] ), PHP_URL_PATH ) : '';
$path = trim( (string) $path, '/' );
if ( 'sitemap_index.xml' === $path ) {
sev_tort_send_sitemap_index();
}
if ( 'sitemap.xml' === $path ) {
sev_tort_send_sitemap();
}
if ( 'robots.txt' === $path ) {
sev_tort_send_robots();
}
if ( 'llms.txt' === $path ) {
sev_tort_send_llms_txt();
}
if ( 'pricing.md' === $path ) {
sev_tort_send_pricing_md();
}
if ( 'pricing.txt' === $path ) {
sev_tort_send_pricing_txt();
}
}
function sev_tort_is_static_seo_path() {
$path = isset( $_SERVER['REQUEST_URI'] ) ? parse_url( wp_unslash( $_SERVER['REQUEST_URI'] ), PHP_URL_PATH ) : '';
$path = trim( (string) $path, '/' );
return in_array( $path, array( 'sitemap.xml', 'sitemap_index.xml', 'robots.txt', 'llms.txt', 'pricing.md', 'pricing.txt' ), true );
}
function sev_tort_send_sitemap_index() {
status_header( 200 );
header( 'Content-Type: application/xml; charset=UTF-8' );
echo '<?xml version="1.0" encoding="UTF-8"?>' . "\n";
echo '<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">' . "\n";
echo "\t" . '<sitemap>' . "\n";
echo "\t\t" . '<loc>' . esc_url( home_url( '/sitemap.xml' ) ) . '</loc>' . "\n";
echo "\t\t" . '<lastmod>' . esc_html( gmdate( 'Y-m-d' ) ) . '</lastmod>' . "\n";
echo "\t" . '</sitemap>' . "\n";
echo '</sitemapindex>';
exit;
}
function sev_tort_send_sitemap() {
status_header( 200 );
header( 'Content-Type: application/xml; charset=UTF-8' );
$pages = sev_tort_pages();
$urls = array(
array(
'loc' => home_url( '/' ),
'changefreq' => 'weekly',
'priority' => '1.0',
),
);
foreach ( $pages as $page ) {
if ( empty( $page['indexable'] ) || 'torty-na-zakaz' === $page['slug'] ) {
continue;
}
$priority = in_array( $page['slug'], array( 'bento', 'detskie', 'svadebnye', 'na-den-rozhdeniya', 'ceny' ), true ) ? '0.9' : '0.8';
$urls[] = array(
'loc' => home_url( '/' . $page['slug'] . '/' ),
'changefreq' => 'weekly',
'priority' => $priority,
);
}
echo '<?xml version="1.0" encoding="UTF-8"?>' . "\n";
echo '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">' . "\n";
foreach ( $urls as $url ) {
echo "\t" . '<url>' . "\n";
echo "\t\t" . '<loc>' . esc_url( $url['loc'] ) . '</loc>' . "\n";
echo "\t\t" . '<lastmod>' . esc_html( gmdate( 'Y-m-d' ) ) . '</lastmod>' . "\n";
echo "\t\t" . '<changefreq>' . esc_html( $url['changefreq'] ) . '</changefreq>' . "\n";
echo "\t\t" . '<priority>' . esc_html( $url['priority'] ) . '</priority>' . "\n";
echo "\t" . '</url>' . "\n";
}
echo '</urlset>';
exit;
}
function sev_tort_send_robots() {
status_header( 200 );
header( 'Content-Type: text/plain; charset=UTF-8' );
echo "User-agent: *\n";
echo "Disallow: /wp-admin/\n";
echo "Allow: /wp-admin/admin-ajax.php\n";
echo "Disallow: /wp-includes/\n";
echo "Disallow: /wp-content/plugins/\n";
echo "Disallow: /wp-content/cache/\n";
echo "Disallow: /wp-json/\n";
echo "Disallow: /*?s=\n\n";
echo 'Sitemap: ' . esc_url( home_url( '/sitemap.xml' ) ) . "\n";
exit;
}
function sev_tort_send_llms_txt() {
status_header( 200 );
header( 'Content-Type: text/plain; charset=UTF-8' );
echo implode( "\n", sev_tort_llms_lines() );
exit;
}
function sev_tort_send_pricing_md() {
status_header( 200 );
header( 'Content-Type: text/markdown; charset=UTF-8' );
echo implode( "\n", sev_tort_pricing_md_lines() );
exit;
}
function sev_tort_send_pricing_txt() {
status_header( 200 );
header( 'Content-Type: text/plain; charset=UTF-8' );
echo implode( "\n", sev_tort_pricing_txt_lines() );
exit;
}
function sev_tort_llms_lines() {
return array(
'# sevastopol-tort.ru',
'',
'Сайт кондитерской студии в Севастополе. Основная услуга: торты на заказ с доставкой и самовывозом.',
'',
'## Кто мы',
'- Название: Создаем повод для праздника',
'- Город: Севастополь',
'- Оператор: ИП Максимов Антон Сергеевич',
'- Контактный телефон: ' . sev_tort_site_phone(),
'',
'## Услуги',
'- [Торты на заказ](https://sevastopol-tort.ru/)',
'- [Бенто-торты](https://sevastopol-tort.ru/bento/)',
'- [Детские торты](https://sevastopol-tort.ru/detskie/)',
'- [Свадебные торты](https://sevastopol-tort.ru/svadebnye/)',
'- [Корпоративные торты](https://sevastopol-tort.ru/korporativnye/)',
'- [Торты на день рождения](https://sevastopol-tort.ru/na-den-rozhdeniya/)',
'- [Срочный заказ торта](https://sevastopol-tort.ru/srochnyj-zakaz/)',
'- [Начинки](https://sevastopol-tort.ru/nachinki/)',
'',
'## Цены и условия',
'- [Машинно-читаемые цены](https://sevastopol-tort.ru/pricing.md)',
'- [Цены на торты](https://sevastopol-tort.ru/ceny/)',
'- Бенто 500-550 г: 1 500-1 800 ₽',
'- Бенто макси около 1 кг: 2 200-2 500 ₽',
'- Детские и торты на день рождения: 2 000-2 500 ₽/кг',
'- Свадебные торты: базово от 3 000-4 000 ₽; сложные многоярусные композиции 10 000-13 000 ₽+',
'- Корпоративные торты: 3 500-5 000 ₽+',
'- Предоплата: 30%',
'- Оплата: наличные, перевод, карта, расчетный счет',
'- Доставка: бесплатно от 2 500 ₽; если заказ дешевле 2 500 ₽, доставка 500 ₽',
'- География доставки: все районы Севастополя',
'',
'## Ключевые страницы',
'- [Доставка и оплата](https://sevastopol-tort.ru/dostavka-i-oplata/)',
'- [Портфолио](https://sevastopol-tort.ru/portfolio/)',
'- [Отзывы](https://sevastopol-tort.ru/otzyvy/)',
'- [FAQ](https://sevastopol-tort.ru/faq/)',
'- [Контакты](https://sevastopol-tort.ru/kontakty/)',
'- [Политика конфиденциальности](https://sevastopol-tort.ru/politika-konfidencialnosti/)',
);
}
function sev_tort_pricing_md_lines() {
return array(
'# Pricing — Торты на заказ в Севастополе',
'',
'Last updated: ' . gmdate( 'Y-m-d' ),
'',
'## Бенто',
'- Format: базовый бенто',
'- Weight: около 500-550 г',
'- Price: 1 500-1 800 ₽',
'- Timing: обычно 2-4 дня; срочно при свободном окне',
'- Good for: подарок, свидание, небольшое поздравление',
'',
'## Бенто макси',
'- Format: увеличенный бенто',
'- Weight: около 1 кг',
'- Price: 2 200-2 500 ₽',
'- Timing: обычно 2-4 дня',
'- Good for: компактный торт на несколько порций',
'',
'## Детские торты',
'- Format: детский торт на заказ',
'- Weight: рассчитывается по числу гостей',
'- Price: 2 000-2 500 ₽/кг',
'- Extras: фигурки из мастики, съедобная печать и сложная тема увеличивают цену',
'- Timing: лучше заказывать за 2-4 дня, сложный декор заранее',
'',
'## Торты на день рождения',
'- Format: тематический праздничный торт',
'- Weight: рассчитывается по числу гостей',
'- Price: 2 000-2 500 ₽/кг',
'- Extras: индивидуальный декор, цифры, персонажи и печать увеличивают цену',
'',
'## Свадебные торты',
'- Format: свадебный торт, одноярусный или многоярусный',
'- Price: базовый ярусный торт от 3 000-4 000 ₽',
'- Complex design: 10 000-13 000 ₽+',
'- Extras: цветы, ленты, монограмма, сложная сборка, доставка на площадку',
'- Timing: лучше обсуждать за 1-3 недели',
'',
'## Корпоративные торты',
'- Format: торт с логотипом, фирменными цветами или тематическим дизайном',
'- Price: 3 500-5 000 ₽+',
'- Payment: наличные, перевод, карта, расчетный счет',
'',
'## Delivery and payment',
'- City: Севастополь',
'- Delivery area: все районы Севастополя',
'- Delivery price: бесплатно от 2 500 ₽; иначе 500 ₽',
'- Pickup: available by agreement',
'- Prepayment: 30%',
'- Payment methods: наличные, перевод, карта, расчетный счет',
'',
'## Exact quote',
'Точная стоимость зависит от веса, начинки, декора, срочности и доставки. Для расчета нужно указать дату, повод, количество гостей, желаемую начинку, декор и адрес доставки.',
);
}
function sev_tort_pricing_txt_lines() {
return array(
'Торты на заказ в Севастополе — цены',
'Бенто 500-550 г: 1 500-1 800 ₽; срок обычно 2-4 дня; срочно при свободном окне.',
'Бенто макси около 1 кг: 2 200-2 500 ₽; срок обычно 2-4 дня.',
'Детские торты: 2 000-2 500 ₽/кг; фигурки, съедобная печать и сложная тема увеличивают цену.',
'Торты на день рождения: 2 000-2 500 ₽/кг; индивидуальный декор считается отдельно.',
'Свадебные торты: базово от 3 000-4 000 ₽; сложные многоярусные композиции 10 000-13 000 ₽+.',
'Корпоративные торты: 3 500-5 000 ₽+; возможна оплата на расчетный счет.',
'Доставка по всем районам Севастополя: бесплатно от 2 500 ₽; иначе 500 ₽.',
'Самовывоз: доступен по согласованию.',
'Предоплата: 30%.',
'Оплата: наличные, перевод, карта, расчетный счет.',
'Точный расчет зависит от веса, начинки, декора, срочности и адреса доставки.',
);
}
add_action( 'template_redirect', 'sev_tort_route_status' );
function sev_tort_route_status() {
if ( sev_tort_current_page_config() ) {
status_header( 200 );
}
}
add_filter( 'template_include', 'sev_tort_template_include' );
function sev_tort_template_include( $template ) {
$page = sev_tort_current_page_config();
if ( ! $page ) {
return $template;
}
if ( 'politika-konfidencialnosti' === $page['slug'] ) {
return get_stylesheet_directory() . '/page-templates/page-policy.php';
}
if ( 'portfolio' === $page['slug'] ) {
return get_stylesheet_directory() . '/page-templates/page-portfolio.php';
}
return get_stylesheet_directory() . '/page-templates/page-service.php';
}
function sev_tort_current_page_config() {
$slug = get_query_var( 'sev_tort_page' );
if ( ! $slug && is_front_page() ) {
return false;
}
if ( ! $slug && is_page() ) {
$slug = get_post_field( 'post_name', get_queried_object_id() );
}
$pages = sev_tort_pages();
return isset( $pages[ $slug ] ) ? $pages[ $slug ] : false;
}