Настройка настраиваемого подкаталога для блога без использования страниц?

Предупреждение: впереди довольно педантичный запрос.

У меня есть дизайн, который использует сообщения (т.е., блог) и пользовательский тип сообщения, называемый «howto». На первой странице сайта («/») есть шаблон, который отображает последние сообщения в блоге и последние хауты. Когда пользователь переходит в раздел блога («/ blog»), они видят другой шаблон, чем когда они переходят к разделу howto («/ howto»).

Я знаю, что очевидный способ сделать это – создать две страницы («Блог» и «Главная»), а затем использовать раскрывающиеся выпадающие меню «Параметры-> Параметры чтения», чтобы явно их установить. Затем я могу связать конкретные шаблоны страниц с этими сообщениями.

Но проклятый, если это не совсем беспорядочно – у меня будет две бесполезные пустые страницы, загромождающие любой список страниц, содержащих админ-код, с фактическим содержимым в них. Вы могли бы подумать, что есть какой-то способ использовать подсказку шаблонов, чтобы это не было необходимо:

  • / howto / -> archive-howto.php
  • / blog / -> archive.php

Так что, на самом деле, я думаю, что вопрос действительно таков:

Как задать настраиваемый путь для сообщений без создания новой страницы?

У меня нет времени, чтобы объяснить это подробно (я по возвращении), но пока это должно работать на вас,

Answer updated with explanation as promised.
WP Rewrite rules are like voodoo, I'm sure there's more than one way to go about this, but here's mine.

Проблема:

Чтобы уточнить свой вопрос для других, кто может наткнуться на этот поток, вы должны создать страницу, не создавая физическую структуру страницы-заполнителя в панели администрирования, которая находится в разделе « Page -> Add New .

По сути, вы хотите создать фальшивую страницу и использовать эту страницу для любого шаблона, который вы указали.

Решение:

