Farklı CPT'leri birbirine nasıl bağlarım?


11

Umarım bu sorunun yeri vardır.

Her zaman farklı Özel Yazı Türlerini birbirine bağlamanın, özel sınıflandırma kullanımının popüler kitap örneklerinde (kitaplar / yazarlar / başlıklar, filmler / aktörler / yönetmenler, vb.) Oldukça yaygın bir ihtiyaç olduğunu düşündüm. Ben şahsen "Mesajlar 2 Mesajlar" kullanıyorum, ancak destek durdu.

Google'da en alakalı sonuçlar şu anda bu eklentiye işaret ediyor. Hangi uzun vadeli alternatifler mevcut? Tecrübeli bir WordPress web geliştiricisi, P2P eklentisi tamamlandıysa bugün WordPress ile bir kitap / yazar / başlık yönetim sistemi tasarlamak için ne kullanırdı?


Özel gönderi türlerini oluşturmak için hangi kodu kullandınız? Bu kodu kullanarak özel sınıflandırma türleri oluşturmak için destek ekleyebilirsiniz wordpress.stackexchange.com/a/128544/9884
Brad Dalton

1
Bence çok sayıda insan hala p2p kullanıyor, bu yüzden birisi github üzerinde çatal tutabilir ve koruyabildiğinden, her zaman başarısız olduğunu göremiyorum. Ancak destek bırakılırsa, bunun sadece scribu'nun yeni bir şey üzerinde çalıştığı veya işlevin çekirdek haline gelebileceği anlamına geldiğini varsayıyorum. Kullanmamak için bir neden olarak görmüyorum.
sanchothefat

1
Pek emin değilim sancho. P2P, WP eklentileri sayfasında sadece 55.000 indirmeye sahip, düşündüğümden çok daha az popüler. Ve nedenini anlamıyorum, çünkü CPT'leri birbirine bağlamak bana çok temel ve ortak bir ihtiyaç gibi geliyor. Sadece bu kadar basit bir şeye hitap eden bir eklentinin nasıl sadece 55.000 indirmesi olabilir? Bu benim dışımda. Tek açıklama, bu yüzden benim soruma değinmenin iyi bir yolu var.
drake035

3
Bu eklentiyi kullanmaya devam edebilirsiniz ve eklenti bir şekilde başarısız olursa, repoyu çatallayabilir ve kendiniz koruyabilirsiniz: github.com/scribu/wp-posts-to-posts.git Repodan alıntı:If you want to help maintain the plugin, fork it on github and open pull requests.
Scuba Kay

4
WordPress'teki HABTM'nin gerçekten ilginç olduğunu düşünüyorum. Bununla birlikte, eklentinin çok fazla gitmesine ter dökmeyeceğim , Mark Jaquith devam etmesine yardımcı olmak için gönüllü oldu . Ve bazı WP eklentileri 300000 indirmeye veya başka bir şeye sahip olsa da, pek çoğunun github'da 472 yıldızı yoktur. Hayatta kalmak için önemli olan budur!
Will

Yanıtlar:


13

Bir programcı olarak, yazı tiplerimi bağlamak için kendi kodumu yazmaya başlarım. Hızlı bir yol değil, kolay değil, ama çok eğlenceli.

Yazı türleri

Biz iki basit yazılan tipleri oluşturmaya başlayın, Authorve 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' )
        )
    );
}

Orada fantezi bir şey yok. Aslında, Codex'tan !

Meta kutu

Kitap yayın türümüze yazarımız için bir meta kutu ekleyerek devam edelim:

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

Burada p2p2_book_author_metabox, meta kutumuzun içindekiler olacak bir geri arama işlevi görebilirsiniz .

Meta kutunun içeriği

Fonksiyonu yaratalım:

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

İşte sihir burada. İlk önce veritabanını yazarlar için sorgulayacağız ve sonra a'yı <select>sorgu sonuçlarımızla dolduracağız . Hakkında daha fazla bilgi için Kodeksi kontrol edin WP_Query. Artık kitap yayın türünüze gidebilir ve açılır kutunuzu görebilirsiniz:

Açılır listemiz

