Удалите пул из пользовательских URL-адресов post post post

Кажется, что все веб-ресурсы основаны на теме удаления пользовательского типа типа сообщения, т. е.

  yourdomain.com/CPT-SLUG/post-name
 

теперь очень устаревшие решения, часто ссылающиеся на установки до WP версии 3.5. Обычным является:

  'rewrite' => array ('slug' => false, 'with_front' => false),
 

в вашей функции register_post_type. Это больше не работает и вводит в заблуждение. Поэтому я спрашиваю сообщество во втором квартале 2017 года на грани WordPress 4.9.X ...

Каковы современные и эффективные способы удаления Post Type Slug из URL-адреса Post Post Post Type из аргумента перезаписи или где-либо еще?

UPDATE: Кажется, есть несколько способов заставить это работать с регулярным выражением. В частности, ответ от Яна Бэка, если вы последовательно соглашаетесь контролировать создание контента, чтобы не создавать конфликтующие имена страниц /публикаций ... Однако я убежден, что это серьезная слабость в ядре WP, где он должен быть обработан для нас , Оба - как опция /крюк при создании CPT или расширенный набор параметров для постоянных ссылок. Пожалуйста, поддержите билет на трек.

Сноска: Пожалуйста, поддержите этот билет в трэк, просмотрев /рекламируя его: https: //core .trac.wordpress.org /билет /34136 # билет

34 голоса | спросил BenRacicot 28 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowMon, 28 Sep 2015 19:18:46 +0300 2015, 19:18:46

10 ответов


48

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

Во-первых, мы удалим slug из permalink:

  function na_remove_slug ($ post_link, $ post, $ leavename) {

    if ('events'! = $ post-> post_type || 'publish'! = $ post-> post_status) {
        return $ post_link;
    }

    $ post_link = str_replace ('/'. $ post-> post_type. '/', '/', $ post_link);

    return $ post_link;
}
add_filter ('post_type_link', 'na_remove_slug', 10, 3);
 

Просто удалить слизню недостаточно. Прямо сейчас вы получите страницу 404, потому что WordPress ожидает, что сообщения и страницы будут вести себя таким образом. Вам также необходимо добавить следующее:

  function na_parse_request ($ query) {

    if (! $ query-> is_main_query () || 2! = count (запрос $ query->) ||! isset ($ query-> query ['page'])) {
        вернуть;
    }

    if (! empty ($ query-> query ['name'])) {
        $ query-> set ('post_type', array ('post', 'events', 'page'));
    }
}
add_action ('pre_get_posts', 'na_parse_request');
 

Просто измените «события» на свой собственный тип сообщения, и вам хорошо идти. Возможно, вам придется обновить свои постоянные ссылки.

ответил Nate Allen 30 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowWed, 30 Sep 2015 23:45:51 +0300 2015, 23:45:51
9

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

Длительное объяснение становится очевидным, если вы посмотрите на фактический код register_post_type в wp-includes /post.php line 1454 :

  add_permastruct ($ post_type, "{$ args-> rewrite ['slug'}} /% $ post_type%", $ permastruct_args);
 

Вы можете увидеть префикс $ args-> rewrite ['slug'] в тег rewrite % $ post_type% . Можно подумать: «Давайте просто установим slug в null , тогда», пока вы не увидите несколько строк вверх:

  if (empty ($ args-> rewrite ['slug']))
    $ args-> rewrite ['slug'] = $ post_type;
 

Вы можете видеть, что функция always ожидает, что значение slug не пустое и в противном случае использует тип сообщения.

ответил Jan Beck 30 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowWed, 30 Sep 2015 17:01:33 +0300 2015, 17:01:33
9

Запишите следующий код в регистрацию таксономии.

  'rewrite' => [
  'slug' => '/',
  'with_front' => ложный
]
 

Самое главное, что вам нужно сделать после смены кода

После того, как вы изменили свой документ таксономии вашего типа, попытайтесь перейти к Настройки> Permalinks и сохранить ваши настройки , иначе вы не получите 404 страницы.

Здесь вы можете найти лучшее решение: http://www.krazzycodes.com/how-to-remove-custom-post-type-taxonomy-base-from-url-in-wordpress/

ответил Mayank Dudakiya 12 PMpWed, 12 Apr 2017 21:16:53 +030016Wednesday 2017, 21:16:53
6

