Como conectar diferentes CPTs juntos?

10

Espero que esta questão tenha o seu lugar aqui.

Eu sempre achei que conectar diferentes tipos de postagem personalizada é uma necessidade bastante comum, como em exemplos populares de uso de taxonomia personalizada (livros / autores / títulos, filmes / atores / diretores, etc.). Eu pessoalmente uso "Posts 2 Posts", mas o suporte parou.

No Google, os resultados mais relevantes apontam para esse plug-in no momento. Quais alternativas a 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?

    
por drake035 12.01.2014 / 23:35

3 respostas

10

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 divertido.

Os tipos de postagens

Começamos criando dois tipos de postagem simples, Author e 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á. Na verdade, é do Codex !

O metabox

Vamos continuar adicionando um metabox para nosso autor ao tipo de postagem do nosso 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_metabox , que será o conteúdo do nosso 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 o banco de dados para autores e, em seguida, preenchemos um <select> com nossos resultados de consulta. Verifique o Codex para saber mais sobre WP_Query . Agora você pode acessar o tipo de publicação do seu livro e ver sua lista suspensa:

Salvandonossoconteúdo

Claroquequeremossalvarnossaseleção,entãoadicionamosoutrafunçãoquesalvaráometaboxparanós:

add_action('save_post','p2p2_save_author_metabox',1,2);functionp2p2_save_author_metabox($post_id,$post){//Don'twannasavethisnow,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;//Wedowanttosave?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, salve um livro com um autor! O autor do livro será salvo na tabela de banco de dados wp_postmeta e o valor selecionado da lista suspensa será aquele na meta.

Uma coluna de autor para livro

Vamos expandir a área de administração dos 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;
}

Esta função garante que apenas vemos o título das colunas e p2p2_author. A coluna da caixa de seleção cb é 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
}

O comutador é para cada coluna que você acabou de adicionar na função anterior. Você preenche isso ecoando o que você quer mostrar. Recebemos o post que é o autor do nosso livro e criamos um bom permalink para a "página de perfil" dele / dela. É assim que parece:

Continua

Conectamos dois tipos de post no backend do nosso site WordPress, mas não conseguimos ver nada disso no frontend. Vai precisar de muito mais trabalho para conseguir isso, mas as possibilidades são um tanto infinitas. Nós 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 de fantasia com fotos do autor
  5. Crie uma coluna na página de administração do autor dos livros que ele / ela escreveu
  6. E muito mais ...

Eu continuarei trabalhando nesta resposta, pois eu mesmo preciso dessa solução. No entanto, vou parar de trabalhar por enquanto. Vou começar a atualizar esta resposta amanhã.

    
por Scuba Kay 23.01.2014 / 01:48
4

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

    
por Bjorn 19.01.2014 / 08:26
2

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

Um método simples seria usar o Post Meta. Por exemplo. No post_meta de autor, você pode armazenar os livros. Como entradas exclusivas ou uma entrada separada por vírgula única ou uma matriz serializada. Então, no livro, você armazena a informação inversa de Autor (es).

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

Não há ideia de como a solução é eficiente em escala, mas funciona.

    
por Jeff Rose 21.01.2014 / 01:28