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

У меня есть эти пользовательские типы сообщений (CPT) и мета-поля:

  • Фильмы (CPT)
    • Жанр (Мета-бокс)
  • Жанры (CPT)

Если один фильм называется Die hard, я хочу, чтобы постоянная ссылка была: / genres / action / die-hard

Это легко установить, установив фильм-CPT на «rewrite» => false и вместо этого используйте этот код:

add_action('init', 'rb_add_rewrite_rules'); add_filter('post_type_link', 'rb_create_permalinks', 10, 3); function rb_add_rewrite_rules() { global $wp_rewrite; $wp_rewrite->add_rewrite_tag('%movies%', '([^/]+)', 'movies='); $wp_rewrite->add_rewrite_tag('%genre%', '([^/]+)', 'genre='); $wp_rewrite->add_permastruct('movies', '/genres/%genre%/%movies%', false); } function rb_create_permalinks($permalink, $post, $leavename) { $no_data = 'no-data'; $post_id = $post->ID; if($post->post_type != 'movies' || empty($permalink) || in_array($post->post_status, array('draft', 'pending', 'auto-draft'))) return $permalink; $event_id = get_post_meta($post_id, 'genre', true); $var1 = basename(get_permalink($event_id)); $var1 = sanitize_title($var1); if(!$var1) $var1 = $no_data; $permalink = str_replace('%genre%', $var1, $permalink); return $permalink; } 

Хорошо, вот в чем проблема. Как постоянная ссылка Die Hard, так и архив-genres.php (отображающий все жанры) выглядят хорошо, но single-genres.php не найден – вместо этого в / genres / action будет отображаться код index.php.

Я думаю, проблема в том, что мои перезаписи сталкиваются, возможно, это невозможно сделать:

«фильмы» CPT постоянная ссылка

 /custom base name/custom field meta box value)/'movies' CPT post name 

«жанры» CPT permalink

 /custom post type name (same value as the custom base name above!!)/'genres' CPT post name 

Как заставить WordPress использовать single-genres.php для / genres / action и т. Д.?

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

 'movies' CPT permalink /genres/%custom field meta box value%/%movie%/ 'genres' CPT permalink /genres/%genre%/ 

Проблема здесь заключается в использовании add_permastruct . Когда он создает правила для фильмов, они выглядят примерно так:

 genres/([^/]+)/([^/]+)(/[0-9]+)?/?$ => index.php?genre=$matches[1]&movies=$matches[2]&page=$matches[3] 

