Установка пользовательского подпути для блога, не используя страницы?

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

У меня есть дизайн, который использует сообщения (Т.е. блог) и пользовательский тип сообщения, названный "практическим руководством". Первая полоса сайта (" / ") имеет шаблон, который отображает последние сообщения в блоге и последние практические руководства. Когда пользователь перешел к разделу блога (" / блог"), они видят другой шаблон чем тогда, когда они перешли к разделу с практическими рекомендациями (" / практическое руководство").

Я знаю очевидный способ сделать, это должно создать две страницы ("Блог" и "Домой"), затем использовать раскрытие в Настройках-> Чтение Опций явно установить их. Я могу затем связать определенные шаблоны страницы к тем сообщениям.

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

  • /howto/-> архив-howto.php
  • /blog/-> archive.php

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

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

6
10.10.2012, 15:06
3 ответа

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

<?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 не может быть то же, или оно повредится.

-1
19.02.2020, 22:04
  • 1
    Это нисколько не, что я прошу. Я желаю установить краткий заголовок для сообщений, не практических руководств. Мне уже установили краткий заголовок для практических руководств. –  aendrew 10.10.2012, 16:12
  • 2
    Возможно, Вы могли создать пользовательский тип сообщения для сообщений –  gregn3 10.10.2012, 16:15
  • 3
    Почему я сделал бы это? Я желаю это так, я могу очистить интерфейс, не так, чтобы у меня мог быть совершенно неиспользованный тип контента, который WordPress использует по умолчанию... –  aendrew 10.10.2012, 16:21

У меня нет времени для объяснения этого подробно (я буду по возврату), но тем временем это должно работать на Вас,

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_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, чтобы гарантировать, что пользователь на самом деле не запросил разбитый на страницы результат. В основном инвертируйте те правила, и это не работает.

Как упомянуто прежде, перепишите правила, похожи на вуду мне, таким образом, существует, вероятно, другой способ пойти о порядке, в котором Вы указываете свои правила, который возможно связан с использованием функции 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.

10
19.02.2020, 22:04
  • 1
    wordpress.stackexchange.com/a/37649/3898 похож на немного лучшую версию этого IMO. –  Ian Dunn 06.12.2019, 19:29
  • 2
    @IanDunn единственная вещь (вещи), которую я сделал бы по-другому выше, является использованием template_include вместо template_redirect сделать include/require и возможно используйте get_query_var наблюдения, поскольку это - цель использовать add_rewrite_tag. Это было бы лучшей практикой. За пределами этого метода существуют другие способы сделать это, если Вы хотите обойти запрос ранее в рабочем процессе запроса, которые включают сцепление в parse_request и request фильтры, найденные в class WP {} / wp-includes/class-wp.php. –  Adam 06.12.2019, 19:57

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

archive.php для Ваших сообщений в блоге и архив-howto.php для Ваших практических руководств.

http://codex.wordpress.org/images/1/18/Template_Hierarchy.png

Создание поддельных страниц и futzing с переписыванием является путем излишество и несколько опасный.

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

0
19.02.2020, 22:04

Теги

Похожие вопросы