嵌套的CPT URL+2个帖子

时间:2015-01-16 作者:brooklynjb

我在一个客户网站上工作,该网站有两种不同的自定义帖子类型:artistportfolio. 我正在使用posts-to-posts 插件创建每个艺术家与其作品集之间的关系。

艺术家URL设置为{siteUrl}/artist, 当公文包URL设置为接收艺术家名称时:{siteUrl}/artist/%artistname%

我写了以下内容来检查portfolio 已连接到artist, 如果是,请更改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注意事项。我现在不太担心这些。

因此,虽然这正确地改变了slug,但它并没有改变permalink,我在前端得到了404个错误。我想这需要一个重写函数来配合它?只是不知道接下来该怎么办。

这个(Getting Post ID from slug during init) 似乎找到了我要找的东西,虽然不太准确。有什么想法吗?

1 个回复
最合适的回答,由SO网友:brooklynjb 整理而成

所以在花了很多时间,尝试了很多不同的事情之后,我终于找到了正确的方法。我用过MonkeyMan Rewrite Analyzer 以及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过滤器,以检查它是否是一个公文包帖子,如果是,则从第一个连接的帖子中抽取slugartist, 然后将弹头塞进链接后的字符串中。

// 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);
就是这样!虽然我没有使用线程中讨论的相同插件Nested custom post types with permalinks, 整个线索对得出这个结论非常有帮助。

结束

相关推荐

必须使用插件自动加载器:如何正确使用get_plugins()?

我的autoloader类负责加载必须使用的插件,这些插件不位于mu-plugins 文件夹要定位它们,我需要使用get_plugins() 作用According to Codex, 该函数接受一个参数:$plugin\\u folder(string)(可选):单个插件文件夹的相对路径。我的文件层次结构如下所示:|-- /mu-plugins | |-- autoload.php // only includes wpmu/autoload.php&#

嵌套的CPT URL+2个帖子 - 小码农CODE - 行之有效找到问题解决它

嵌套的CPT URL+2个帖子

时间:2015-01-16 作者:brooklynjb

我在一个客户网站上工作,该网站有两种不同的自定义帖子类型:artistportfolio. 我正在使用posts-to-posts 插件创建每个艺术家与其作品集之间的关系。

艺术家URL设置为{siteUrl}/artist, 当公文包URL设置为接收艺术家名称时:{siteUrl}/artist/%artistname%

我写了以下内容来检查portfolio 已连接到artist, 如果是,请更改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注意事项。我现在不太担心这些。

因此,虽然这正确地改变了slug,但它并没有改变permalink,我在前端得到了404个错误。我想这需要一个重写函数来配合它?只是不知道接下来该怎么办。

这个(Getting Post ID from slug during init) 似乎找到了我要找的东西,虽然不太准确。有什么想法吗?

1 个回复
最合适的回答,由SO网友:brooklynjb 整理而成

所以在花了很多时间,尝试了很多不同的事情之后,我终于找到了正确的方法。我用过MonkeyMan Rewrite Analyzer 以及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过滤器,以检查它是否是一个公文包帖子,如果是,则从第一个连接的帖子中抽取slugartist, 然后将弹头塞进链接后的字符串中。

// 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);
就是这样!虽然我没有使用线程中讨论的相同插件Nested custom post types with permalinks, 整个线索对得出这个结论非常有帮助。