嵌套 CPT 网址 + 帖子 2 个帖子
Nested CPT URLs + Posts 2 Posts
我正在处理一个具有两种不同自定义 post 类型的客户站点:artist
和 portfolio
。我正在使用 posts-to-posts 插件创建每个艺术家与其作品集的关系。
艺术家 URL 设置为 {siteUrl}/artist
,而投资组合 URL 设置为接收艺术家姓名:{siteUrl}/artist/%artistname%
我写了以下代码来检查 portfolio
是否连接到 artist
,如果是,则将 portfolio
的 URL 更改为 {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,但不会更改永久链接,而且我在前端收到 404 错误。我想这需要一个重写函数才能与之配对?只是不确定从这里去哪里。
所以在花了很多时间并尝试了很多不同的事情之后,我终于找到了正确的方法来做到这一点。我使用 MonkeyMan Rewrite Analyzer 和 WP 调试栏来帮助弄清楚如何构建重写。
所以首先,我的自定义 post 类型 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 tag %artistname%
作为艺术家名字,我们将通过WP_Query
函数来抓取它,以及一个rewrite rule来填充要占用的slug由艺术家的名字,这将出现在展示的作品集的 slug 之前。
// 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 过滤器以检查它是否是投资组合 post,如果是,则拉出第一个连接的 slug artist
,然后将那个 slug 扑通一声进入 post link 字符串。
// 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 中讨论的相同插件,但整个线程对得出这个结论非常有帮助。
我正在处理一个具有两种不同自定义 post 类型的客户站点:artist
和 portfolio
。我正在使用 posts-to-posts 插件创建每个艺术家与其作品集的关系。
艺术家 URL 设置为 {siteUrl}/artist
,而投资组合 URL 设置为接收艺术家姓名:{siteUrl}/artist/%artistname%
我写了以下代码来检查 portfolio
是否连接到 artist
,如果是,则将 portfolio
的 URL 更改为 {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,但不会更改永久链接,而且我在前端收到 404 错误。我想这需要一个重写函数才能与之配对?只是不确定从这里去哪里。
所以在花了很多时间并尝试了很多不同的事情之后,我终于找到了正确的方法来做到这一点。我使用 MonkeyMan Rewrite Analyzer 和 WP 调试栏来帮助弄清楚如何构建重写。
所以首先,我的自定义 post 类型 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 tag %artistname%
作为艺术家名字,我们将通过WP_Query
函数来抓取它,以及一个rewrite rule来填充要占用的slug由艺术家的名字,这将出现在展示的作品集的 slug 之前。
// 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 过滤器以检查它是否是投资组合 post,如果是,则拉出第一个连接的 slug artist
,然后将那个 slug 扑通一声进入 post link 字符串。
// 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 中讨论的相同插件,但整个线程对得出这个结论非常有帮助。