Сначала мы настраиваем наши правила перезаписи,

 add_action('init', 'fake_page_rewrite'); function fake_page_rewrite(){ global $wp_rewrite; //set up our query variable %fake_page% which equates to index.php?fake_page= add_rewrite_tag( '%fake_page%', '([^&]+)'); //add rewrite rule that matches /blog/page/2, /blog/page/3, /blog/page/4, etc.. add_rewrite_rule('^blog/page/?([0-9])?','index.php?fake_page=blog&paged=$matches[1]','top'); //add rewrite rule that matches /blog add_rewrite_rule('^blog/?','index.php?fake_page=blog','top'); //add endpoint, in this case 'blog' to satisfy our rewrite rule /blog, /blog/page/ etc.. add_rewrite_endpoint( 'blog', EP_PERMALINK | EP_PAGES ); //flush rules to get this to work properly $wp_rewrite->flush_rules(); } , add_action('init', 'fake_page_rewrite'); function fake_page_rewrite(){ global $wp_rewrite; //set up our query variable %fake_page% which equates to index.php?fake_page= add_rewrite_tag( '%fake_page%', '([^&]+)'); //add rewrite rule that matches /blog/page/2, /blog/page/3, /blog/page/4, etc.. add_rewrite_rule('^blog/page/?([0-9])?','index.php?fake_page=blog&paged=$matches[1]','top'); //add rewrite rule that matches /blog add_rewrite_rule('^blog/?','index.php?fake_page=blog','top'); //add endpoint, in this case 'blog' to satisfy our rewrite rule /blog, /blog/page/ etc.. add_rewrite_endpoint( 'blog', EP_PERMALINK | EP_PAGES ); //flush rules to get this to work properly $wp_rewrite->flush_rules(); } которого add_action('init', 'fake_page_rewrite'); function fake_page_rewrite(){ global $wp_rewrite; //set up our query variable %fake_page% which equates to index.php?fake_page= add_rewrite_tag( '%fake_page%', '([^&]+)'); //add rewrite rule that matches /blog/page/2, /blog/page/3, /blog/page/4, etc.. add_rewrite_rule('^blog/page/?([0-9])?','index.php?fake_page=blog&paged=$matches[1]','top'); //add rewrite rule that matches /blog add_rewrite_rule('^blog/?','index.php?fake_page=blog','top'); //add endpoint, in this case 'blog' to satisfy our rewrite rule /blog, /blog/page/ etc.. add_rewrite_endpoint( 'blog', EP_PERMALINK | EP_PAGES ); //flush rules to get this to work properly $wp_rewrite->flush_rules(); } 

Внутри add_rewrite_tag мы указываем нашу переменную запроса в виде% fake_page%, которая, кстати, вы можете указать все, что вам нужно или подходит для ваших нужд. Мой пример fake_page символичен только для иллюстрации механики этого ответа.

Как переменная запроса работает в этом экземпляре, это соответствует запросу,

 http://www.example.com/blog 

… который затем внутренне сопоставляется,

 http://www.example.com/index.php?fake_page=blog 

Последнее является тем, что вы увидите при запуске структуры постоянной ссылки по умолчанию.

Аналогичным образом запросы,

 http://www.example.com/blog/page/2 http://www.example.com/blog/page/3 http://www.example.com/blog/page/4 etc... 

… каждый будет отображать их эквиваленты,

 http://www.example.com/index.php?fake_page=blog&paged=2 http://www.example.com/index.php?fake_page=blog&paged=3 http://www.example.com/index.php?fake_page=blog&paged=4 etc... 

В приведенном выше фрагменте примера вы заметите, что у нас есть правило перезаписи, которое соответствует совпадению страницы /blog/page/{page_number} над нашим вторым правилом, которое соответствует базе для нашей поддельной страницы /blog .

Это необходимо, чтобы базовое правило не возвращало совпадение в первом вхождении нашей конечной точки, которое определено как blog прежде чем иметь возможность оценить остальную часть запрошенного URL-адреса, чтобы убедиться, что пользователь на самом деле не запрашивал вычисленный результат. В принципе, измените эти правила, и это не сработает.

Как упоминалось ранее, правила перезаписи напоминают мне voodoo, поэтому есть, вероятно, еще один способ сделать заказ, в котором вы указываете свои правила, которые, возможно, связаны с использованием функции add_permastruct . Если у кого есть альтернатива, тогда звоните!

Следующая функция, которая перехватывает template_redirect проверяет наличие нашей fake_page в переменных запроса, если ее соответствие / существует в массиве, мы затем запрашиваем включение нашего желаемого файла шаблона для обработки представления данных.

 add_action('template_redirect', 'fake_page_redirect'); function fake_page_redirect(){ global $wp; //retrieve the query vars and store as variable $template $template = $wp->query_vars; //pass the $template variable into the conditional statement and //check if the key 'fake_page' is one of the query_vars held in the $template array //and that 'blog' is equal to the value of the key which is set if ( array_key_exists( 'fake_page', $template ) && 'blog' == $template['fake_page'] ) { //if the key 'fake_page' exists and 'blog' matches the value of that key //then return the template specified below to handle presentation include( get_template_directory().'/your-template-name-here.php' ); exit; } } 

PS. I have tested this and it works under my conditions, though I'm not sure if any other quirks may popup with rewrite rules and end point masks the deeper you go, therefore you should thoroughly test all pagination and permalinks and make sure that they resolve to their intended paths correctly . If not, we can address those issues as they arise.

Сделайте две архивные страницы.

archive.php для ваших сообщений в блоге и archive-howto.php для вашего howtos.

http://img.wordpressask.com/templates/Template_Hierarchy.png

Создание поддельных страниц и фьюзинг с переписыванием – это чересчур избыток и несколько опасный.

Если, конечно, я полностью не понял смысла.

Возможно, вы ищете это:

 <?php define ('HOWTO_SLUG', 'my_howtos'); define ('HOWTO_REWRITE_SLUG', 'howtos'); register_post_type (HOWTO_SLUG, array ( 'labels' => array ( 'name' => 'Howtos' , 'singular_name' => 'Howto' ) , 'public' => true , 'has_archive' => true , 'rewrite' => array ('slug' => HOWTO_REWRITE_SLUG) ) ); 

Эти сообщения появятся в администраторе WP с post_type=my_howtos , в то время как с открытой стороны URL-адреса будут отображаться как /howtos/ , а файл archive-my_howtos.php в теме будет использоваться для отображения страницы.

HOWTO_SLUG и HOWTO_REWRITE_SLUG не могут быть одинаковыми, иначе он сломается.