Bagaimana cara menghubungkan berbagai CPT secara bersamaan?

11

Saya harap pertanyaan ini ada di sini.

Saya selalu berpikir bahwa menghubungkan Berbagai Jenis Posting Kustom bersama adalah kebutuhan yang agak umum, seperti dalam contoh tutorial populer penggunaan taksonomi kustom (buku / penulis / judul, film / aktor / sutradara, dll). Saya pribadi menggunakan "Posting 2 Posting", tetapi dukungan berhenti.

Di Google, hasil paling relevan menunjukkan plugin ini sekarang. Alternatif jangka panjang mana yang ada? Apa yang akan digunakan oleh pengembang web WordPress berpengalaman untuk merancang sistem manajemen buku / penulis / judul dengan WordPress hari ini, jika plugin P2P selesai?

drake035
sumber
Kode apa yang Anda gunakan untuk membuat jenis posting khusus? Anda dapat menambahkan dukungan untuk membuat jenis taksonomi khusus menggunakan kode ini wordpress.stackexchange.com/a/128544/9884
Brad Dalton
1
Saya pikir sejumlah besar orang masih menggunakan p2p jadi saya tidak bisa melihatnya gagal dalam waktu dekat karena seseorang hanya dapat memotong dan memeliharanya di github. Jika dukungan telah dihapus namun saya menganggap itu hanya berarti scribu sedang mengerjakan sesuatu yang baru atau fungsi mungkin membuat jalannya menjadi inti. Saya tidak melihatnya sebagai alasan untuk tidak menggunakannya.
sanchothefat
1
Saya tidak begitu yakin sancho. P2P hanya memiliki 55.000 unduhan pada halaman WP plugins, jauh lebih populer daripada yang saya kira. Dan saya tidak mengerti mengapa, sekali lagi karena menghubungkan CPT bersama terdengar seperti kebutuhan yang sangat mendasar dan umum. Bagaimana sebuah plugin yang hanya membahas sesuatu yang sangat mendasar hanya dapat memiliki 55.000 unduhan? Itu di luar saya. Satu-satunya penjelasan adalah bahwa ada cara lain yang baik untuk mengatasinya maka pertanyaan saya.
drake035
3
Anda dapat terus menggunakan plugin ini dan jika plugin tersebut gagal, Anda dapat melakukan fork repo dan memeliharanya sendiri: github.com/scribu/wp-posts-to-posts.git Kutipan dari repo:If you want to help maintain the plugin, fork it on github and open pull requests.
Scuba Kay
4
Terpilih dan dibintangi pertanyaan ini karena saya pikir HABTM di WordPress benar-benar menarik. Yang mengatakan, saya tidak akan terlalu banyak berkeringat plugin, Mark Jaquith telah secara sukarela membantu membuatnya tetap berjalan . Dan sementara beberapa plugin WP mungkin memiliki 300.000 unduhan atau apa pun, tidak banyak yang memiliki 472 bintang di github. Untuk mempertahankannya, itulah angka yang diperhitungkan!
Will

Jawaban:

13

Sebagai seorang programmer, saya akan mulai menulis kode saya sendiri untuk menghubungkan tipe posting saya. Ini bukan cara yang cepat, itu tidak mudah, tetapi sangat menyenangkan.

Jenis posting

Kami mulai dengan membuat dua jenis posting sederhana, Authordan 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' )
        )
    );
}

Tidak ada yang mewah di sana. Bahkan, itu dari Codex !

Metabox

Mari kita lanjutkan dengan menambahkan metabox untuk penulis kami ke jenis posting buku kami:

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

Di sini Anda dapat melihat fungsi panggilan balik p2p2_book_author_metaboxyang akan menjadi apa yang ada di dalam metabox kami.

Isi dari metabox

Mari kita buat fungsinya:

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

Di sinilah keajaiban terjadi. Pertama kita akan query database untuk penulis dan kemudian kita isi <select>dengan hasil query kita. Periksa Codex untuk informasi lebih lanjut WP_Query. Sekarang Anda dapat pergi ke jenis posting buku Anda dan melihat dropdown Anda:

