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 messages personnalisés était un besoin assez courant, comme dans les exemples de didacticiels populaires d'utilisation de la taxonomie personnalisée (livres / auteurs / titres, films / acteurs / réalisateurs, etc.). J'utilise personnellement "Posts 2 Posts", mais le support a cessé.

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


Quel code avez-vous utilisé pour créer les types de publication personnalisés? Vous pouvez ajouter la prise en charge de la création de types de taxonomie personnalisés à l'aide de ce code wordpress.stackexchange.com/a/128544/9884
Brad Dalton

1
Je pense qu'un grand nombre de personnes utilisent toujours p2p, donc je ne peux pas le voir échouer de sitôt car quelqu'un pourrait simplement le bifurquer et le maintenir sur github. Si le support a été abandonné, je suppose que cela signifie simplement que scribu travaille sur quelque chose de nouveau ou que la fonctionnalité fait son chemin dans le cœur. Je ne vois pas cela comme une raison pour ne pas l'utiliser.
sanchothefat

1
Je ne suis pas sûr sancho. Le P2P n'a que 55 000 téléchargements sur la page des plugins WP, beaucoup moins populaire que je ne le pensais. Et je ne comprends pas pourquoi, encore une fois parce que connecter des CPT ensemble me semble être un besoin très fondamental et commun. Comment un plugin qui ne traite que de quelque chose d'aussi basique ne pourrait avoir que 55 000 téléchargements? Ça me dépasse. La seule explication est qu'il y a un autre bon moyen d'y répondre, d'où ma question.
drake035

3
Vous pouvez continuer à utiliser ce plugin et si le plugin devait échouer d'une manière ou d'une autre, vous pouvez bifurquer le dépôt et le maintenir vous-même: github.com/scribu/wp-posts-to-posts.git Citation du dépôt :If you want to help maintain the plugin, fork it on github and open pull requests.
Scuba Kay

4
A voté et mis en vedette cette question parce que je pense que HABTM dans WordPress est vraiment intéressant. Cela dit, je ne ferais pas trop transpirer le plugin, Mark Jaquith s'est porté volontaire pour l'aider à continuer . Et tandis que certains plugins WP peuvent avoir 300 000 téléchargements ou autre, peu ont 472 étoiles sur github. Pour le garder en vie, c'est le nombre qui compte!
Will

Réponses:


12

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

Les types de messages

Nous commençons par créer deux types de messages simples Authoret 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, c'est du Codex !

La métabox

Continuons en ajoutant une métabox pour notre auteur à notre type de publication de livre:

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

Ici, vous pouvez voir une fonction de rappel p2p2_book_author_metaboxqui sera à l'intérieur de notre métabox.

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 pour les auteurs, puis nous remplissons un <select>avec nos résultats de requête. Consultez le Codex pour en savoir plus WP_Query. Vous pouvez maintenant accéder à votre type de publication de livre et voir votre liste déroulante:

Notre liste déroulante

Sauvegarder notre contenu

Bien sûr, nous voulons enregistrer notre sélection, donc nous ajoutons une autre fonction qui va enregistrer la métabox pour nous:

add_action('save_post', 'p2p2_save_author_metabox', 1, 2);

function p2p2_save_author_metabox($post_id, $post){
    // Don't wanna save this now, 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;

    // We do want to save? 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
}

Allez maintenant enregistrer un livre avec un auteur! L'auteur du livre sera enregistré dans la wp_postmetatable de base de données et la valeur sélectionnée de la liste déroulante sera celle de la méta.

Une colonne d'auteur pour le 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 s'assure 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. Maintenant, nous devons 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 est pour 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 obtenons le post qui est l'auteur de notre livre et créons un joli permalien vers sa «page de profil». Voici à quoi ça ressemble:

Notre rubrique auteur

À suivre

Nous avons connecté deux types de messages dans le backend de notre site WordPress, mais nous n'en voyons rien dans le frontend. Il faudra beaucoup plus de travail pour y parvenir, mais les possibilités sont quelque 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 d'autres livres de l'auteur sur la page du livre
  4. Créez une métabox fantaisie avec des photos de l'auteur
  5. Créez une colonne dans la page d'administration de l'auteur pour les livres qu'il / elle a écrits
  6. Et beaucoup plus...

Je vais continuer à travailler sur cette réponse, car j'ai moi-même besoin de cette solution. Cependant, je vais arrêter de travailler dessus pour l'instant. Je vais commencer à mettre à jour cette réponse demain.


Merci d'avoir partagé votre incroyable réponse. Comment montriez-vous une liste de livres écrits par l'auteur?
William

4

Je ne m'en inquiéterais pas trop, car quelques grands développeurs se sont portés volontaires pour continuer le support . Cependant, si vous souhaitez utiliser autre chose, consultez le champ de relation ACF .


Les liens isolés et les recommandations de plugins sont considérés comme des réponses de mauvaise qualité. La raison est simple: si le lien a disparu, la réponse (et ce site) souffre de pourriture du lien.
kaiser

3
Les solutions sans lien peuvent également devenir obsolètes avec le temps, et c'est pire que les liens morts car certaines personnes peuvent perdre du temps à essayer de mettre en œuvre ces solutions obsolètes sans savoir qu'elles ne fonctionnent plus. En outre, ACF et son site Web sont susceptibles de durer très longtemps. Enfin, merci beaucoup Bjorn pour cette fantastique alternative.
drake035

2

Étant donné que la question initiale était "Que feriez-vous si le P2P disparaissait?" J'ai une pensée / suggestion. J'avais en fait besoin, car si vous créez un plugin, dire aux utilisateurs d'installer un autre plugin n'est pas toujours viable.

Une méthode simple serait d'utiliser le Post Meta. Par exemple. Dans la post_meta de Author, vous pouvez stocker les livres. Soit sous la forme d'entrées uniques, soit d'une seule entrée séparée par des virgules, soit d'un tableau sérialisé. Ensuite, sur le livre, vous stockez les informations inverses des auteurs.

Un autre serait d'ajouter une nouvelle table DB (désapprouvée) qui stocke les relations et autres informations pertinentes.

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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.