私はartist
とportfolio
という2つの異なるカスタム投稿タイプを持つクライアントサイトに取り組んでいます。私は 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という通知がたくさんあります。現時点ではそれほど心配していません。
それでこれはスラッグを正しく変更しますが、それはパーマリンクを変更していません、そして私はフロントエンドで404エラーを得ています。これとペアになるには書き換え関数が必要だと思いますか?ここからどこへ行くのかわからない。
これは( init中にslugからPost IDを取得する )、私が探しているものの周りのどこかに当たっているように見えました。何か案は?
そこで、多くの時間とさまざまなことを試してみた後、私はついにこれを行う正しい方法を考え出しました。書き換えを構成する方法を理解するために、 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フィルターを洗練してポートフォリオ投稿かどうかを確認し、そうであれば、最初に接続された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);
だからそれはそれだ!私はスレッド で説明したのと同じプラグインを使用しませんでしたが、パーマリンク 付きのカスタム投稿タイプをネストしましたが、スレッド全体がこの結論に達するのに非常に役に立ちました。