Пользовательский тип URL-адреса переписки

Я попытаюсь подвести итог тому, чего я пытаюсь достичь …

В основном у меня есть настраиваемый тип сообщений, называемый «marketing_list», который будет иметь настраиваемые поля, содержащие информацию, относящуюся к маркетинговым спискам, доступным для покупки.

Каждый маркетинговый список будет принадлежать категории (пользовательская таксономия).

Итак, теперь мой URL-адрес выглядит так:

  • /marketing-lists -> страница архива
  • /marketing-lists/post-slug -> запись одиночных маркетинговых списков
  • /marketing-lists/category/category-slug -> пользовательская таксономия

Я хочу достичь:

  • /marketing-lists -> archive, но редактируется внутри администратора, если клиент хочет обновить текст, например страницу.
  • /marketing-lists/category-slug -> пользовательская таксономия
  • /marketing-lists/category-slug/post-slug -> одиночная запись

Кроме того, я хотел бы создать несколько дополнительных страниц, которые имеют базу /marketing-lists т.е.

  • /marketing-lists/consumer-marketing-lists -> отдельная страница
  • /marketing-lists/business-marketing-lists -> отдельная страница

Это вообще возможно? Возможно, это лучший способ добиться этого?

Solutions Collecting From Web of "Пользовательский тип URL-адреса переписки"

Основная часть вашего вопроса довольно проста и была рассмотрена здесь много раз раньше. Я также поговорил в WordCamp Portland по теме, которую вы можете посмотреть, скачать слайды, код и т . Д. Здесь .

Последняя часть вашего вопроса,

Кроме того, я хотел бы создать несколько дополнительных страниц, которые имеют базу / marketing-lists, т.е.

/ marketing-lists / consumer-marketing-lists -> одна страница / маркетинговые списки / бизнес-маркетинг-списки -> одна страница

… немного сложнее. Если их будет только несколько, и они не будут часто меняться , у вас есть два варианта, которые я вижу:

  1. Добавьте определенные правила перезаписи в верхнюю часть стека, чтобы обратиться к ним
  2. Сделайте их таксономическими терминами (которые вы никогда не используете в качестве таксономических терминов) и используйте иерархию шаблонов, чтобы делать с ними, как вам будет угодно.

Лично я бы пошел с №1. Если вы это сделаете, ваш код может выглядеть примерно так,

 function wpse_119673_rewrite_rules() { add_rewrite_rule( 'marketing-lists/(consumer-marketing-lists|business-marketing-lists)/?', 'index.php?pagename=$matches[1]', 'top' ); } add_action( 'init', 'wpse_119673_rewrite_rules' ); 

См. Add_rewrite_rule для справки.

Если, с другой стороны, у вас будет много этих страниц, и вам нужно создать их по прихоти , это станет значительно сложнее. По существу, у вас тогда будет значительный конфликт перезаписи, для которого вам нужно будет вести учет в каждом соответствующем запросе. Вот еще один вопрос, который сильно отличается от вашего, но где я учитываю конфликт перезаписи (поиск «check_rewrite_conflicts») в моем ответе. В этом ответе на каждый запрос, где присутствует «состояние», я проверяю, действительно ли это страница. Это дополнительный запрос к базе данных, и я бы посоветовал это сделать.

Проблемная часть структуры permalink, о которой вы просите, для постоянных ссылок, таких как

 /marketing-lists/{$something}/ 

где иногда $something должно быть категорией, иногда страницей.

Таким образом, чтобы сделать это, вы должны запустить запрос базы данных, чтобы узнать, что $something что- $something и что замедлит работу

После этого, если url example.com/marketing-lists/viral-marketing и у вас есть страница с viral-marketing слизняков и категория с viral-marketing который должен показать WordPress, страница или архив категорий?

Даже если вы запустите db-запрос, вы найдете страницу и категорию с этим слизнем, так кто победит ?

Более того, используя стандартные правила перезаписи WordPress, ваша работа будет очень сложной … потому что произойдет много конфликтов.

Я разрабатываю плагин, « Умные правила» могут помочь вам в решении этой задачи, но – снова – без запроса db невозможно сказать, если часть сразу после /marketing-lists/ является aa slug страницы или категорией …

Используя этот плагин, этот код должен работать, но для него требуется запрос db, и в случае конфликта побеждает страница:

 /* * Plugin Name: My Custom Rules */ add_action('plugins_loaded', 'register_my_rules'); add_filter('skip_clever_rule', 'rule_pages_for_pages', 20, 3); function register_my_rules() { if ( ! function_exists('register_clever_rule') ) return; $args = array( 'id' => 'rule_pages','route' => '/marketing-lists/%s'); register_clever_rule( $args )->query('pagename=[0]')->priority(1); $args = array( 'id' => 'rule_cats','route' => '/marketing-lists/%s'); register_clever_rule( $args )->query('category_name=[0]')->priority(2); $args = array( 'id' => 'rule_singles','route' => '/marketing-lists/%s/%s/'); register_clever_rule( $args )->query('name=[1]'); } function rule_pages_for_pages( $skip, $rule, $pieces ) { if ( $rule['args']['id'] === 'rule_pages' ) { global $wpdb; $pages = $wpdb->get_col("SELECT post_name FROM $wpdb->posts WHERE post_type = 'page' AND post_status = 'publish'"); if ( ! in_array( $pieces[1], $pages ) ) $skip = true; } return $skip; } 

Обратите внимание, что этот код входит в плагин и не может работать в темах.