Comment connecter différents CPT ensemble?

10

J'espère que cette question a sa place ici.

J'ai toujours pensé que la connexion de différents types de publications personnalisées était un besoin assez courant, comme dans les exemples de didacticiels courants d'utilisation de la taxonomie personnalisée (livres / auteurs / titres, films / acteurs / réalisateurs, etc.). Personnellement, j'utilise "Posts 2 Posts", mais le support a cessé.

Sur Google, les résultats les plus pertinents pointent vers ce plugin pour le moment. Quelles alternatives à long terme existent? Qu'est-ce qu'un développeur web WordPress expérimenté utiliserait aujourd'hui pour concevoir un système de gestion de livre / auteur / titre avec WordPress, si le plug-in P2P est terminé?

    
posée drake035 12.01.2014 - 23:35

3 réponses

10

En tant que programmeur, je commencerais par écrire mon propre code pour connecter mes types de publication. Ce n'est pas un moyen rapide, ce n'est pas facile, mais c'est très amusant.

Les types de publication

Nous commençons par créer deux types de publication simples, Author et Books :

add_action('init', 'p2p2_register_author');
add_action('init', 'p2p2_register_book');

function p2p2_register_author(){
    $labels = array(
        'name'               => 'Author',
        'singular_name'      => 'Author',
        'add_new'            => 'Add New',
        'add_new_item'       => 'Add New Author',
        'edit_item'          => 'Edit Author',
        'new_item'           => 'New Author',
        'all_items'          => 'All Authors',
        'view_item'          => 'View Authors',
        'search_items'       => 'Search Authors',
        'not_found'          => 'No authors found',
        'not_found_in_trash' => 'No authors found in Trash',
        'parent_item_colon'  => '',
        'menu_name'          => 'Authors'
    );

    register_post_type(
        'Author',
        array (
            'labels'             => $labels,
            'public'             => true,
            'publicly_queryable' => true,
            'show_ui'            => true,
            'show_in_menu'       => true,
            'query_var'          => true,
            'rewrite'            => array( 'slug' => 'author' ),
            'capability_type'    => 'post',
            'has_archive'        => true,
            'hierarchical'       => false,
            'menu_position'      => null,
            'supports'           => array( 'title', 'editor', 'author', 'thumbnail', 'excerpt', 'comments' )
        )
    );
}
function p2p2_register_book(){
    $labels = array(
        'name'               => 'Books',
        'singular_name'      => 'Book',
        'add_new'            => 'Add New',
        'add_new_item'       => 'Add New Book',
        'edit_item'          => 'Edit Book',
        'new_item'           => 'New Book',
        'all_items'          => 'All Books',
        'view_item'          => 'View Book',
        'search_items'       => 'Search Books',
        'not_found'          => 'No books found',
        'not_found_in_trash' => 'No books found in Trash',
        'parent_item_colon'  => '',
        'menu_name'          => 'Books'
    );

    register_post_type(
        'Book',
        array (
            'labels'             => $labels,
            'public'             => true,
            'publicly_queryable' => true,
            'show_ui'            => true,
            'show_in_menu'       => true,
            'query_var'          => true,
            'rewrite'            => array( 'slug' => 'book' ),
            'capability_type'    => 'post',
            'has_archive'        => true,
            'hierarchical'       => false,
            'menu_position'      => null,
            'supports'           => array( 'title', 'editor', 'author', 'thumbnail', 'excerpt', 'comments' )
        )
    );
}

Rien d'extraordinaire là-bas. En fait, cela provient du Codex !

La métabox

Continuons en ajoutant une metabox pour notre auteur à notre type de publication:

add_action('admin_init', 'p2p2_add_author_metabox');

function p2p2_add_author_metabox(){
    add_meta_box( 
        'book_author', 
        __('Book Author', 'bandpress'), 
        'p2p2_book_author_metabox', 
        'book', 
        'side', 
        'default', 
        array( 'id' => 'p2p2_author') 
    );
}

Vous pouvez voir ici une fonction de rappel p2p2_book_author_metabox qui sera ce qui se trouve dans notre metabox.

Le contenu de la métabox

Créons la fonction:

function p2p2_book_author_metabox($post, $args){
    wp_nonce_field( plugin_basename( __FILE__ ), 'p2p2_book_author_nonce' );
    $author_id = get_post_meta($post->ID, 'p2p2_book_author', true);

    echo "<p>Select the author of the book</p>";
    echo "<select id='p2p2_book_author' name='p2p2_book_author'>";
    // Query the authors here
    $query = new WP_Query( 'post_type=author' );
    while ( $query->have_posts() ) {
        $query->the_post();
        $id = get_the_ID();
        $selected = "";

        if($id == $author_id){
            $selected = ' selected="selected"';
        }
        echo '<option' . $selected . ' value=' . $id . '>' . get_the_title() . '</option>';
    }
    echo "</select>";
}

Voici où la magie opère. Nous allons d'abord interroger la base de données sur les auteurs, puis nous allons renseigner un <select> avec les résultats de notre requête. Consultez le Codex pour plus d'informations sur WP_Query . Maintenant, vous pouvez aller à votre type de livre et voir votre liste déroulante:

