Leave a Reply

1 comment

  1. 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:

    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>';
    

    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.

    foreach ($ratings as $id => $text) {
        echo '<input type="checkbox" name="'.strtolower($text).'" value="' . $id . '"' . (($value == $id) ? ' selected="selected"' : '') . '"/><label for"'.strtolower($text).'">'.$text.'</label>';
    }
    

    You can put all of the checkboxes in an array by naming them like this:

    foreach ($ratings as $id => $text) {
        echo '<input type="checkbox" name="ratings[]" value="' . $id . '"' . (($value == $id) ? ' selected="selected"' : '') . '"/><label for"ratings[]">'.$text.'</label>';
    }
    

    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 the who 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…

    $alleds = get_users('who=authors');
    

    Another check to see if any any authors are already selected.

    $currenteds = get_post_meta($post->ID, 'currenteds', true);
    

    And then a foreach to create the checkboxes, much like the one above for $ratings. You want that last parameter true only if you save as a single entry in the DB, which probably makes sense in this case.

    foreach ($alleds as $ed) {
        $checked = (in_array($ed->ID,$currenteds)) ? 'checked="checked"' : '';
        echo '<input type="checkbox" name="currenteds[]" value="' . $ed->ID . '"' . $checked . '"/><label for"ratings[]">'.$ed->user_nicename.'</label>';
    }
    

    And of course another update_post_meta block to save the fields.

    if ( is_null($_REQUEST["currenteds"]) ) {
        delete_post_meta($postid, 'currenteds');
    } else {
        update_post_meta($postid, 'currenteds', $_REQUEST['currenteds']);
    }
    

    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.

    // author checkboxes
    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, 'ratings', 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 '
        );
    
        foreach ($ratings as $id => $text) {
        $checked = (in_array($id,(array)$value)) ? ' checked="checked"' : '';
        echo '<input type="checkbox" name="ratings[]" value="' . $id . '"'.  $checked . '/><label for="ratings[]">'.$text.'</label>';
        }
    
        $qry['relation'] = 'OR';
        $qry[] = array(
          'key' => $wpdb->prefix.'capabilities',
          'value' => 'editor',
          'compare' => 'like'
        );
        $qry[] = array(
          'key' => $wpdb->prefix.'capabilities',
          'value' => 'administrator',
          'compare' => 'like'
        );
        $qry = array('fields' => 'all_with_meta','meta_query'=>$qry);
    
        $alleds = get_users($qry);
    
        $currenteds = get_post_meta($post->ID, 'currenteds', true);
    
        foreach ($alleds as $ed) {
        $checked = (in_array($ed->ID,(array)$currenteds)) ? ' checked="checked"' : '';
        echo '<input type="checkbox" name="currenteds[]" value="' . $ed->ID . '"' .$checked . '"/><label for="ratings[]">'.$ed->user_nicename.'</label>';
        }
        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["ratings"]) ) {
            delete_post_meta($postid, 'ratings');
        } else {
            update_post_meta($postid, 'ratings', $_REQUEST['ratings']);
        }
    
        if ( is_null($_REQUEST["currenteds"]) ) {
        delete_post_meta($postid, 'currenteds');
        } else {
        update_post_meta($postid, 'currenteds', $_REQUEST['currenteds']);
        }
    }
    
    function display_current_eds($ID = '') {
      if (empty($ID)) {
        global $post;
        if (!empty($post)) {
          $ID = $post->ID;
        }
      }
      if (empty($ID)) return false;
      $eds = get_post_meta($post->ID,'currenteds',true);
      if (!empty($eds)) {
        foreach ($eds as $e) {
          $edu = get_userdata($e);
          $edusers[] = sprintf(
            '<a href="%1$s" title="%2$s" rel="author">%3$s</a>',
            get_author_posts_url( $edu->ID, $edu->user_nicename ),
            esc_attr( sprintf( __( 'Posts by %s' ), $edu->user_nicename ) ),
            $edu->user_nicename
          );
        }
        return $edusers;
      }
      return false;
    }
    
    function authors_content_filter($content) {
      $authors = display_current_eds();
      if (false !== $authors) {
        $content .= implode(', ',$authors);
      }
      return $content;
    }
    add_filter('the_content','authors_content_filter');
    
        // add author checkboxes
    

    The add_filter will display authors automatically. To display the authors manually use the following inside the Loop:

    $edusers = display_current_eds();
    if (false !== $edusers) {
        echo implode(', ',$edusers);
    }
    

    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.