2014-07-04 6 views
1

친애하는 StackOverflow의 친구, 을 표시하는 방법을 한 페이지에 판매 제품 만 표시하려면이 Woocommerce 단축 코드Woocommerce은 : 만 예약 판매 제품

[sale_products per_page="12"]

를 사용합니다. 이 단축 코드는 완벽하게 작동하며 단순 품목 및 가변 품목 모두 판매중인 제품 만 필터링합니다. 이제

나는 같은 결과를 얻을 싶습니다하지만 난, 즉, 단지 예정 판매 제품을 보여주기 위해 누구의 판매 가격

Wordpress > products > general > sale price > schedule

에 예정되어 내가 차이점을 찾으려고 제품 만 필요 '정상적인 판매 제품'과 '예정된 판매 제품'사이의 출력에서,하지만 불행히도 나는 아무것도 눈치 못 챘다.

도움 주셔서 감사합니다.

여기에 나중에 참조 할 수 있도록 =================================

확인은 완료 작업 코드. @Palmered 누가 내 문제를 해결해 주셔서 감사합니다!

나는 나의 functions.php에이 코드를 추가

/* This creates a Woocommerce shortcode for displaying only scheduled on sale products, both simple and variable ones */ 

function scheduled_sale_products($atts) { 
     global $woocommerce_loop,$wpdb; 

     extract(shortcode_atts(array(
      'per_page'  => '12', 
      'columns'  => '4', 
      'orderby'  => 'title', 
      'order'   => 'asc' 
     ), $atts)); 

     // Get products on sale 
     $product_ids_raw = $wpdb->get_results(
"SELECT posts.ID, posts.post_parent 
FROM `$wpdb->posts` posts 
INNER JOIN `$wpdb->postmeta` ON (posts.ID = wp_postmeta.post_id) 
INNER JOIN `$wpdb->postmeta` AS mt1 ON (posts.ID = mt1.post_id) 
WHERE 
    posts.post_status = 'publish' 
    AND (mt1.meta_key = '_sale_price_dates_to' AND mt1.meta_value >= ".time().") 
    GROUP BY posts.ID 
    ORDER BY posts.post_title ASC LIMIT 0,12"); 

$product_ids_on_sale = array(); 

foreach ($product_ids_raw as $product_raw) 
{ 
    if(!empty($product_raw->post_parent)) 
    { 
     $product_ids_on_sale[] = $product_raw->post_parent; 
    } 
    else 
    { 
     $product_ids_on_sale[] = $product_raw->ID; 
    } 
} 
$product_ids_on_sale = array_unique($product_ids_on_sale); 

     $meta_query = array(); 
     $meta_query[] = WC()->query->visibility_meta_query(); 
     $meta_query[] = WC()->query->stock_status_meta_query(); 
     $meta_query = array_filter($meta_query); 

     $args = array(
      'posts_per_page' => $per_page, 
      'orderby'   => $orderby, 
      'order'    => $order, 
      'no_found_rows'  => 1, 
      'post_status'  => 'publish', 
      'post_type'   => 'product', 
      'meta_query'  => $meta_query, 
      'post__in'   => array_merge(array(0), $product_ids_on_sale) 
     ); 

     ob_start(); 

     $products = new WP_Query(apply_filters('woocommerce_shortcode_products_query', $args, $atts)); 

     $woocommerce_loop['columns'] = $columns; 

     if ($products->have_posts()) : ?> 

      <?php woocommerce_product_loop_start(); ?> 

       <?php while ($products->have_posts()) : $products->the_post(); ?> 

        <?php wc_get_template_part('content', 'product'); ?> 

       <?php endwhile; // end of the loop. ?> 

      <?php woocommerce_product_loop_end(); ?> 

     <?php endif; 

     wp_reset_postdata(); 

     return '<div class="woocommerce columns-' . $columns . '">' . ob_get_clean() . '</div>'; 
    } 
add_shortcode('scheduled_sale_products', 'scheduled_sale_products'); 

이제 새 Woocommerce 단축 코드는

[scheduled_sale_products per_page="12"] 

답변

2

나의 제안을 사용할 준비가되어 있습니다 : 당신에

복사 sale_products 단축 코드 테마 (functions.php) 또는 사용자 정의 플러그인 (plugins 폴더 내의 php 파일). /wp-content/plugins/woocommerce/includes/class-wc-shortcodes.php에서 sales_products라는 전체 기능을 복사하십시오. 그것은 라인 (560)

1 단계 주위에 시작 :

return '<div class="woocommerce columns-' . $columns . '">' . ob_get_clean() . '</div>'; 
} 

public static function sale_products($atts) { 
    global $woocommerce_loop; 

사이

테마 또는 플러그인 속으로 모든 것을 복사합니다.

2 단계 :

function scheduled_sale_products($atts) { 

3 단계

public static function sale_products($atts) { 

에서 함수 선언 변경 : 워드로 단축 코드 후크.

add_shortcode('scheduled_sale_products', 'scheduled_sale_products'); 

4 단계 : 쿼리를 변경합니다.이제이 같은 단축 코드를 사용할 수 있어야

$product_ids_raw = $wpdb->get_results(
"SELECT posts.ID, posts.post_parent 
FROM `$wpdb->posts` posts 
INNER JOIN `$wpdb->postmeta` ON (posts.ID = wp_postmeta.post_id) 
INNER JOIN `$wpdb->postmeta` AS mt1 ON (posts.ID = mt1.post_id) 
WHERE 
    posts.post_status = 'publish' 
    AND (mt1.meta_key = '_sale_price_dates_to' AND mt1.meta_value >= ".time().") 
    GROUP BY posts.ID 
    ORDER BY posts.post_title ASC LIMIT 0,12"); 

$product_ids_on_sale = array(); 

foreach ($product_ids_raw as $product_raw) 
{ 
    if(!empty($product_raw->post_parent)) 
    { 
     $product_ids_on_sale[] = $product_raw->post_parent; 
    } 
    else 
    { 
     $product_ids_on_sale[] = $product_raw->ID; 
    } 
} 
$product_ids_on_sale = array_unique($product_ids_on_sale); 

:

$product_ids_on_sale = wc_get_product_ids_on_sale(); 

으로 :

이 라인을 교체

[scheduled_sale_products per_page="12"] 
+0

무엇 상세한 대답을! @ Pekz0r 감사합니다! 내 코드에 제안을 적용하려했지만 어떤 제품도 볼 수 없습니다. 내 질문을 편집하여 내 단계를 추가하고 아이디어를 올바르게 적용하려고했습니다. 다시 보내 주신 시간에 다시 한번 감사드립니다. – Elena

+0

2 단계와 3 단계에서 실수를 저지른 것이 유감입니다. 게시물을 편집 했으므로 2 단계와 3 단계를 다시 검토하여 위와 같은지 확인하십시오. 그것이 작동하지 않으면 다시 나에게 돌아 가라. – Pelmered

+0

안녕하세요. @Pelmered 다시 감사드립니다! 새 지침에 따라 코드를 편집했습니다. 이제 4 개의 제품을 볼 수 있지만 그 중 하나만 예정된 판매 제품입니다. 다른 제품은 판매중인 제품입니다. 나는 왜 이것이 여기에 나타나는지 다른 사람들이 나타나지 않는지 (그리고이 짧은 코드와 함께 표시되지 않는 다른 판매 제품 및 기타 예정된 판매 제품이 있는지)를 모른다. 표시된 항목 사이의 연관성을 찾으려고 노력 중입니다! – Elena

관련 문제