I have a book category, but now I would like each book could be concatenated with the author profile page. And the tab for the author to show, in addition to text, the list of books he has written.
How can I do it?
1 Answer
To build relationships, I know of two plugins, both very well coded and maintained:
-
Efficient many-to-many connections between posts, pages, custom post types, users.
Advanced Custom Fields - this one would need the add-on Users Select, but as the plugin is being completely rewritten and will change the add-on management, it would be better to wait until version 4.0 is released.
Fully customise WordPress edit screens with powerful fields. Boasting a professional interface and a powerfull API, it’s a must have for any web developer working with WordPress.
But I think a simple plugin can be built for that:
1.
Add a Meta Box in the Posts screen to select an author to the book (not the post author).
/* Define the custom box */
add_action( 'add_meta_boxes', 'authors_meta_box_wpse_89134' );
/* Do something with the data entered */
add_action( 'save_post', 'save_postdata_wpse_89134', 10, 2 );
function authors_meta_box_wpse_89134()
{
add_meta_box(
'sectionid_wpse_89134',
__( 'Book authors' ),
'authors_box_wpse_89134',
'post'
);
}
function authors_box_wpse_89134()
{
global $post;
$selected_user = get_post_meta( $post->ID, 'users_dropdown', true);
$users_list = get_users();
// Use nonce for verification
wp_nonce_field( plugin_basename( __FILE__ ), 'noncename_wpse_89134' );
echo '<div class="element">
<select name="users_dropdown" id="users_dropdown">
<option value="">- Select -</option>';
foreach( $users_list as $user ) {
echo '<option value="'.$user->ID.'" ' . selected( $selected_user, $user->ID, false ) . '>'.$user->data->display_name.'</option>';
}
echo '</select></div>';
}
function save_postdata_wpse_89134( $post_id, $post_object )
{
// verify if this is an auto save routine.
if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE )
return;
// verify this came from the our screen and with proper authorization,
if ( !isset( $_POST['noncename_wpse_89134'] ) || !wp_verify_nonce( $_POST['noncename_wpse_89134'], plugin_basename( __FILE__ ) ) )
return;
// Correct post type
if ( isset( $_POST['post_type'] ) && 'post' != $_POST['post_type'] )
return;
// OK, we're authenticated: we need to find and save the data
//sanitize user input
$u_id = ( isset( $_POST['users_dropdown'] ) ) ? intval( $_POST['users_dropdown'] ) : false;
if( $u_id )
update_post_meta( $post_id, 'users_dropdown', $_POST['users_dropdown'] );
else
delete_post_meta( $post_id, 'users_dropdown' );
}
2.
Display the author's book in the profile and edit user pages
add_action( 'show_user_profile', 'user_books_wpse_89134' );
add_action( 'edit_user_profile', 'user_books_wpse_89134' );
function user_books_wpse_89134( $user )
{
$args = array(
'post_type' => 'post',
'meta_key'=>'users_dropdown',
'meta_value'=>$user->ID,
'meta_compare'=>'='
);
$the_query = new WP_Query( $args );
echo '<h3>'. __('User books') .'</h3>';
while ( $the_query->have_posts() ) :
$the_query->the_post();
echo '<li>' . get_the_title() . '</li>';
endwhile;
}