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:
- Classificar livros por autor
- Mostrar uma lista de livros na página do autor
- Mostrar uma lista de outros livros do autor na página do livro
- Crie um metabox de fantasia com fotos do autor
- Crie uma coluna na página de administração do autor dos livros que ele / ela escreveu
- 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ã.