I'm looking for a way to have multiple categories checked by default when creating a new post. The built-in function at Settings -> Writing only allows for one, which unfortunately doesn't suit my needs.

I have a similar functionality in my functions.php that automatically sets the default template:

// Set guest post to default page template
function set_default_page_template() {
    global $post;
    if ( 'post' == $post->post_type 
        && 0 != count( get_page_templates( $post ) ) 
        && '' == $post->post_template // Only when page_template is not set
    ) {
        $post->page_template = "page-templates/template-guest-post.php";
add_action('add_meta_boxes', 'set_default_page_template', 1);

I've played around with it trying to apply the same principle to my categories, but unfortunately to no avail so far. Any help or pointers would be much appreciated!

Thanks so much and all the best,


  • Do you want them pre-checked in the HTML (giving the author the choice to uncheck them at will) or force them onto the post? – kero Apr 3 '18 at 9:44

The filter you're looking for is called wp_terms_checklist_args and is used by wp_terms_checklist() (which is internally called to display the category metabox).

You can use this to pre-selected specific categories (by ID) under certain circumstances as shown in this example

add_filter('wp_terms_checklist_args', 'WPSE_pre_select_categories', 10, 2);
function WPSE_pre_select_categories($args, $post_id) {
        $post = get_post($post_id);

        // only pre select categories for new posts
        if ($post->post_status !== 'auto-draft' || $post->post_type !== 'post')
                return $args;

        // select categories with ID 4 and 6
        $select_categories = [4, 6];

        // little hack so array_merge() works if default is NULL
        if (empty($args['selected_cats'])) {
                $args['selected_cats'] = [];

        // array_merge() with numerical indices only appends
        // so I use array_unique() to remove any duplicates
        $args['selected_cats'] = array_unique(array_merge($args['selected_cats'], $select_categories));
        return $args;
  • 1
    To answer your question above: I was looking to have them pre-checked in HTML, so this is indeed exactly what I was looking for. Works like a charm, thanks so much for your help! – Segia Apr 3 '18 at 10:05
  • You are very welcome, glad I could help – kero Apr 3 '18 at 10:09

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.