Como programador, comenzaría a escribir mi propio código para conectar mis tipos de publicación. No es una forma rápida, no es fácil, pero es muy divertido.
Los tipos de publicación
Comenzamos creando dos tipos de publicaciones simples, Author
y 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 de lujo allí. De hecho, ¡es del códice !
El metabox
Continuemos agregando un metabox para nuestro autor al tipo de publicación de nuestro libro:
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')
);
}
Aquí puede ver una función de devolución de llamada p2p2_book_author_metabox
que será lo que está dentro de nuestro metabox.
El contenido del metabox
Vamos a crear la función:
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>";
}
Aquí es donde ocurre la magia. Primero, consultaremos la base de datos de los autores y luego rellenaremos un <select>
con los resultados de nuestra consulta. Consulte el Codex para obtener más información sobre WP_Query
. Ahora puede ir al tipo de publicación de su libro y ver su menú desplegable:

Guardandonuestrocontenido
Porsupuesto,queremosguardarnuestraselección,asíqueagregamosotrafunciónqueguardaráelmetaboxparanosotros:
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
}
¡Ahora ve y guarda un libro con un autor! El autor del libro se guardará en la tabla de base de datos wp_postmeta
y el valor seleccionado de la lista desplegable será el que aparece en el meta.
Una columna de autor para el libro
Expandamos el área de administración de nuestros libros. Comenzaremos cambiando las columnas:
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 función se asegura de que solo veamos el título de las columnas y el autor p2p2. La columna de la casilla de verificación cb es necesaria para la funcionalidad de edición masiva de WordPress. Ahora necesitamos agregar algo de información a nuestra columna. Añadimos esta función:
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
}
El interruptor es para cada columna que acaba de agregar en la función anterior. Lo llenas haciendo eco de lo que quieres mostrar. Recibimos la publicación que es el autor de nuestro libro y creamos un buen enlace permanente a su 'página de perfil'. Esto es lo que parece:
Continuará
Conectamos dos tipos de publicaciones en el backend de nuestro sitio de WordPress, pero no podemos ver nada de eso en la interfaz. Necesitará mucho más trabajo para lograr esto, pero las posibilidades son algo infinitas. Podríamos:
- Ordenar los libros por autor
- Mostrar una lista de libros en la página del autor
- Mostrar una lista de otros libros del autor en la página del libro
- Crea un metabox elegante con imágenes del autor
- Cree una columna en la página de administración del autor para los libros que escribió
- Y mucho más ...
Seguiré trabajando en esta respuesta, ya que necesito esta solución yo mismo. Sin embargo, voy a dejar de trabajar en por ahora. Empezaré a actualizar esta respuesta mañana.