Enregistrementdenotrecontenu

Biensûr,nousvoulonsenregistrernotresélectionafind'ajouteruneautrefonctionpermettantdesauvegarderlametabox:

add_action('save_post','p2p2_save_author_metabox',1,2);functionp2p2_save_author_metabox($post_id,$post){//Don'twannasavethisnow,right?if(defined('DOING_AUTOSAVE')&&DOING_AUTOSAVE)return;if(!isset($_POST['p2p2_book_author_nonce']))return;if(!wp_verify_nonce($_POST['p2p2_book_author_nonce'],plugin_basename(__FILE__)))return;//Wedowanttosave?Ok!$key='p2p2_book_author';$value=$_POST["p2p2_book_author"];
    if ( get_post_meta( $post->ID, $key, FALSE ) ) { // If the custom field already has a value
        update_post_meta( $post->ID, $key, $value );
    } else { // If the custom field doesn't have a value
        add_post_meta( $post->ID, $key, $value );
    }
    if ( !$value ) delete_post_meta( $post->ID, $key ); // Delete if blank
}

Maintenant, sauvegardez un livre avec un auteur! L'auteur du livre sera enregistré dans la table de base de données wp_postmeta et la valeur sélectionnée du menu déroulant sera celle de la méta.

Colonne d'auteur pour livre

Développons la zone d'administration de nos livres. Nous allons commencer par changer les colonnes:

add_filter('manage_edit-book_columns', 'p2p2_add_book_columns');

function p2p2_add_book_columns($columns){
    $new_columns['cb'] = '<input type="checkbox" />';

    $new_columns['title'] = _x('Title', 'column name', 'bandpress');

    $new_columns['p2p2_author'] = __('Author', 'bandpress');

    return $new_columns;
}

Cette fonction garantit que nous ne voyons que le titre des colonnes et p2p2_author. La colonne de case à cocher cb est nécessaire pour la fonctionnalité d'édition en masse de WordPress. Nous devons maintenant ajouter des informations à notre colonne. Nous ajoutons cette fonction:

add_action('manage_book_posts_custom_column', 'p2p2_fill_book_columns', 10, 2);

function p2p2_fill_book_columns($column_name, $id) {
    global $wpdb;
    switch ($column_name) {
        case 'p2p2_author':
            $author_id = get_post_meta($id, 'p2p2_book_author', true);
            $author = get_post($author_id);
            $permalink = get_permalink($author_id);
            echo "<a href='" . $permalink . "'>" . $author->post_title . "</a>";
            break;
        default:
            break;
    } // end switch
}

Le commutateur concerne chaque colonne que vous venez d'ajouter dans la fonction précédente. Vous le remplissez en faisant écho à ce que vous voulez montrer. Nous recevons le message qui est l'auteur de notre livre et créons un lien permanent avec sa 'page de profil'. Voici à quoi ça ressemble:

à suivre

Nous avons connecté deux types de publication dans le backend de notre site WordPress, mais nous ne pouvons rien en voir dans le frontal. Il faudra beaucoup de travail pour accomplir cela, mais les possibilités sont un peu infinies. Nous pourrions:

  1. Trier les livres par auteur
  2. Afficher une liste de livres sur la page de l'auteur
  3. Afficher une liste des autres livres de l'auteur sur la page du livre
  4. Créez une metabox élégante avec des images de l'auteur
  5. Créez une colonne dans la page d'administration de l'auteur pour les livres qu'il a écrits
  6. Et bien plus encore ...

Je continuerai à travailler sur cette réponse, car j’ai besoin de cette solution moi-même. Cependant, je vais arrêter de travailler pour le moment. Je commencerai à mettre à jour cette réponse demain.

    
réponse donnée Scuba Kay 23.01.2014 - 01:48
4

Je ne m'en inquiéterais pas trop, car quelques développeurs géniaux se sont portés volontaires pour continuer à fournir de l'aide Toutefois, si vous souhaitez utiliser autre chose, consultez le champ de relation ACF .

    
réponse donnée Bjorn 19.01.2014 - 08:26
2

Puisque la question initiale est "Que feriez-vous si le P2P disparaissait?" J'ai une pensée / suggestion. J'en avais réellement besoin, car si vous construisez un plugin, dire aux utilisateurs d'installer un autre plugin n'est pas toujours viable.

Une méthode simple consisterait à utiliser le Post Meta. Par exemple. Dans la post_meta de Author, vous pouvez stocker les livres. Soit en tant qu'entrées uniques, soit en une entrée séparée par une virgule, soit en un tableau sérialisé Ensuite, sur le livre, vous stockez les informations inverses de Auteur (s).

Une autre solution consisterait à ajouter une nouvelle table de base de données (mal vue) qui stocke les relations et autres informations pertinentes.

Aucune idée de l'efficacité de l'une ou l'autre solution n'est à l'échelle, mais elles fonctionnent.

    
réponse donnée Jeff Rose 21.01.2014 - 01:28

Lire d'autres questions sur les étiquettes