web-dev-qa-db-fra.com

Connecter une taxonomie avec un type de message

La mise en place:

  • type de poste personnalisé de 'mandataire'
  • taxonomie personnalisée de 'spécialité', enregistrée contre le type de message 'avocat'
  • type de poste personnalisé de 'domaine de pratique'

Pour chaque spécialité, il existe un domaine de pratique correspondant. Cependant, il y a beaucoup plus de domaines de pratique que de spécialités.

Idéalement, lors de la visualisation d'un domaine de pratique (par exemple, faillite), je serais en mesure de lister les avocats ayant pour spécialité la faillite.

Je sais que je pourrais utiliser le plug-in posts2posts et créer une connexion entre le type de poste d'avocat et le type de poste de domaine de pratique. Cependant, cela impliquerait essentiellement de définir deux fois la spécialité d'un avocat (une fois comme terme de taxonomie et une fois comme connexion posts2posts). Existe-t-il un moyen de créer un lien entre le terme de taxonomie spécialisée et le type de poste correspondant au domaine de pratique? Je pourrais simplement supposer que les noms et/ou les slugs vont correspondre, mais c'est une solution assez hacky/fragile.

Dans l'idéal, j'aimerais relier les termes habituels de "catégorie" aux différents types de publication de "domaine de pratique", afin de répertorier les articles de blog pertinents sur les pages de chaque domaine de pratique (et inversement).

Suggestions?

2
Travis Northcutt

J'ai traité une exigence similaire et jusqu'à présent, la meilleure façon de le faire consiste à utiliser un champ personnalisé pour enregistrer l'identifiant du terme associé.

Cela signifie que pour chaque type de publication "domaine de pratique", il y aura un champ personnalisé "id-terme-spécialité" avec l'id du terme "spécialité" comme valeur.

Voici le crochet d'action pour créer le terme pour chaque post

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);
    }

}
}

et l'action pour supprimer le terme sur chaque post supprimer

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');
}
}

Notez que j’ai utilisé "practice-area" comme type de publication personnalisé et "practice-area-term" comme taxonomie associée.

J'espère que cette aide

1
ifdion

si je vous ai bien compris, alors que vous vous trouvez dans le domaine de la faillite ... Le terme "faillite" est le terme que vous souhaitez interroger dans la taxonomie "des spécialités".

vous pouvez essayer de mettre ceci sur votre template '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