I run a multiple author platform and to improve the moderation, I want to add a couple of assisting editors. I want to add a custom box to the Post page where the assisting editor can confirm which tasks they have completed.
So, this box would contain a checklist of options, for example:
1 => ' Proofread ', 2 => ' Graphics Added ', 3 => ' SEO Fixed ', 4 => ' Ready for Publish '
And then contain a checklist that lists all assisting editors (users that can edit_published_posts
) and there the user can mark themselves as they have contributed to the edit.
The box could look like this:
Then finally, on the front end post page, I want to list which user(s) that have edited the post.
In an attempt to do this, I have this code:
add_action( 'add_meta_boxes', 'assisting_editor' );
function assisting_editor() {
add_meta_box(
'assisting_editor', // id, used as the html id att
__( 'Editorial Tasks' ), // meta box title
'editor_tasks', // callback function, spits out the content
'post', // post type or page. This adds to posts only
'side', // context, where on the screen
'low' // priority, where should this go in the context
);
}
function editor_tasks( $post ) {
global $wpdb;
$value = get_post_meta($post->ID, 'rating', true);
echo '<div class="misc-pub-section misc-pub-section-last"><span id="timestamp"><label>Editorial tasks: </label>';
$ratings = array(
1 => ' Proofread ',
2 => ' Graphics Added ',
3 => ' SEO Fixed ',
4 => ' Ready for Publish '
);
echo '<select name="rating">';
echo '<option value=""' . ((($value == '') || !isset($ratings[$value])) ? ' selected="selected"' : '') . '> Untouched </option>';
// output each rating as an option
foreach ($ratings as $id => $text) {
echo '<option value="' . $id . '"' . (($value == $id) ? ' selected="selected"' : '') . '">' . $text. '</option>';
}
echo '</select>';
echo '</span></div>';
}
add_action( 'save_post', 'save_metadata');
function save_metadata($postid)
{
if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) return false;
if ( !current_user_can( 'edit_page', $postid ) ) return false;
if( empty($postid) ) return false;
if ( is_null($_REQUEST["rating"]) ) {
delete_post_meta($postid, 'rating');
} else {
update_post_meta($postid, 'rating', $_REQUEST['rating']);
}
}
However, this code adds a drop-down list, not a check-list, and more importantly, it does not list the editor users.
My question is: how can I make a box like the picture above and with those features, and how do I echo the list of users that have edited the post?
add_meta_box
should give you the box container like your have pictured.You have a select drop-down because that is what you created here:
You need a series of checkboxes. Of the code above you only need the
foreach
. Checkboxes work differently that selects. The following will give you four different values that you need to save, one for each element of your$ratings
array.You can put all of the checkboxes in an array by naming them like this:
In the first case you will have to modify your update function. In the second, I believe your function will work but I am not 100% sure.
To get your list of authors you want to use
get_users
with thewho
parameter set to ‘authors’ which will, per the codex, return “user level greater than 0”. That is, everyone who isn’t a subscriber– authors, editors, contributors, etc. So…Another check to see if any any authors are already selected.
And then a
foreach
to create the checkboxes, much like the one above for$ratings
. You want that last parametertrue
only if you save as a single entry in the DB, which probably makes sense in this case.And of course another
update_post_meta
block to save the fields.I think that’s got it.
Also, you are passing dirty data into these function. I won’t lecture but look up “data validation” and “data sanitization” . 🙂
Here is the whole thing with a couple of typo corrections and bug fixes. Our editors have bugged me for something similar so I mocked it up :). The formatting is non-existent but it works. I tested it as a plugin, so build yourself a plugin header. I don’t know if it will work from
function.php
.The
add_filter
will display authors automatically. To display the authors manually use the following inside the Loop:I am going to leave it to you to work out formatting and other bells and whistles. I think this question has now been more than adequately answered.