Thomas Burrows
Thomas Burrows

Reputation: 37

How To Filter and Display ONLY Simple WooCommerce Products using Shortcode

I have a functional shortcode that outputs all products. Problem is, I need this to only "find" simple products.

add_shortcode('product_list', 'simple_product_list');
function simple_list_shortcode() {
$query = new WP_Query( array(
'posts_per_page' => -1,
'post_type' => 'product',
'post_status' => 'publish',
'hide_empty' => 0,
'orderby' => 'title',
'post_id' => 'id'));
$output = '<ul style="list-style-type:none">';
while ( $query->have_posts() ) : $query->the_post();
$product = wc_get_product($query->post->ID);
$price = $product->get_regular_price();
$output .= '<li>' . $query->post->post_title . ' costs '.wc_price($price) . ', <a class="atc" href="'. $product->add_to_cart_url() .'">order now</a>.</li>';
endwhile;
wp_reset_postdata();
return $output.'</ul>';
}

Since it is already using 'post_type' => 'product', I cannot add another with simple.

I tried using a if statement for ->is_type('simple'), but doing so turned the page white and nothing is displayed.

Upvotes: 1

Views: 212

Answers (1)

theboss_dev
theboss_dev

Reputation: 1196

Your shortcode callback function and your actual function name is different.

You can get product type using $product->get_type() function.

UPDATE 1: Using WP_Query().

add_shortcode('product_list', 'simple_list_shortcode');
function simple_list_shortcode()
{

    ob_start();
    $query = new WP_Query(array(
        'posts_per_page' => -1,
        'post_type' => 'product',
        'post_status' => 'publish',
        'hide_empty' => 0,
        'orderby' => 'title',
        'post_id' => 'id'
    ));
    $output = '<ul style="list-style-type:none">';
    while ($query->have_posts()) : $query->the_post();
        $product = wc_get_product($query->post->ID);
    if($product->get_type() == 'simple'){
        $price = $product->get_regular_price();
        $output .= '<li>' . $query->post->post_title . ' costs ' . wc_price($price) . ', <a class="atc" href="' . $product->add_to_cart_url() . '">order now</a>.</li>';
        }
    endwhile;
    wp_reset_postdata();
    echo $output . '</ul>';
    $contents = ob_get_clean();
    return $contents;
}

UPDATE 2: you can also use wc_get_products() function to get products with arguments.

add_shortcode('product_list', 'simple_product_list');
function simple_product_list()
{
    $arg = array(
        'type' => 'simple',
        'orderby' => 'date',
        'order' => 'DESC',
    ) ;
    $products = wc_get_products($arg);
   ob_start();
    $output = '<ul style="list-style-type:none">';
     foreach( $products as  $product){     
         $price = $product->get_regular_price();
        $output .= '<li>' .  $product->get_name() . ' costs ' . wc_price($price) . ', <a class="atc" href="' . $product->add_to_cart_url() . '">order now</a>.</li>';
    }
    echo  $output . '</ul>';
    $contents = ob_get_clean();
    return $contents;
}

Upvotes: 3

Related Questions