Способ обработки запросов работает в WordPress, вы не можете устанавливать несколько типов сообщений в одном URL-адресе – WordPress останавливается после первого. То есть они могут быть в хорошем URL, но не в «уродливом», который генерирует запрос и запрос . Любые правила перезаписи с movies= не могут содержать genre= . Ниже приведен полный, исчерпывающий капитальный ремонт rb_add_rewrite_rules . Вы можете вытаскивать любые правила, которые вам могут не понадобиться, такие как URL-адреса вложений, каналы подачи и т. Д. Как всегда при внесении изменений в переписывание, обязательно снимите свои постоянные ссылки, перейдя в «Настройки->« Перенаправленные »и нажав« Сохранить изменения ». Кроме того, убедитесь, что 'rewrite' => false задано как для пользовательских типов сообщений.

 function rb_add_rewrite_rules() { add_rewrite_rule( 'genres/[^/]+/[^/]+/attachment/([^/]+)/?$', 'index.php?attachment=$matches[1]', 'top' ); add_rewrite_rule( 'genres/[^/]+/[^/]+/attachment/([^/]+)/trackback/?$', 'index.php?attachment=$matches[1]&tb=1', 'top' ); add_rewrite_rule( 'genres/[^/]+/[^/]+/attachment/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$', 'index.php?attachment=$matches[1]&feed=$matches[2]', 'top' ); add_rewrite_rule( 'genres/[^/]+/[^/]+/attachment/([^/]+)/(feed|rdf|rss|rss2|atom)/?$', 'index.php?attachment=$matches[1]&feed=$matches[2]', 'top' ); add_rewrite_rule( 'genres/[^/]+/[^/]+/attachment/([^/]+)/comment-page-([0-9]{1,})/?$', 'index.php?attachment=$matches[1]&cpage=$matches[2]', 'top' ); add_rewrite_rule( 'genres/[^/]+/([^/]+)/trackback/?$', 'index.php?movies=$matches[1]&tb=1', 'top' ); add_rewrite_rule( 'genres/[^/]+/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$', 'index.php?movies=$matches[1]&feed=$matches[2]', 'top' ); add_rewrite_rule( 'genres/[^/]+/([^/]+)/(feed|rdf|rss|rss2|atom)/?$', 'index.php?movies=$matches[1]&feed=$matches[2]', 'top' ); add_rewrite_rule( 'genres/[^/]+/([^/]+)/page/?([0-9]{1,})/?$', 'index.php?&movies=$matches[1]&paged=$matches[2]', 'top' ); add_rewrite_rule( 'genres/[^/]+/([^/]+)(/[0-9]+)?/?$', 'index.php?movies=$matches[1]&page=$matches[3]', 'top' ); add_rewrite_rule( 'genres/[^/]+/[^/]+/([^/]+)/?$', 'index.php?attachment=$matches[1]', 'top' ); add_rewrite_rule( 'genres/[^/]+/[^/]+/([^/]+)/trackback/?$', 'index.php?attachment=$matches[1]&tb=1', 'top' ); add_rewrite_rule( 'genres/[^/]+/[^/]+/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$', 'index.php?attachment=$matches[1]&feed=$matches[2]', 'top' ); add_rewrite_rule( 'genres/[^/]+/[^/]+/([^/]+)/(feed|rdf|rss|rss2|atom)/?$', 'index.php?attachment=$matches[1]&feed=$matches[2]', 'top' ); add_rewrite_rule( 'genres/[^/]+/[^/]+/([^/]+)/comment-page-([0-9]{1,})/?$', 'index.php?attachment=$matches[1]&cpage=$matches[2]', 'top' ); add_rewrite_rule( 'genres/[^/]+/attachment/([^/]+)/?$', 'index.php?attachment=$matches[1]', 'top' ); add_rewrite_rule( 'genres/[^/]+/attachment/([^/]+)/trackback/?$', 'index.php?attachment=$matches[1]&tb=1', 'top' ); add_rewrite_rule( 'genres/[^/]+/attachment/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$', 'index.php?attachment=$matches[1]&feed=$matches[2]', 'top' ); add_rewrite_rule( 'genres/[^/]+/attachment/([^/]+)/(feed|rdf|rss|rss2|atom)/?$', 'index.php?attachment=$matches[1]&feed=$matches[2]', 'top' ); add_rewrite_rule( 'genres/[^/]+/attachment/([^/]+)/comment-page-([0-9]{1,})/?$', 'index.php?attachment=$matches[1]&cpage=$matches[2]', 'top' ); add_rewrite_rule( 'genres/([^/]+)/trackback/?$', 'index.php?genre=$matches[1]&tb=1', 'top' ); add_rewrite_rule( 'genres/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$', 'index.php?genre=$matches[1]&feed=$matches[2]', 'top' ); add_rewrite_rule( 'genres/([^/]+)/(feed|rdf|rss|rss2|atom)/?$', 'index.php?genre=$matches[1]&feed=$matches[2]', 'top' ); add_rewrite_rule( 'genres/([^/]+)/page/?([0-9]{1,})/?$', 'index.php?genre=$matches[1]&paged=$matches[2]', 'top' ); add_rewrite_rule( 'genres/([^/]+)(/[0-9]+)?/?$', 'index.php?genre=$matches[1]&page=$matches[2]', 'top' ); add_rewrite_rule( 'genres/[^/]+/([^/]+)/?$', 'index.php?attachment=$matches[1]', 'top' ); add_rewrite_rule( 'genres/[^/]+/([^/]+)/trackback/?$', 'index.php?attachment=$matches[1]&tb=1', 'top' ); add_rewrite_rule( 'genres/[^/]+/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$', 'index.php?attachment=$matches[1]&feed=$matches[2]', 'top' ); add_rewrite_rule( 'genres/[^/]+/([^/]+)/(feed|rdf|rss|rss2|atom)/?$', 'index.php?attachment=$matches[1]&feed=$matches[2]', 'top' ); add_rewrite_rule( 'genres/[^/]+/([^/]+)/comment-page-([0-9]{1,})/?$', 'index.php?attachment=$matches[1]&cpage=$matches[2]', 'top' ); } 

Я думаю, вы используете неправильный подход с точки зрения структуры данных. Вы должны создать пользовательскую таксономию под названием «Жанры» и привязать свои фильмы CPT к пользовательской таксономии жанров, а затем выбрать жанры, к которым принадлежит фильм.

Чтобы задать вопросы о существующем коде. шаблон one-XXX.php используется для отображения содержимого из CPT, называемого XXX. Поэтому, чтобы отображать фильмы, вы должны использовать single-movies.php. И адрес контента специально для определенного post_meta, вы можете сделать следующее:

 if(get_post_meta($post_id, 'genres', false) == 'action') { //Do Stuff Here }