Поддомены и WordPress без плагина

16 Декабрь, 2015

Для одного из сайтов на WordPress потребовалось создать лендинг на поддомене. Лендинг представляет из себя страницу на том же WP-сайте с отдельным шаблоном. Как ни странно, работающих и, желательно, бесплатных плагинов выполняющих такую функцию найти не удалось. Но после некоторого копания, обнаружились 2 способа решения.

Способ первый

  1. Поддомен в виде алиаса должен быть прицеплен к корневой папке (решается через панель управления вашим хостингом, либо обращением в его техподдержку). Проверьте, что при обращении к субдомену открывается главная страница вашего сайта.
  2. Создаем страницу с постоянной ссылкой (slug) соответсвующей имени вашего поддомена.
  3. Добавляем код в файл functions.php вашей темы WordPress:
<?php
function hijack_page() {
 
    // делим URL и проверяем, является ли первая часть поддоменом.
    $pieces = explode( '.', $_SERVER['HTTP_HOST'] );
    $subdomain = array_shift( $pieces ); // получаем первую часть разделенного URL
 
    // получаем адрес страницы после домена
    $pieces = explode('/', $_SERVER['REQUEST_URI']);
    array_shift($pieces);
    $slug1 = array_shift($pieces); // получаем первую часть окончания URI страницы
 
    // Проверяем, существует ли страница и отличается ли поддомен от "www"
    if($slug1 && $subdomain != "www"){
 
           // получаем основные переменные запроса WP query для получение содержимого страницы
           global $query_string;
 
           // выполняем запрос the query posts чтобы получить желаемую страницу
           query_posts($query_string.'&pagename='.$subdomain.'/'.$slug1);
           return;
    }
}
 
hijack_page();
?>

По аналогии, можно привязать поддомен к чему кгодно (категории, метке и т. д.). Нужно только подкорректировать запрос query_posts

Способ второй

  1. Создаем папки с нужными нам поддоменами в корневой директории и привязываем алиасы к ним. При обращении к поддомену должна открываться эта созданная папка. 
  2. Внутри папки создаем файл index.php со следующим содержимым:
<?php

$_GET['page_id']=XXX; //XXX — ID вашей страницы
require('../wp-blog-header.php');

?>

Второй вариант явно хуже, но пусть тоже побудет тут.