How to Set an Individual Homepage for Each User?

Found and combined some code that seems to work for categories. So leaving the code if somebody else runs into the same problem. For reference.
Filter all queries with a specific taxonomy
Adding Custom User Profile data based upon Categories

The below allows a user to choose categories on this profile, after which the frontpage will allow show his selected categories.

//create the user category fields
add_action( 'show_user_profile', 'add_user_categories' );
add_action( 'edit_user_profile', 'add_user_categories' );

function add_user_categories($user ){
    ?>
    <table class="form-table">
    <tr>
        <th><label for="user_categories"><?php _e("User categories"); ?></label></th>
        <td>
            <?php
                $data = get_the_author_meta( 'user_categories', $user->ID );
                $args = array( 'hide_empty' =>0, 'taxonomy'=> 'category');
                $categories=  get_categories($args);
                if ($categories){
                    foreach ( $categories as $category ){ 
                        if(in_array($category->term_id,(array)$data)) {
                            $selected = 'checked="checked""';
                        } else {
                            $selected = '';
                        }
                        echo '<input name="user_categories[]" value="'.$category->term_id.'" '.$selected.' type="checkbox"/>'.$category->name.'<br/>';
                    }
                }
            ?>
        </td>
    </tr>
    </table>
    <?php
}

//save the user category fields 
add_action( 'personal_options_update', 'save_user_categories' );
add_action( 'edit_user_profile_update', 'save_user_categories' );

function save_user_categories( $user_id ){
    if ( !current_user_can( 'edit_user', $user_id ) ) { return false; }
    update_usermeta( $user_id, 'user_categories', $_POST['user_categories'] );
}

function my_get_posts( $query ) {
    // we only need to modify the query for logged in users
    if ( !is_user_logged_in() ) return;
    $current_user = wp_get_current_user();
    // assuming that the users interest is stored as user_categories meta key
    $user_categories = get_user_meta( $current_user->ID, 'user_categories', true );
    $query->set( 'tax_query', array(
        array(
            'taxonomy' => 'category',
            'field' =>  'id',
            'terms' => $user_categories
        )
    ));
    return $query;
}
add_filter( 'pre_get_posts', 'my_get_posts' );

Leave a Comment