Intereting Posts
Пользовательский перенаправлять пользователя после входа в систему на основе метаданных Обновление плагинов: настройки виджета Как определить файл перевода темы? В чем разница между wp_register_sidebar_widget и register_widget? Регистрация членства и событий / надбавки для некоммерческих организаций Загрузка пользовательского интерфейса jQuery в голове Как я могу автоматизировать процесс загрузки документов -> через python -> отчет по электронной почте WooCommerce – Большое количество вариаций продукта (200+) Как устранить проблему, почему TinyMCE не загружает пользовательские плагины в визуальный редактор? Замените основной файл wordpress собственными Ограничьте автора, чтобы выбрать из медиа-библиотеки, но не загружать медиа Создание выделенных ящиков содержимого Сообщение об ошибке в сообщениях в блоге только в моей локальной среде Я попробовал обновить свой Live wordpress сайт до последней версии wordpress (v4.7), и я столкнулся с некоторыми проблемами Соединение базы данных закрывается

Удалите пул из пользовательских 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 Type Post из аргумента перезаписи или где-либо еще?

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

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

Solutions Collecting From Web of "Удалите пул из пользовательских URL-адресов post post post"

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

Во-первых, мы удалим слизню с постоянной ссылки:

 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->query ) || ! isset( $query->query['page'] ) ) { return; } if ( ! empty( $query->query['name'] ) ) { $query->set( 'post_type', array( 'post', 'events', 'page' ) ); } } add_action( 'pre_get_posts', 'na_parse_request' ); 

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

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

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

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

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

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

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

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

 <?php function wpsx203951_custom_init() { $post_type = 'event'; $args = (object) array( 'public' => true, 'label' => 'Events', 'rewrite' => false, // always set this to false 'has_archive' => true ); register_post_type( $post_type, $args ); // these are your actual rewrite arguments $args->rewrite = array( 'slug' => 'calendar' ); // everything what follows is from the register_post_type function 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; else $args->rewrite['ep_mask'] = EP_PERMALINK; } if ( $args->hierarchical ) add_rewrite_tag( "%$post_type%", '(.+?)', $args->query_var ? "{$args->query_var}=" : "post_type=$post_type&pagename=" ); else add_rewrite_tag( "%$post_type%", '([^/]+)', $args->query_var ? "{$args->query_var}=" : "post_type=$post_type&name=" ); if ( $args->has_archive ) { $archive_slug = $args->has_archive === true ? $args->rewrite['slug'] : $args->has_archive; if ( $args->rewrite['with_front'] ) $archive_slug = substr( $wp_rewrite->front, 1 ) . $archive_slug; else $archive_slug = $wp_rewrite->root . $archive_slug; add_rewrite_rule( "{$archive_slug}/?$", "index.php?post_type=$post_type", 'top' ); if ( $args->rewrite['feeds'] && $wp_rewrite->feeds ) { $feeds = '(' . trim( implode( '|', $wp_rewrite->feeds ) ) . ')'; add_rewrite_rule( "{$archive_slug}/feed/$feeds/?$", "index.php?post_type=$post_type" . '&feed=$matches[1]', 'top' ); add_rewrite_rule( "{$archive_slug}/$feeds/?$", "index.php?post_type=$post_type" . '&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" . '&paged=$matches[1]', 'top' ); } $permastruct_args = $args->rewrite; $permastruct_args['feed'] = $permastruct_args['feeds']; add_permastruct( $post_type, "%$post_type%", $permastruct_args ); } } add_action( 'init', 'wpsx203951_custom_init' ); 

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

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

введите описание изображения здесь

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

введите описание изображения здесь

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

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

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

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

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

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

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

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

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

 register_post_type( 'custom_post_type', array( 'rewrite' => false ) ); 

Шаг 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]&tb=1', 'bottom'); add_rewrite_rule( '[^/]+/attachment/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$', 'index.php?attachment=$matches[1]&feed=$matches[2]', 'bottom'); add_rewrite_rule( '[^/]+/attachment/([^/]+)/(feed|rdf|rss|rss2|atom)/?$', 'index.php?attachment=$matches[1]&feed=$matches[2]', 'bottom'); add_rewrite_rule( '[^/]+/attachment/([^/]+)/comment-page-([0-9]{1,})/?$', 'index.php?attachment=$matches[1]&cpage=$matches[2]', 'bottom'); add_rewrite_rule( '[^/]+/attachment/([^/]+)/embed/?$', 'index.php?attachment=$matches[1]&embed=true', 'bottom'); add_rewrite_rule( '([^/]+)/embed/?$', 'index.php?custom_post_type=$matches[1]&embed=true', 'bottom'); add_rewrite_rule( '([^/]+)/trackback/?$', 'index.php?custom_post_type=$matches[1]&tb=1', 'bottom'); add_rewrite_rule( '([^/]+)/page/?([0-9]{1,})/?$', 'index.php?custom_post_type=$matches[1]&paged=$matches[2]', 'bottom'); add_rewrite_rule( '([^/]+)/comment-page-([0-9]{1,})/?$', 'index.php?custom_post_type=$matches[1]&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]&tb=1', 'bottom'); add_rewrite_rule( '[^/]+/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$', 'index.php?attachment=$matches[1]&feed=$matches[2]', 'bottom'); add_rewrite_rule( '[^/]+/([^/]+)/(feed|rdf|rss|rss2|atom)/?$', 'index.php?attachment=$matches[1]&feed=$matches[2]', 'bottom'); add_rewrite_rule( '[^/]+/([^/]+)/comment-page-([0-9]{1,})/?$', 'index.php?attachment=$matches[1]&cpage=$matches[2]', 'bottom'); add_rewrite_rule( '[^/]+/([^/]+)/embed/?$', 'index.php?attachment=$matches[1]&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->post_type ) && '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( 'post', 'page', 'custom_post_type' ); if ( ! in_array( $post_type, $check_post_types ) ) { return $slug; } if ( 'custom_post_type' == $post_type ) { // Saving a custom_post_type post, check for duplicates in POST or PAGE post types $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 { // Saving a POST or PAGE, check for duplicates in custom_post_type post type $custom_post_type_match = get_page_by_path( $slug, 'OBJECT', 'custom_post_type' ); if ( $custom_post_type_match ) { $slug .= '-duplicate'; } } return $slug; } add_filter( 'wp_unique_post_slug', 'prevent_slug_duplicates', 10, 6 ); 

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

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

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

  • Удалить базовый слизень из пользовательского сообщения