В ответ на мой предыдущий ответ : вы могли бы, конечно, установить параметр rewrite на false при регистрации нового типа сообщения и самостоятельно обработать правила перезаписи

  & л;? PHP
функция wpsx203951_custom_init () {

    $ post_type = 'event';
    $ args = (object) array (
        'public' => правда,
        'label' => 'Мероприятия',
        'rewrite' => false, //всегда устанавливаем значение false
        'has_archive' => правда
    );
    register_post_type ($ post_type, $ args);

    //это ваши фактические аргументы перезаписи
    $ args-> rewrite = array (
        'slug' => 'календарь'
    );

    //все, что следует из функции register_post_type
    if (is_admin () || ''! = get_option ('permalink_structure')) {

        if (! is_array ($ args-> rewrite))
            $ args-> rewrite = array ();
        if (empty ($ args-> rewrite ['slug']))
            $ args-> rewrite ['slug'] = $ post_type;
        if (! isset ($ args-> rewrite ['with_front']))
            $ args-> rewrite ['with_front'] = true;
        if (! isset ($ args-> rewrite ['pages']))
            $ args-> rewrite ['pages'] = true;
        if (! isset ($ args-> rewrite ['feeds']) ||! $ args-> has_archive)
            $ args-> rewrite ['feeds'] = (bool) $ args-> has_archive;
        if (! isset ($ args-> rewrite ['ep_mask'])) {
            if (isset ($ args-> permalink_epmask))
                $ args-> rewrite ['ep_mask'] = $ args-> permalink_epmask;
            еще
                $ args-> rewrite ['ep_mask'] = EP_PERMALINK;
        }

        if ($ args-> иерархический)
            add_rewrite_tag ("% $ post_type%", '(. +?)', $ args-> query_var? "{$ args-> query_var} =": "post_type = $ post_type & amp; pagename =");
        еще
            add_rewrite_tag ("% $ post_type%", '([^ /] +)', $ args-> query_var? "{$ args-> query_var} =": "post_type = $ post_type & amp; name =");

        if ($ args-> has_archive) {
            $ archive_slug = $ args-> has_archive === true? $ args-> переписать ['slug']: $ args-> has_archive;
            if ($ args-> rewrite ['with_front'])
                $ archive_slug = substr ($ wp_rewrite-> front, 1). $ Archive_slug;
            еще
                $ archive_slug = $ wp_rewrite-> root. $ Archive_slug;

            add_rewrite_rule ("{$ archive_slug} /? $", "index.php? post_type = $ post_type", 'top');
            if ($ args-> переписать ['feeds'] & amp; $ wp_rewrite-> feeds) {
                $ feeds = '('. trim (implode ('|', $ wp_rewrite-> feeds)). ')';
                add_rewrite_rule ("{$ archive_slug} /feed /$ feeds /? $", "index.php? post_type = $ post_type". '& amp; feed = $ matches [1]', 'top');
                add_rewrite_rule ("{$ archive_slug} /$ feeds /? $", "index.php? post_type = $ post_type". '& amp; feed = $ matches [1]', 'top');
            }
            if ($ args-> rewrite ['pages'])
                add_rewrite_rule ("{$ archive_slug} /{$ wp_rewrite-> pagination_base} /([0-9] {1,}) /? $", "index.php? post_type = $ post_type". '& amp; paged = $ совпадения [1] ',' top ');
        }

        $ permastruct_args = $ args-> переписать;
        $ permastruct_args ['feed'] = $ permastruct_args ['feeds'];
        add_permastruct ($ post_type, "% $ post_type%", $ permastruct_args);
    }
}
add_action ('init', 'wpsx203951_custom_init');
 

Вы можете увидеть, что вызов add_permastruct теперь больше не содержит пул. Я протестировал два сценария:

  1. Когда я создал страницу с «календарем» slug, эта страница перезаписывается архивом типа post, в котором также используется «календарь».

 введите описание изображения здесь>> </a> </p>

<ol start =

  • Когда я создал страницу с slug «my-event» и событие (CPT) с slug «my-event», отображается тип пользовательского сообщения.
  •  введите описание изображения здесь>> </a> </p>

