Jak połączyć różne CPT razem?


11

Mam nadzieję, że to pytanie ma swoje miejsce tutaj.

Zawsze uważałem, że łączenie różnych niestandardowych typów postów jest dość powszechną potrzebą, podobnie jak w popularnych przykładach samouczków dotyczących niestandardowego wykorzystania taksonomii (książki / autorzy / tytuły, filmy / aktorzy / reżyserzy itp.). Osobiście używam „Postów 2 postów”, ale wsparcie zostało zatrzymane.

W Google najbardziej trafne wyniki wskazują teraz na tę wtyczkę. Jakie są długoterminowe alternatywy? Czego doświadczony programista stron internetowych WordPress użyłby dzisiaj do zaprojektowania systemu zarządzania książkami / autorami / tytułami za pomocą WordPress, gdyby wtyczka P2P była gotowa?


Jakiego kodu użyłeś do stworzenia niestandardowych typów postów? Możesz dodać obsługę tworzenia niestandardowych typów taksonomii za pomocą tego kodu wordpress.stackexchange.com/a/128544/9884
Brad Dalton

1
Myślę, że ogromna liczba osób nadal używa p2p, więc nie widzę, aby zawodził w najbliższym czasie, ponieważ ktoś mógłby po prostu rozwidlić i utrzymać go na github. Jeśli jednak wsparcie zostało odrzucone, zakładam, że oznacza to po prostu, że scribu pracuje nad czymś nowym lub że funkcjonalność może dostać się do rdzenia. Nie uważam tego za powód, aby go nie używać.
sanchothefat

1
Nie jestem pewien, sancho. P2P ma tylko 55 000 pobrań na stronie wtyczek WP, znacznie mniej popularnych niż myślałem. I nie rozumiem dlaczego, ponownie, ponieważ łączenie CPT wydaje mi się bardzo podstawową i powszechną potrzebą. Jak wtyczka, która odnosi się wyłącznie do czegoś tak podstawowego, może mieć tylko 55 000 pobrań? To poza mną. Jedynym wyjaśnieniem jest to, że istnieje inny dobry sposób na rozwiązanie tego problemu, stąd moje pytanie.
drake035

3
Możesz nadal korzystać z tej wtyczki, a jeśli wtyczka jakoś się zawiedzie, możesz rozwidlić repozytorium i samodzielnie go utrzymać: github.com/scribu/wp-posts-to-posts.git Cytat z repozytorium:If you want to help maintain the plugin, fork it on github and open pull requests.
Scuba Kay

4
Zagłosowałem i zagłosowałem na to pytanie, ponieważ myślę, że HABTM w WordPress jest naprawdę interesujący. To powiedziawszy, nie chciałbym, aby wtyczka zbytnio odchodziła, Mark Jaquith zgłosił się na ochotnika, aby pomóc jej kontynuować . I chociaż niektóre wtyczki WP mogą mieć 300 000 pobrań lub cokolwiek, niewiele z nich ma 472 gwiazdki na github. Za utrzymanie go przy życiu liczy się liczba!
Czy

Odpowiedzi:


13

Jako programista zacząłem pisać własny kod do łączenia typów postów. To nie jest szybki sposób, nie jest łatwy, ale to świetna zabawa.

Typy postów

Zaczynamy od utworzenia dwóch prostych typów postów Authori 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' )
        )
    );
}

Nic szczególnego. W rzeczywistości pochodzi z Kodeksu !

Metaboks

Kontynuujmy, dodając metaboks dla naszego autora do naszego posta w książce:

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

Tutaj możesz zobaczyć funkcję zwrotną, p2p2_book_author_metaboxktóra będzie tym, co jest w naszym metaboksie.

Zawartość metaboksu

Utwórzmy funkcję:

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

Oto gdzie dzieje się magia. Najpierw przeszukamy bazę danych autorów, a następnie <select>wypełnimy wyniki zapytania. Sprawdź Kodeks, aby uzyskać więcej informacji WP_Query. Teraz możesz przejść do typu posta w książce i zobaczyć listę rozwijaną:

