Como conectar CPTs diferentes?

11

Espero que esta pergunta tenha seu lugar aqui.

Eu sempre pensei que conectar diferentes tipos de postagem personalizados é uma necessidade bastante comum, como nos exemplos tutoriais populares de uso de taxonomia personalizada (livros / autores / títulos, filmes / atores / diretores etc.). Eu pessoalmente uso "Postagens 2 Postagens", mas o suporte foi interrompido.

No Google, os resultados mais relevantes apontam para este plugin no momento. Quais alternativas de longo prazo existem? O que um desenvolvedor web experiente do WordPress usaria para criar um sistema de gerenciamento de livros / autores / títulos com o WordPress hoje, se o plugin P2P estiver concluído?

drake035
fonte
Qual código você usou para criar os tipos de postagem personalizados? Você pode adicionar suporte para a criação de tipos de taxonomia personalizado usando este código wordpress.stackexchange.com/a/128544/9884
Brad Dalton
11
Eu acho que um grande número de pessoas ainda usa o p2p, então não consigo vê-lo falhando tão cedo quanto alguém pode simplesmente bifurcar e mantê-lo no github. Se o suporte foi descartado, suponho que apenas significa que o scribu está trabalhando em algo novo ou a funcionalidade pode estar entrando no núcleo. Eu não vejo isso como uma razão para não usá-lo.
precisa saber é o seguinte
11
Não tenho tanta certeza, sancho. O P2P possui apenas 55.000 downloads na página de plugins do WP, muito menos popular do que eu pensava. E não entendo o porquê, novamente, porque conectar os CPTs me parece uma necessidade muito básica e comum. Como um plug-in que aborda apenas algo tão básico pode ter apenas 55.000 downloads? Isso está além de mim. A única explicação é que há outra boa maneira de resolver isso, daí a minha pergunta.
precisa saber é o seguinte
3
Você pode continuar usando este plug-in e, se o plug-in falhar de alguma forma, poderá bifurcar o repositório e mantê-lo: github.com/scribu/wp-posts-to-posts.git Citar o repositório :If you want to help maintain the plugin, fork it on github and open pull requests.
Scuba Kay
4
Votou com sucesso e estrelou esta pergunta porque acho o HABTM no WordPress realmente interessante. Dito isto, eu não iria suar muito o plugin, Mark Jaquith se ofereceu para ajudar a mantê-lo em funcionamento . E enquanto alguns plugins do WP podem ter 300.000 downloads ou o que for, muitos não têm 472 estrelas no github. Para mantê-lo vivo, esse é o número que conta!
Will

Respostas:

13

Como programador, começaria a escrever meu próprio código para conectar meus tipos de postagem. Não é uma maneira rápida, não é fácil, mas é muito divertida.

Os tipos de postagem

Começamos criando dois tipos simples de postagem Authore 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' )
        )
    );
}

Nada extravagante lá. De fato, é do Codex !

O metabox

Vamos continuar adicionando uma metabox para nosso autor ao nosso tipo de postagem de livro:

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

Aqui você pode ver uma função de retorno de chamada p2p2_book_author_metaboxque será o que está dentro da nossa metabox.

O conteúdo do metabox

Vamos criar a função:

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

Aqui é onde a mágica acontece. Primeiro, vamos consultar os autores no banco de dados e, em seguida, preencheremos um <select>com os resultados da consulta. Verifique o Codex para mais informações WP_Query. Agora você pode acessar o tipo de postagem do livro e ver o menu suspenso:

Nosso menu suspenso

Salvando nosso conteúdo

É claro que queremos salvar nossa seleção e adicionar outra função que salvará a metabox para nós:

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
}

Agora vá e salve um livro com um autor! O autor do livro será salvo na wp_postmetatabela do banco de dados e o valor selecionado da lista suspensa será o da meta.

Uma coluna de autor para livro

Vamos expandir a área administrativa de nossos livros. Começaremos alterando as colunas:

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

Essa função garante que apenas vejamos o título das colunas e p2p2_author. A coluna cb checkbox é necessária para a funcionalidade de edição em massa do WordPress. Agora precisamos adicionar algumas informações à nossa coluna. Nós adicionamos esta função:

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
}

A opção é para todas as colunas que você acabou de adicionar na função anterior. Você o preenche repetindo o que deseja mostrar. Recebemos o post que é o autor do nosso livro e criamos um link permanente para sua 'página de perfil'. Isto é o que parece:

Nossa coluna de autor

Continua

Conectamos dois tipos de postagem no back-end do nosso site WordPress, mas não podemos ver nada disso no front-end. Será necessário muito mais trabalho para conseguir isso, mas as possibilidades são um pouco infinitas. Poderíamos:

  1. Classificar livros por autor
  2. Mostrar uma lista de livros na página do autor
  3. Mostrar uma lista de outros livros do autor na página do livro
  4. Crie um metabox sofisticado com fotos do autor
  5. Crie uma coluna na página de administração do autor para os livros que ele escreveu
  6. E muito mais...

Continuarei trabalhando nessa resposta, pois preciso dessa solução. No entanto, vou parar de trabalhar por enquanto. Começarei a atualizar esta resposta amanhã.

Mergulho Kay
fonte
Obrigado por compartilhar sua resposta incrível. Como você mostraria uma lista de livros escritos pelo autor?
William
4

Eu não me preocuparia muito com isso, pois alguns grandes desenvolvedores se ofereceram para continuar o suporte . No entanto, se você quiser usar outra coisa, consulte o campo de relacionamento do ACF .

Bjorn
fonte
Links solitários e recomendações de plug-ins são consideradas respostas de baixa qualidade. O motivo é simples: se o link desaparecer, a resposta (e este site) sofrerá com a podridão do link.
Kaiser #
3
As soluções sem links também podem se tornar obsoletas ao longo do tempo, e isso é pior do que links inoperantes, porque algumas pessoas podem perder tempo tentando implementar essas soluções obsoletas sem saber que não funcionam mais. Além disso, a ACF e seu site provavelmente durarão muito tempo. Finalmente, muito obrigado Bjorn por esta alternativa fantástica.
drake035
2

Como a pergunta original é "O que você faria se o P2P desaparecesse?" Eu tenho um pensamento / sugestão. Na verdade, eu precisava, porque se você está construindo um plugin, não é sempre viável dizer aos usuários para instalar outro plugin.

Um método simples seria usar o Post Meta. Por exemplo. No post_meta do autor, você pode armazenar os livros. Como entradas exclusivas ou uma única entrada separada por vírgula ou uma matriz serializada. Em seguida, no livro, você armazena as informações inversas do (s) autor (es).

Outra seria adicionar uma nova tabela de banco de dados (desaprovada) que armazena os relacionamentos e outras informações pertinentes.

Não faço ideia de quão eficiente é a solução em escala, mas elas funcionam.

Jeff Rose
fonte