<ol start =

  • Любые другие страницы также не работают. Если вы посмотрите на изображение выше, становится понятно, почему: правило пользовательского типа сообщений всегда будет соответствовать шаблону страницы. Поскольку WordPress не имеет способа определить, есть ли страница или пользовательский тип сообщения, которого не существует, он вернет 404. Вот почему вам нужен пул для идентификации страницы или CPT. Возможным решением было бы перехват ошибки и поиск страницы, которая могла бы существовать похожа на этот ответ .
  • ответил Jan Beck 2 +03002015-10-02T15:13:12+03:00312015bEurope/MoscowFri, 02 Oct 2015 15:13:12 +0300 2015, 15:13:12
    1

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

    ПРИМЕЧАНИЕ. Убедитесь, что вы изменили «custom_post_type» для своего собственного имени CPT в моем примере ниже. Есть много случаев, и «найти /заменить» - это простой способ поймать их всех. Весь этот код может находиться в ваших функциях.php или в плагине.

    Шаг 1: Отключить перезаписывание в вашем настраиваемом типе сообщений, установив перезаписи на «false» при регистрации сообщения:

      register_post_type ('custom_post_type',
        массив (
            'rewrite' => ложный
        )
    );
     

    Шаг 2: Вручную добавьте пользовательские перезаписи в нижний из WordPress для нашего custom_post_type

      function custom_post_type_rewrites () {
        add_rewrite_rule ('[^ /] + /attachment /([^ /] +) /? $', 'index.php? attachment = $ matches [1]', 'bottom');
        add_rewrite_rule ('[^ /] + /attachment /([^ /] +) /trackback /? $', 'index.php? attachment = $ matches [1] & amp; tb = 1', 'bottom');
        add_rewrite_rule ('[^ /] + /attachment /([^ /] +) /feed /(feed | rdf | rss | rss2 | atom) /? $', 'index.php? attachment = $ matches [1] & amp ; feed = $ matches [2] ',' bottom ');
        add_rewrite_rule ('[^ /] + /attachment /([^ /] +) /(feed | rdf | rss | rss2 | atom) /? $', 'index.php? attachment = $ matches [1] & amp; feed = $ matches [2] ',' bottom ');
        add_rewrite_rule ('[^ /] + /attachment /([^ /] +) /comment-страница - ([0-9] {1,}) /? $', 'index.php? attachment = $ matches [1 ] & amp; cpage = $ matches [2] ',' bottom ');
        add_rewrite_rule ('[^ /] + /attachment /([^ /] +) /embed /? $', 'index.php? attachment = $ matches [1] & amp; embed = true', 'bottom');
        add_rewrite_rule ('([^ /] +) /embed /? $', 'index.php? custom_post_type = $ matches [1] & amp; embed = true', 'bottom');
        add_rewrite_rule ('([^ /] +) /trackback /? $', 'index.php? custom_post_type = $ matches [1] & amp; tb = 1', 'bottom');
        add_rewrite_rule ('([^ /] +) /page /? ([0-9] {1,}) /? $', 'index.php? custom_post_type = $ matches [1] & amp; paged = $ matches [2 ]', 'дно');
        add_rewrite_rule ('([^ /] +) /comment-страница - ([0-9] {1,}) /? $', 'index.php? custom_post_type = $ matches [1] & amp; cpage = $ matches [ 2] ',' bottom ');
        add_rewrite_rule ('([^ /] +) (?: /([0-9] +))? /? $', 'index.php? custom_post_type = $ matches [1]', 'bottom');
        add_rewrite_rule ('[^ /] + /([^ /] +) /? $', 'index.php? attachment = $ matches [1]', 'bottom');
        add_rewrite_rule ('[^ /] + /([^ /] +) /trackback /? $', 'index.php? attachment = $ matches [1] & amp; tb = 1', 'bottom');
        add_rewrite_rule ('[^ /] + /([^ /] +) /feed /(feed | rdf | rss | rss2 | atom) /? $', 'index.php? attachment = $ matches [1] & amp; feed = $ matches [2] ',' bottom ');
        add_rewrite_rule ('[^ /] + /([^ /] +) /(feed | rdf | rss | rss2 | atom) /? $', 'index.php? attachment = $ matches [1] & amp; feed = $ совпадения [2] ',' bottom ');
        add_rewrite_rule ('[^ /] + /([^ /] +) /comment-страница - ([0-9] {1,}) /? $', 'index.php? attachment = $ matches [1] & amp ; cpage = $ matches [2] ',' bottom ');
        add_rewrite_rule ('[^ /] + /([^ /] +) /embed /? $', 'index.php? attachment = $ matches [1] & amp; embed = true', 'bottom');
    }
    add_action ('init', 'custom_post_type_rewrites');
     

    ПРИМЕЧАНИЕ. В зависимости от ваших потребностей вы можете захотеть изменить описанные выше перезаписи (отключить трекбэки? каналы? и т. д.). Они представляют собой типы «по умолчанию» перезаписи, которые были бы сгенерированы, если бы вы не отключили перезаписывание на шаге 1

    Шаг 3: Сделайте постоянным ссылка на свой собственный тип сообщения «pretty» снова

      function custom_post_type_permalinks ($ post_link, $ post, $ leavename) {
        if (isset ($ post- gt; post_type) & amp; & quot; custom_post_type '== $ post-> post_type) {
            $ post_link = home_url ($ post-> post_name);
        }
    
        return $ post_link;
    }
    add_filter ('post_type_link', 'custom_post_type_permalinks', 10, 3);
     

    ПРИМЕЧАНИЕ. Вы можете остановиться здесь, если вас не беспокоят, что ваши пользователи создают конфликтующее (дублирующееся) сообщение в другом типе сообщения, которое создаст ситуацию, когда только одна из них может загружаться при запросе страницы.

    Шаг 4: Предотвращение дублирования сообщений.

      function prevent_slug_duplicates ($ slug, $ post_ID, $ post_status, $ post_type, $ post_parent, $ original_slug) {
        $ check_post_types = array (
            'после',
            «Страница»,
            'Custom_post_type'
        );
    
        if (! in_array ($ post_type, $ check_post_types)) {
            return $ slug;
        }
    
        if ('custom_post_type' == $ post_type) {
            //Сохранение сообщения custom_post_type, проверка дубликатов в типах сообщений POST или PAGE
            $ post_match = get_page_by_path ($ slug, 'OBJECT', 'post');
            $ page_match = get_page_by_path ($ slug, 'OBJECT', 'page');
    
            if ($ post_match || $ page_match) {
                $ slug. = '-duplicate';
            }
        } else {
            //Сохранение POST или PAGE, проверьте наличие дубликатов в типе post_post_type
            $ custom_post_type_match = get_page_by_path ($ slug, 'OBJECT', 'custom_post_type');
    
            if ($ custom_post_type_match) {
                $ slug. = '-duplicate';
            }
        }
    
        вернуть$ Пробкового;
    }
    add_filter ('wp_unique_post_slug', 'prevent_slug_duplicates', 10, 6);
     

    ПРИМЕЧАНИЕ. Это добавит строку «-duplicate» в конец любых дублированных слизней. Этот код не может предотвратить дублирование пули, если они уже существуют до внедрения этого решения. Обязательно сначала проверьте наличие дубликатов.

    Я хотел бы услышать от кого-то еще, кто дает это, чтобы посмотреть, хорошо ли это работает для них.

    ответил Matt Keys 6 +03002017-10-06T01:51:15+03:00312017bEurope/MoscowFri, 06 Oct 2017 01:51:15 +0300 2017, 01:51:15
    0

    Вам не нужно столько жесткого кода. Просто используйте легкий плагин:

    У него есть настраиваемые параметры.

    ответил T.Todua 26 FebruaryEurope/MoscowbSun, 26 Feb 2017 01:12:35 +0300000000amSun, 26 Feb 2017 01:12:35 +030017 2017, 01:12:35
    0

    , и мы можем внести некоторые изменения в вышеупомянутую функцию:

      function na_parse_request ($ query) {
    
    if (! $ query-> is_main_query () || 2! = count (запрос $ query->) ||! isset ($ query-> query ['page'])) {
        вернуть;
    }
    
    if (! empty ($ query-> query ['name'])) {
        $ query-> set ('post_type', array ('post', 'events', 'page'));
    }
    }
     

    to:

      function na_parse_request ($ query) {
    
    if (! $ query-> is_main_query () || 2! = count (запрос $ query->) ||! isset ($ query-> query ['page'])) {
        вернуть;
    }
    
    if (! empty ($ query-> query ['name'])) {
    
        глобальный $ wpdb;
        $ pt = $ wpdb-> get_var (
            «SELECT post_type FROM` {$ wpdb-> posts} `".
            "WHERE post_name = '{$ query-> query [' name ']}'"
        );
        $ query-> set ('post_type', $ pt);
    }
    }
     

    , чтобы установить правильное значение post_type.

    ответил Max Kondrachuk 1 MarpmWed, 01 Mar 2017 14:50:14 +03002017-03-01T14:50:14+03:0002 2017, 14:50:14
    0

    Это сработало для меня:   'rewrite' => array ('slug' => '/')

    ответил Malki Mohamed 3 Maypm17 2017, 19:39:48
    0

    Для тех, кто читает это, у которого были проблемы с дочерними сообщениями, как я, я нашел, что лучший способ - добавить свои собственные правила перезаписи.

    Основная проблема, с которой я столкнулась, заключалась в том, что WordPress рассматривает перенаправление со страниц, которые являются 2 уровнями (дочерние сообщения), несколько иначе, чем с тремя уровнями глубины (дочерние записи для детей).

    Это означает, что когда у меня есть /post-type /post-name /post-child /я могу использовать /post-name /post-child, и он перенаправит меня на страницу с пост-типом спереди, но если у меня есть post-type /post-name /post-child /post-grandchild, тогда я не могу использовать post-name /post-child /post-grandchild.

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

    Первое, что вам нужно сделать, - это удалить ссылку типа post с детьми. Эта логика должна произойти здесь, если вы посмотрите на ответ Нейта Аллена выше:

      $ post_link = str_replace ('/'. $ post-> post_type. '/', '/', $ post_link);
     

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

    Следующий шаг - это то, где вещи меняются от данного ответа. Вместо добавления вещей в основной запрос (который работал для пользовательских сообщений и их детей, но не для дальнейших детей) я добавил переписывание, которое пошло в нижней части правил WordPress, так что если pagename не проверял, и он собирался ударил 404, он проведет последнюю проверку, чтобы увидеть, имеет ли страница в пользовательском типе сообщения то же имя, иначе оно выкинет 404.

    Вот правило перезаписи, которое я использовал в предположении, что «событие» - это имя вашего CPT

      функция rewrite_rules_for_removing_post_type_slug ()
    {
        add_rewrite_rule (
            '(.?.? +)?? (: /([0-9] +)) /$',
            'Index.php? Событий = $ матчей [1] /$ соответствует [2] & амп; post_type = событие',
            'дно'
        );
    }
    
    add_action ('init', 'rewrite_rules_for_removing_post_type_slug', 1, 1);
     

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

    ответил Moe Loubani 29 Mayam17 2017, 06:34:40
    -2

    Вы можете сделать это очень простым способом.

    1) Скопируйте эту функцию в functions.php вашей темы

    :

      функция changeURL ($ id)
    {
        /* Получите слизню, которую хотите удалить. * /
        глобальные $ post;
        $ slug = get_post ($ post) -> post_name;
    
        $ post_type = get_post_type ($ id);
        $ standard_posts = array ("post", "page", "attachment", "revision", "nav_menu_item");
        /*
            Если тип текущего сообщения является обычным, используйте Javascript для
            замените $ slug для URL-адреса по умолчанию.
        * /
        if (! in_array ($ post_type, $ standard_posts))
        {
            echo '<script type = "text /javascript">
                var stateObj = {register: "'. $ slug.'"};
                history.pushState (stateObj, "ignore_this", "../?p='.$id. '");
                & Lt; /сценарий & GT; ';
        }
    }
     


    2) Вызовите эту функцию в single.php вашей темы под , а в Loop:

      & lt;? php /* Цикл * /?>
    & lt;? php while (has_posts ()): the_post ();?>
    
        & lt;? php changeURL (get_the_ID ()); ? & GT;
        /* и т.д. */
    
    & lt;? php endwhile; ? & GT;
     


    И пусть Javascript делает магию :)

    Обновление:

    Решил недостатки, отмеченные @kraftner в комментариях. Теперь changeURL () заменит постоянную ссылку по URL-адресу по умолчанию в адресной строке.

    ответил Daniel Muñoz Parsapoormoghadam 3 +03002015-10-03T12:34:40+03:00312015bEurope/MoscowSat, 03 Oct 2015 12:34:40 +0300 2015, 12:34:40

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

    Популярные теги

    security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132