Intereting Posts
Всего результатов Как не отображать экземпляр виджета динамически? Должны ли третьи стороны использовать $ wp_scripts / $ wp_styles-> add_data? получение прикрепленных изображений src и добавление классов Пользовательский почтовый архив с поиском, is_search () является ложным? WordPress Backend Fine, All Themes Вернуть пустую страницу? Пользовательская таксономическая разбивка на конечные точки с использованием paginate_links () обычную, статическую домашнюю страницу / целевую страницу с темой Twenty Eleven? Как ссылаться на родительский объект главной страницы? Список сообщений о терминах на странице редактирования admin Где запрос и форма в wp-login.php? Гравитация формирует несколько сообщений, сгенерированных одной формой Используя ходок меню, добавьте пользовательский элемент в конце пунктов меню Как добавить настраиваемое меню подуровня, указанное в одном каталоге, в меню пользовательского верхнего уровня, указанное в другом каталоге? страница автора работает только для первого пользователя

Пользовательское правило перезаписи для иерархического пользовательского типа сообщения

Работая на клиентском сайте, я сталкиваюсь с моим злейшим врагом … WP URL rewrite 🙁 Я на самом деле не могу понять это, и после многих дней попытки и поиска я не могу заставить его работать.

То, что я пытаюсь получить, является постоянной ссылкой на эту company.com/product/%product-name%/ /parent/child/ company.com/product/%product-name%/ независимо от глубины /parent/child/ nesting. Мне нужны функциональные возможности иерархических страниц по другим причинам, но они не должны отображаться в URL-адресе.

Вот моя настройка:

  • WordPress 4.4.1
  • Параметры постоянной связи установлены на « Post name

  • Я создал иерархический пользовательский product типа post с параметром rewrite в значение false.

     $args = array( 'label' => __( 'Product', 'domain' ), 'description' => __( 'Company products', 'domain' ), 'labels' => $labels, 'supports' => array( 'title', 'editor', 'excerpt', 'thumbnail', 'revisions', 'page-attributes' ), 'taxonomies' => array( 'category', 'post_tag' ), 'hierarchical' => true, 'public' => true, 'show_ui' => true, 'show_in_menu' => true, 'menu_position' => 5, 'show_in_admin_bar' => true, 'show_in_nav_menus' => false, 'can_export' => true, 'has_archive' => true, 'exclude_from_search' => false, 'publicly_queryable' => true, 'rewrite' => false, 'capability_type' => 'page', ); register_post_type( 'product', $args ); 

На данный момент у продуктов нет довольно постоянной ссылки, они выглядят так, и они оба работают:

  1. Первый уровень: company.com/?product=my-first-product -> ok
  2. Второй уровень: company.com/?product=my-first-product/child-product -> ok

После этого я зарегистрировал правило перезаписи и permastruct, затем сбросил правила перезаписи, сохранив изменения на странице настроек постоянной ссылки

  function bvt_product_rewrite_rule() { add_rewrite_rule( '^product/([^/]+)/?$', 'index.php?post_type=product&pagename=$matches[1]', 'top' ); add_permastruct( 'product', '/product/%product%/' ); } add_action( 'init', 'bvt_product_rewrite_rule', 10 ); 

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

  1. Первый уровень: company.com/product/my-first-product/ -> 404
  2. Второй уровень: company.com/product/my-first-product/child-product/ -> 404

Я также попробовал решение, приведенное здесь https://wordpress.stackexchange.com/a/101077/86838, где разрешено удалять родительский пул из дочерней константы, но я все еще не увенчался успехом

 function bvt_product_flatten_hierarchies( $post_link, $post ) { if ( 'product' != $post->post_type ) { return $post_link; } $uri = ''; foreach ( $post->ancestors as $parent ) { $uri = get_post( $parent )->post_name . "/" . $uri; } return str_replace( $uri, '', $post_link ); } add_filter( 'post_type_link', 'bvt_product_flatten_hierarchies', 10, 2 ); 

Я установил два модуля debug-bar и monkeyman-rewrite-analyzer для анализа перезаписи и запроса, но я не могу заставить его работать.

Моя последняя попытка была с плагином wp-permastructure, позволяющим настраивать постоянную ссылку на пользовательский тип сообщения. Это позволяет настраивать настраиваемую настройку в параметре rewrite array для register_post_type .

 [...] 'publicly_queryable' => true, 'rewrite' => array( 'permastruct' => '/%postname%/', ), 'capability_type' => 'page', [...] 

С этой настройкой и обе предыдущие пользовательские перезаписи / permatruct / flatten_hierarchies были выбраны, она работала, как указано в описании плагина

  1. Первый уровень: company.com/my-first-product/ -> ok
  2. Второй уровень: company.com/child-product/ -> ok

Но теперь уровень /product/ отсутствует, и если я попытаюсь поместить его в 'permastruct' => '/product/%postname%/' он вернет меня к ошибке 404.

Это приводит к моему основному вопросу.

Можно ли делать то, что мне нужно, или только как можно ближе к последнему плагину?

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

PS Я не могу вставить больше двух ссылок в тело, поэтому здесь упоминаются ссылки плагина:

 https://wordpress.org/plugins/debug-bar/ https://wordpress.org/plugins/monkeyman-rewrite-analyzer/ https://wordpress.org/plugins/wp-permastructure/ 

Solutions Collecting From Web of "Пользовательское правило перезаписи для иерархического пользовательского типа сообщения"

Ты довольно близко. Правило rewrite использует неправильный запрос var, pagename должно быть просто name .

Вот версия, которая работает для меня на новой версии 4.4.1 и twentysixteen,

 function bvt_product_init() { $args = array( 'label' => __( 'Product', 'domain' ), 'description' => __( 'Company products', 'domain' ), 'supports' => array( 'title', 'editor', 'excerpt', 'thumbnail', 'revisions', 'page-attributes' ), 'taxonomies' => array( 'category', 'post_tag' ), 'hierarchical' => true, 'public' => true, 'show_ui' => true, 'show_in_menu' => true, 'menu_position' => 5, 'show_in_admin_bar' => true, 'show_in_nav_menus' => false, 'can_export' => true, 'has_archive' => true, 'rewrite' => array( 'slug' => 'product' ), ); register_post_type( 'product', $args ); add_rewrite_rule( '^product/([^/]+)/?$', 'index.php?post_type=product&name=$matches[1]', 'top' ); } add_action( 'init', 'bvt_product_init' ); function bvt_product_flatten_hierarchies( $post_link, $post ) { if ( 'product' != $post->post_type ) { return $post_link; } $uri = ''; foreach ( $post->ancestors as $parent ) { $uri = get_post( $parent )->post_name . "/" . $uri; } return str_replace( $uri, '', $post_link ); } add_filter( 'post_type_link', 'bvt_product_flatten_hierarchies', 10, 2 ); 

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