İçeriğimizi kaydetme

Tabii ki seçimimizi kaydetmek istiyoruz, böylece meta kutuyu bizim için kaydedecek başka bir işlev ekliyoruz:

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
}

Şimdi git ve bir yazarla bir kitap kaydet! Kitabın yazarı wp_postmetaveritabanı tablosuna kaydedilecek ve açılır menüden seçilen değer meta olacaktır.

Kitap için bir yazar sütunu

Kitaplarımız için yönetici alanını genişletelim. Sütunları değiştirerek başlayacağız:

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

Bu işlev yalnızca p2p2_author sütunlarını görmemizi sağlar. WordPress'in toplu düzenleme işlevselliği için cb onay kutusu sütunu gereklidir. Şimdi sütunumuza bazı bilgiler eklememiz gerekiyor. Bu işlevi ekliyoruz:

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
}

Anahtar, önceki işlevde yeni eklediğiniz her sütun içindir. Göstermek istediğinizi yankılanarak doldurursunuz. Kitabımızın yazarı olan gönderiyi alıyoruz ve 'profil sayfasına' hoş bir kalıcı bağlantı oluşturuyoruz. Öyle görünüyor:

Yazar sütunumuz

Devam edecek

WordPress sitemizin arka ucuna iki yazı türü bağladık, ancak ön uçta bir şey göremiyoruz. Bunu başarmak için çok daha fazla çalışmaya ihtiyaç duyulacak, ancak olasılıklar biraz sonsuz. Yapabiliriz:

  1. Kitapları yazara göre sırala
  2. Yazar sayfasında kitapların bir listesini göster
  3. Kitap sayfasında yazarın diğer kitaplarının bir listesini göster
  4. Yazarın resimlerini içeren süslü bir meta kutu oluşturun
  5. Yazdığı kitaplar için yazar yönetici sayfasında bir sütun oluşturun
  6. Ve daha fazlası ...

Bu çözüme kendim ihtiyacım olduğu için bu cevap üzerinde çalışmaya devam edeceğim. Ancak şimdilik çalışmayı bırakacağım. Bu cevabı yarın güncellemeye başlayacağım.


Harika cevabınızı paylaştığınız için teşekkür ederiz. Yazarın yazdığı kitapların bir listesini nasıl gösterirdiniz?
William

4

Birkaç büyük geliştirici destek vermeye devam etmek için gönüllü olduğu için bu konuda fazla endişelenmem . Ancak, başka bir şey kullanmak istiyorsanız ACF ilişki alanını kontrol edin .


Yalnız bağlantılar ve eklenti önerileri düşük kaliteli yanıtlar olarak kabul edilir. Nedeni basit: Bağlantı kesilirse, cevap (ve bu site) bağlantı çürümesinden muzdariptir.
kaiser

3
Bağlantısız çözümler de zamanla eski olabilir ve bu ölü bağlantılardan daha kötüdür, çünkü bazı insanlar artık çalışmadığını bilmeden bu eski çözümleri uygulamaya çalışırken zaman kaybedebilir. Ayrıca ACF ve web sitesi çok uzun sürecek. Sonunda bu harika alternatif için çok teşekkürler Bjorn.
drake035 22:14

2

Asıl soru "P2P gittiğinde ne yapardın?" Bir düşüncem / önerim var. Aslında ihtiyacım vardı, çünkü bir eklenti oluşturuyorsanız, kullanıcılara başka bir eklenti yüklemelerini söylemek her zaman uygun değildir.

Basit bir yöntem Post Meta kullanmak olabilir. Örneğin. Yazarın post_meta'sında kitapları saklayabilirsiniz. Benzersiz girişler veya tek bir virgülle ayrılmış giriş veya serileştirilmiş bir dizi olarak. Sonra kitapta, Yazar (lar) ın ters bilgisini saklarsınız.

Bir diğeri, ilişkileri ve diğer ilgili bilgileri saklayan yeni bir DB tablosu (kaşlarını çattı) eklemek olacaktır.

Her iki çözümün de ne kadar verimli olduğu hakkında bir fikrim yok, ama çalışıyorlar.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.