Take the 2-minute tour ×
WordPress Development Stack Exchange is a question and answer site for WordPress developers and administrators. It's 100% free, no registration required.

I want to make selecting a featured post is just by checking a checkbox in edit screen AND be able to retrieve these featured articles from only specific category ?

in short what I'm looking for :

  • set featured post

  • loop throw featured posts in a specific category (not all posts)

Any help? and thanks in advance :)

share|improve this question

1 Answer 1

You can do this by following these steps:

  1. Add a custom meta box to your posts
  2. Create a function to save the meta data using the save_post action
  3. Add the 'meta_key' query argument to whatever query you are using.

Place this in your functions.php file:

function register_post_assets(){
    add_meta_box('featured-post', __('Featured Post'), 'add_featured_meta_box', 'post', 'advanced', 'high');
}
add_action('admin_init', 'register_post_assets', 1);

function add_featured_meta_box($post){
    $featured = get_post_meta($post->ID, '_featured-post', true);
    echo "<label for='_featured-post'>".__('Feature this post?', 'foobar')."</label>";
    echo "<input type='checkbox' name='_featured-post' id='featured-post' value='1' ".checked(1, $featured)." />";
}

function save_featured_meta($post_id){
    // Do validation here for post_type, nonces, autosave, etc...
    if (isset($_REQUEST['featured-post']))
        update_post_meta(esc_attr($post_id, '_featured-post', esc_attr($_REQUEST['featured-post']))); 
        // I like using _ before my custom fields, so they are only editable within my form rather than the normal custom fields UI
}
add_action('save_post', 'save_featured_meta');

Then in your template file use the following for the main loop:

    $args = array(
        'meta_key' => '_featured-post', // include underscore prefix in key name
        'meta_value' => 1
    );
    // The number of posts displayed would be determined under Settings->Reading
    query_posts($args);

    if(have_posts()): while(have_posts()): the_post();
        // Do your bidding here

    endwhile; else:

    endif;

FOR EXAMPLE PURPOSES ONLY: For custom loops (If running multiple loops on one page), you would use this:

    $args = array(
        'posts_per_page' => 5,
        'meta_key' => '_featured-post',
        'meta_value' => 1
    );

    $featured = new WP_Query($args);

    if ($featured->have_posts()): while($featured->have_posts()): $featured->the_post();
        the_title();
        the_content();
    endwhile; else:

    endif;
share|improve this answer
    
Why would you run a second (new) WP Query? Wouldn't it be enough to check the meta value? –  kaiser Sep 18 '11 at 3:01
1  
I never said to create a second loop. I was showing him for example purposes if he were to run multiple loops on one page. Codex says to use query_posts for the main loop and new WP_Query for a second custom loop. The misunderstanding didn't deserve a -1. :) –  Brian Fegter Sep 18 '11 at 3:21
    
Reversed. Btw: Take a look at this answer. It should also be noted that the maybe best choice is to use filters for modifying the Query. –  kaiser Sep 18 '11 at 5:08
    
I would assume that most implementation of "featured" posts would use a secondary loop, rather than the primary Loop - usually in the form of a list of featured posts, or a slider that displays the featured posts, etc. –  Chip Bennett Oct 19 '11 at 16:43
    
Just a note about the code that goes on functions.php, I think it needs an extra ")" on line 15. Possible? –  Peanuts Jul 4 '13 at 17:13

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

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