Dropdown kami

Menyimpan konten kami

Tentu saja kami ingin menyimpan pilihan kami sehingga kami menambahkan fungsi lain yang akan menyimpan metabox untuk kami:

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
}

Sekarang, pergi dan simpan buku dengan penulis! Penulis buku akan disimpan dalam wp_postmetatabel database dan nilai yang dipilih dari dropdown akan berada dalam meta.

Kolom penulis untuk buku

Mari kita memperluas area admin untuk buku-buku kami. Kami akan mulai dengan mengubah kolom:

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

Fungsi ini memastikan kita hanya melihat judul kolom dan p2p2_author. Kolom kotak centang cb diperlukan untuk fungsi edit massal WordPress. Sekarang kita perlu menambahkan beberapa informasi ke kolom kita. Kami menambahkan fungsi ini:

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
}

Switch untuk setiap kolom yang baru saja Anda tambahkan di fungsi sebelumnya. Anda mengisinya dengan menggemakan apa yang ingin Anda perlihatkan. Kami mendapatkan pos yang merupakan penulis buku kami dan membuat tautan permanen yang bagus ke 'halaman profil' nya. Seperti inilah tampilannya:

Kolom penulis kami

Bersambung

Kami menghubungkan dua jenis posting di backend situs WordPress kami, tetapi kami tidak dapat melihatnya di frontend. Dibutuhkan lebih banyak pekerjaan untuk mencapai hal ini, tetapi kemungkinannya tidak terbatas. Kita bisa:

  1. Sortir buku menurut penulis
  2. Tampilkan daftar buku di halaman penulis
  3. Tampilkan daftar buku-buku penulis lain di halaman buku
  4. Buat metabox mewah dengan gambar-gambar penulis
  5. Buat kolom di halaman admin penulis untuk buku-buku yang dia tulis
  6. Dan masih banyak lagi ...

Saya akan terus mengerjakan jawaban ini, karena saya membutuhkan solusi ini sendiri. Namun, saya akan berhenti bekerja untuk saat ini. Saya akan mulai memperbarui jawaban ini besok.

Scuba Kay
sumber
Terima kasih telah membagikan balasan luar biasa Anda. Bagaimana Anda memperlihatkan daftar buku yang ditulis oleh penulis?
William
4

Saya tidak akan terlalu khawatir tentang hal itu, karena beberapa pengembang hebat mengajukan diri untuk melanjutkan dukungan . Namun, jika Anda ingin menggunakan sesuatu yang lain, periksa bidang hubungan ACF .

Bjorn
sumber
Link Lone dan rekomendasi plugin dianggap jawaban berkualitas buruk. Alasannya sederhana: Jika tautannya hilang, jawabannya (dan situs ini) menderita tautan busuk.
kaiser
3
Solusi bebas tautan juga dapat menjadi usang dari waktu ke waktu, dan ini lebih buruk daripada tautan mati karena beberapa orang mungkin membuang-buang waktu mencoba menerapkan solusi usang ini tanpa mengetahui mereka tidak berfungsi lagi. Selain itu ACF dan situs webnya kemungkinan akan bertahan lama. Akhirnya terima kasih banyak bagi Bjorn untuk alternatif yang fantastis ini.
drake035
2

Karena pertanyaan aslinya adalah "Apa yang akan Anda lakukan jika P2P hilang?" Saya punya pemikiran / saran. Saya benar-benar diperlukan, karena jika Anda membangun sebuah plugin, memberi tahu pengguna untuk menginstal plugin lain tidak selalu layak.

Salah satu metode sederhana adalah dengan menggunakan Post Meta. Sebagai contoh. Di post_meta dari Author, Anda dapat menyimpan buku. Entah sebagai entri unik atau satu entri yang dipisahkan koma atau array serial. Kemudian pada buku itu, Anda menyimpan info terbalik dari Pengarang.

Yang lain adalah menambahkan tabel DB baru (disukai) yang menyimpan hubungan dan informasi terkait lainnya.

Tidak tahu seberapa efisien suatu solusi pada skala, tetapi mereka bekerja.

Jeff Rose
sumber