Try with this:
<?php
$args = array(
'post_type' => 'product',
'post_status' => 'publish',
'meta_key' => 'views',
'orderby' => 'meta_value_num',
'order'=> 'DESC', // sort descending
);
// Custom query.
$query = new WP_Query( $args );
// Check that we have query results.
if ( $query->have_posts() ) {
// Start looping over the query results.
while ( $query->have_posts() ) {
$query->the_post();
$comma_char = ($query->current_post + 1) < ($query->post_count) ? "," : "";//add comma if not last post
printf('<a href="https://wordpress.stackexchange.com/questions/256777/%s" class="link">%s</a>' . $comma_char, get_permalink(), get_the_title());
}
}
// Restore original post data.
wp_reset_postdata();
?>
as for the second question (its 1 question for post by the way), looks like a standard WordPress query, its kind of hard to say how it can be improved without knowing the details about it.