First, I recomend you to use pre_get_post hook for your purpose. If you are going to use only the new WP_Query in your theme, it has no sense that WordPress run a query before it gets your theme becuause it would be a extra work that will be discarded. Using pre_get_posts we can alter the main query to fit our purpose and get what we want without executing another query.
Thats said. Here an example code:
//Functions for filters
add_action( 'pre_get_posts', 'properties_pre_get_post' );
function properties_pre_get_post($query){
//limit to frontend, to the main query and to home page
if($query->is_main_query() && !is_admin() && is_home() ) {
//the main query to get only sticky posts
$query->set('post__in',get_option( 'sticky_posts' ));
}
}
Put that code in functions.php and in your home.php template file you can run the loop as usual.
Custom post types has not support for built-in ‘sticky’ feature but you can create, for example, a tag or taxonomy term and filter by this tag. For example, if you custom post type support post_tags taxonomy you can created a term called ‘featured’ and attach each post you want to this tag and filter:
//Functions for filters
add_action( 'pre_get_posts', 'my_pre_get_post' );
function my_pre_get_post($query){
//limit to main query, frontend and home page
if($query->is_main_query() && !is_admin() && is_home() ) {
$tax_query = array (
'taxonomy'=> array('post_tags'),
'field' => 'slug',
'terms' => 'featured',
);
$query->set('tax_query',$tax_query);
//filter also by your custom post type
$query->set('post_type','listings');
}
}