Он имеет настраиваемые параметры.

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

 function na_parse_request( $query ) { if ( ! $query->is_main_query() || 2 != count( $query->query ) || ! isset( $query->query['page'] ) ) { return; } if ( ! empty( $query->query['name'] ) ) { $query->set( 'post_type', array( 'post', 'events', 'page' ) ); } } 

чтобы:

 function na_parse_request( $query ) { if ( ! $query->is_main_query() || 2 != count( $query->query ) || ! isset( $query->query['page'] ) ) { return; } if ( ! empty( $query->query['name'] ) ) { global $wpdb; $pt = $wpdb->get_var( "SELECT post_type FROM `{$wpdb->posts}` " . "WHERE post_name = '{$query->query['name']}'" ); $query->set( 'post_type', $pt ); } } 

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

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

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

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

Это означает, что когда у меня есть / post-type / post-name / post-child / я могу использовать / post-name / post-child, и он перенаправит меня на пост-тип спереди, но если у меня есть пост-тип / 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

 function rewrite_rules_for_removing_post_type_slug() { add_rewrite_rule( '(.?.+?)?(:/([0-9]+))?/?$', 'index.php?event=$matches[1]/$matches[2]&post_type=event', 'bottom' ); } add_action('init', 'rewrite_rules_for_removing_post_type_slug', 1, 1); 

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

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

1) Скопируйте эту функцию в функции theme.php:

 function changeURL ($id) { /* Get the slug you want to remove. */ global $post; $slug = get_post($post)->post_name; $post_type = get_post_type ($id); $standard_posts = array("post", "page", "attachment", "revision", "nav_menu_item"); /* If the type of the current post is a custom one, use Javascript to replace the $slug for the default URL of the post. */ if (!in_array ($post_type, $standard_posts)) { echo '<script type="text/javascript"> var stateObj = { register: "' . $slug . '" }; history.pushState(stateObj, "ignore_this", "../?p='.$id.'"); </script>'; } } 

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

 <?php /* The loop */ ?> <?php while ( have_posts() ) : the_post();?> <?php changeURL (get_the_ID ()); ?> /* etc. */ <?php endwhile; ?> 

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

Обновить:

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