Nasza lista rozwijana

Zapisywanie naszych treści

Oczywiście chcemy zapisać nasz wybór, więc dodajemy kolejną funkcję, która zapisze dla nas metabox:

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
}

Teraz idź i zapisz książkę z autorem! Autor książki zostanie zapisany w wp_postmetatabeli bazy danych, a wybraną wartością rozwijaną będzie ta w meta.

Kolumna autora książki

Rozwińmy obszar administracyjny dla naszych książek. Zaczniemy od zmiany kolumn:

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

Ta funkcja zapewnia, że ​​widzimy tylko kolumny tytuł i p2p2_author. Kolumna pola wyboru cb jest potrzebna do funkcji edycji masowej WordPress. Teraz musimy dodać trochę informacji do naszej kolumny. Dodajemy tę funkcję:

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
}

Przełącznik dotyczy każdej kolumny, którą właśnie dodałeś w poprzedniej funkcji. Wypełniasz go echem tego, co chcesz pokazać. Dostajemy posta, który jest autorem naszej książki i tworzymy przyjemny bezpośredni link do jego / jej „strony profilu”. Tak to wygląda:

Nasza kolumna autora

Ciąg dalszy nastąpi

Połączyliśmy dwa typy postów z zaplecza naszej witryny WordPress, ale nie widzimy nic z tego w interfejsie. Będzie to wymagało dużo więcej pracy, ale możliwości są nieskończone. Moglibyśmy:

  1. Sortuj książki według autora
  2. Pokaż listę książek na stronie autora
  3. Pokaż listę innych książek autora na stronie książki
  4. Utwórz fantazyjny metaboks ze zdjęciami autora
  5. Utwórz kolumnę na stronie administratora autora książek, które napisał
  6. I dużo więcej...

Będę kontynuował pracę nad tą odpowiedzią, ponieważ sam potrzebuję tego rozwiązania. Jednak na razie przestanę pracować. Zacznę aktualizować tę odpowiedź jutro.


Dziękujemy za podzielenie się swoją niesamowitą odpowiedzią. Jak pokazałbyś listę książek napisanych przez autora?
William

4

Nie martwiłbym się tym zbytnio, ponieważ kilku świetnych programistów zgłosiło się na ochotnika, aby kontynuować wsparcie . Jeśli jednak chcesz użyć czegoś innego, sprawdź pole relacji ACF .


Pojedyncze linki i rekomendacje wtyczek są uważane za odpowiedzi niskiej jakości. Powód jest prosty: jeśli link zniknie, odpowiedź (i ta strona) cierpi z powodu zgnilizny łącza.
kaiser

3
Rozwiązania wolne od łączy mogą z czasem stać się przestarzałe, a to jest gorsze niż martwe łącza, ponieważ niektórzy ludzie mogą tracić czas na próby wdrożenia tych przestarzałych rozwiązań, nie wiedząc, że już nie działają. Poza tym ACF i jego strona internetowa mogą trwać bardzo długo. Na koniec bardzo dziękuję Bjornowi za tę fantastyczną alternatywę.
drake035

2

Ponieważ pierwotne pytanie brzmi: „Co byś zrobił, gdyby P2P odszedł?” Mam pomysł / sugestię. Naprawdę potrzebowałem, ponieważ jeśli budujesz wtyczkę, mówienie użytkownikom, aby zainstalowali inną wtyczkę, nie zawsze jest wykonalne.

Jedną z prostych metod byłoby użycie Post Meta. Na przykład. W post_meta autora możesz przechowywać książki. Albo jako unikatowe wpisy, pojedyncza pozycja oddzielona przecinkami lub szeregowa tablica. Następnie w książce przechowujesz odwrotne informacje o autorach.

Innym byłoby dodanie nowej tabeli DB (niezadowolonej), która przechowuje relacje i inne istotne informacje.

Nie mam pojęcia, jak wydajne jest każde z tych rozwiązań, ale działają.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.