web-dev-qa-db-ja.com

分類とポストタイプの関連付け

セットアップ:

  • 「弁護士」のカスタム投稿タイプ
  • 「弁護士」ポストタイプに対して登録されている「専門」のカスタム分類法
  • 「プラクティスエリア」のカスタム投稿タイプ

すべての専門分野について、マッチングプラクティスエリアがあります。ただし、専門分野よりも多くの実践分野があります。

理想的には、実務分野(例えば、破産)を見るとき、私は専門として破産を持っている弁護士をリストすることができるでしょう。

私はposts2postsプラグインを使用して、弁護士のポストタイプと練習場のポストタイプの間の接続を作成できることを知っています。しかし、それは本質的に、弁護士の専門分野を2回設定することを意味します(1回は分類学用語として、もう1回はposts2posts接続として)。専門分類学用語とそれに関連する実務分野の投稿タイプを何らかの形で関連づける方法はありますか。私は単に名前やスラッグ、あるいはその両方が一致すると仮定することができますが、それはかなりハックで脆弱な解決策です。

私は理想的には、通常の「カテゴリ」の用語をさまざまな「練習領域」の投稿タイプにも関連付け、関連するブログ投稿を個々の練習領域のページにリストする(およびその逆)ことを望みます。

提案?

2

私は同様の要件を扱いました、そして今までのところそれをする最も良い方法は関連用語IDを保存するためにカスタムフィールドを使うことです。

つまり、それぞれの 'practice-area'投稿タイプには、 'specialty'という用語IDを値として持つ 'specialty-term-id'カスタムフィールドがあります。

ここで各投稿の用語を作成するためのアクションフック

add_action( 'save_post', 'update_related_term');
function update_related_term($post_id) {
$post_type_as_taxonomy = array('practice-area');
$post = get_post( $post_id );
if(in_array($post->post_type, $post_type_as_taxonomy) && $post->post_status=='publish'){
    $term_args['name'] = $post->post_title;
    $term_args['slug'] = $post->post_name.'';
    $term_id = get_post_meta($post_id, $post->post_type.'-term-id', true);
    if($term_id){
        $term = wp_update_term( $term_id, $post->post_type.'-term', $term_args );
    } else {
        $term = wp_insert_term( $term_args['name'], $post->post_type.'-term', $term_args );
        $meta_status = add_post_meta($post_id, $post->post_type.'-term-id', $term['term_id'], true);
    }

}
}

各投稿の用語を削除するアクション

add_action('admin_init', 'codex_init');
function codex_init() {
if (current_user_can('delete_posts')){
    add_action('before_delete_post', 'delete_related_term', 10);
}
}
function delete_related_term($post_id) {
$post_type_as_taxonomy = array('practice-area');
$post = get_post( $post_id );
if (in_array($post->post_type, $post_type_as_taxonomy)) {
    $term = get_post_meta($post_id, $post->post_type.'-term-id', true);
    wp_delete_term( $term, $post->post_type.'-term');
}
}

カスタムの投稿タイプとして「practice-area」、関連する分類法として「practice-area-term」を使用したことに注意してください。

この助けを願っています

1
ifdion

もし私があなたを正しく理解していれば、それからあなたが破産「実践領域」にいるとき...「破産」はあなたが「専門」分類学で質問したいという用語になるでしょう。

あなたはあなたの 'single-practice-area.php'テンプレートにこれを入れてみることができます:

$args = array( 'post_type'=>'attorney',
    'tax_query' => array(

        array(
            'taxonomy' => 'specialty',
            'terms' => get_query_var('practice-area'), //get current practice-area's name
            'field' => 'slug',
        )
    )
);

$attorneys = get_posts($args);

global $post;
$tmp_post = $post;

if( $attorneys ) : echo "Attorneys<ul>";
foreach( $attorneys as $post ) : setup_postdata($post); ?>
    <li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>
<?php endforeach; 
$post = $tmp_post; 
echo "</ul>";
endif; ?>
0
helgatheviking