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


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

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 ошибки на интерфейсе. Я полагаю, что для этого нужна функция перезаписи, которая будет сопряжена с ней? Просто не знаю, куда идти дальше.

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

Author: Community, 2015-01-16

1 answers

Итак, после того, как я потратил много времени и много пробовал разные вещи, я, наконец, нашел правильный способ сделать это. Я использовал Анализатор перезаписи Monkeyman и панель отладки WP, чтобы помочь понять, как создать перезапись.

Итак, во-первых, мои пользовательские 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,
);

Затем я регистрирую тег перезаписи %artistname% для имени исполнителя, который мы захватим с помощью функции 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);

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

 3
Author: brooklynjb, 2017-04-13 12:37:45