Вложенные URL-адреса CPT + Сообщений 2 Сообщений

Я работаю на клиентском сайте, который имеет два разных пользовательских типа сообщений: artist и portfolio . Я использую плагин posts-to-posts для создания отношений от каждого исполнителя к их портфелям.

URL-адрес исполнителя настраивается как {siteUrl}/artist , а URL-адрес портфолио настраивается для получения имени исполнителя: {siteUrl}/artist/%artistname%

Я написал следующее, чтобы проверить, связано ли portfolio с artist , и если да, измените URL-адрес этого portfolio на {siteUrl}/artist/artist-name/portfolio-name . Если у него нет подключенного исполнителя, он перенаправляет URL-адрес на адрес {siteUrl}/portfolio/portfolio-name .

 function filter_portfolio_link( $post_link, $post ) { if ( $post->post_type === 'portfolio' ) { $connected = new WP_query( array( 'post_type' => 'artist', 'connected_type' => 'portfolios_to_artists', 'connected_items' => $post, 'nopaging' => true, ) ); if ($connected->have_posts() ) { foreach ( $connected as $connectedPost ) { setup_postdata($connectedPost); if ($connectedPost->post_type === 'artist') { $artistName = $connectedPost->post_name; $first = false; } } $post_link = str_replace( '%artist_name%', $artistName, $post_link ); } else { $post_link = str_replace( 'artist/%artist_name%', 'portfolio', $post_link); } } return $post_link; } add_filter( 'post_type_link', 'filter_portfolio_link', 10, 2); 

Это вытаскивает правильные данные и правильно вставляет их в URL-адрес, но с большим количеством уведомлений PHP. На данный момент меня так не волнует.

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

Это ( получение идентификатора почты из slug во время init ), казалось, ударило куда-то вокруг того, что я ищу, хотя и не совсем точно. Есть идеи?

Solutions Collecting From Web of "Вложенные URL-адреса CPT + Сообщений 2 Сообщений"

Поэтому, после большого количества времени и многого другого, я наконец-то понял правильный способ сделать это. Я использовал MonkeyMan Rewrite Analyzer и WP Debug Bar, чтобы выяснить, как построить переписывание.

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

 // Artist Rewrite Args $rewrite = array( 'slug' => 'artist', 'with_front' => true, 'pages' => true, 'feeds' => true, ); // Portfolio Rewrite Args $rewrite = array( 'slug' => 'portfolio', 'with_front' => false, 'pages' => true, 'feeds' => true, ); 

Затем я регистрирую тэг rewrite %artistname% для имени исполнителя, который мы будем захватывать с помощью функции WP_Query , а также правило перезаписи, чтобы заполнить WP_Query , который должен быть занят именем исполнителя, который появится перед пули отображаемого портфеля.

 // Portfolio Rewrite Rule add_action( 'init', 'portfolio_rewrite_tag' ); function portfolio_rewrite_tag() { add_rewrite_tag('%artistname%','[^/]+'); // defines the rewrite structure for 'portfolios' // says that if the portfolio URL matches this rule, then it should display the 'artists' post whose post name matches the last slug set add_rewrite_rule( '^artist/[^/]+/([^/]+)/?$','index.php?portfolio=$matches[1]','top' ); } 

Затем я уточнил фильтр URL, чтобы проверить, является ли это портфолио, и если это так, потяните пул первого подключенного artist , а затем переверните этот пул в строку ссылки.

 // Grab connected artist name and swap it into the URL function filter_portfolio_link( $post_link, $post ) { if ( $post->post_type === 'portfolio' ) { $connected = new WP_query( array( 'post_type' => 'artist', 'connected_type' => 'portfolios_to_artists', 'connected_items' => $post, 'nopaging' => true, ) ); if ($connected->have_posts() ) { $first = true; foreach ( $connected as $connectedPost ) { setup_postdata($connectedPost); if ($connectedPost->post_type === 'artist') { if ($first) { $artistName = $connectedPost->post_name; $first = false; } } } $post_link = str_replace( 'portfolio', 'artist/' . $artistName, $post_link ); } } return $post_link; } add_filter( 'post_type_link', 'filter_portfolio_link', 10, 2); 

Итак, это все! Хотя я не использовал тот же плагин, который обсуждался в потоке Вложенные пользовательские типы сообщений с постоянными значениями , весь поток был очень полезен при достижении этого вывода.