iT邦幫忙

第 12 屆 iT 邦幫忙鐵人賽

DAY 25
0
自我挑戰組

Wordpress 外掛開發系列 第 25

「Wordpress 外掛開發」商品巢狀表完結篇

再續前緣,我們今天要完成是在product-page之中的正常顯示,以及在我們的title之中,顯示我們所屬的母目錄。

判斷是否在subcategory

我們可以使用get_query_var( 'taxonomy' )來判斷是否為subcategories,在shop之中,是不會有任何的東西回返的,而在進入到我們的子項目之中,我們會開始出現第二頁面;今天是試刀的第二天,馬上遇到了大亂流,我們主要使用的parent_id應該為該目錄的term id,但是在使用get_category卻沒有東西回傳來,我在這找到是一直想不通為什麼call不回來,直到忽然想到,哭啊用get_queried_object就是把母目錄給call回來,真的是太傻了...

if ( get_query_var( 'taxonomy' ) ) {
  //加入我們需要的變動程式碼
}

在子目錄中,加入自己

我們在點擊之後,可以看見我們的頁面並沒有顯示我們母目錄的列表,而我們能做到的事,將本身的WP_TERM加入進我們的陣列之中,今天我花了三個鐘頭在研究那個該死不熟悉的array get category,本當初是想要放棄直接寫sql來找,自己寫關聯了,wooCommerce真心奉勸,開發的文件真的東缺西缺的,用起來特別累,沒有特別的原因,因為每個模板拆的很零碎,你也不容易找到到底是在哪個loop之中運作。

$option = array(
  'child_of' => $parent_id,
  'taxonomy' => 'product_cat',
  'orderby' => 'name',
  'order' => 'ASC'
) ;

$product_categories = get_categories( $option );
if ( get_query_var( 'taxonomy' ) ) {
  array_unshift($product_categories,$term);
}

輸出的分別

我們在我們的輸出欄位之中,與昨天依樣,因為要讓邏輯一致,所以使用wc_get_template_part來處理,並且掛起wp_query來做,但是現在如果要與母目錄分開,則需要另類的分類,而我們設計最原始的設計,加入$index來計算是否是第一位來顯示是否顯示他的母目錄,而這個條件我們只會觸發在子目錄的頁面。

  $index = 1;
  foreach ($product_categories as $product_category) {
    if ( get_query_var( 'taxonomy' ) && 1 !== $index) {
      echo '<h2>'.$term->name.' - '.$product_category->name.'</h2>';
    }else{
      echo '<h2>'.$product_category->name.'</h2>';
    }
  $index++;

來看看成果

最後完成後,我們可以看到程式碼與畫面應該顯示成這樣,雖然這個小程式還有count的物提要解決,不過都不是太大的問題了,今天浪費了很多時間在查文件,明天mutiple先暫緩一天,我們來講講那個讓人無法理解的get_categories與args的愛恨糾葛,到底為何原生的categories連個基本的join都沒辦法做到XD

<?php 
  // woocommerce_content();
    if ( is_singular( 'product' ) ) {

    while ( have_posts() ) :
      the_post();
      wc_get_template_part( 'content', 'single-product' );
    endwhile;

  } else {
      
    if ( apply_filters( 'woocommerce_show_page_title', true ) ) : ?>
      <h1 class="woocommerce-products-header__title page-title"><?php woocommerce_page_title(); ?></h1>
    <?php endif; ?>
  
    <?php
    do_action( 'woocommerce_archive_description' );
    ?>
  </header>
  <?php
  if ( woocommerce_product_loop() ) {
  
    do_action( 'woocommerce_before_shop_loop' );
    $term 			= get_queried_object();
    $parent_id 		= empty( $term->term_id ) ? 0 : $term->term_id;
    
    $option = array(
      'child_of' => $parent_id,
      'taxonomy' => 'product_cat',
      'orderby' => 'name',
      'order' => 'ASC'
    ) ;

    $product_categories = get_categories( $option );
    if ( get_query_var( 'taxonomy' ) ) {
      array_unshift($product_categories,$term);
    }
    
    if(empty($product_categories)) {

      woocommerce_product_loop_start();
      if ( wc_get_loop_prop( 'total' ) ) {
        while ( have_posts() ) {
          the_post();

          /**
            * Hook: woocommerce_shop_loop.
            *
            * @hooked WC_Structured_Data::generate_product_data() - 10
            */
          do_action( 'woocommerce_shop_loop' );

          wc_get_template_part( 'content', 'product' );
        }
      }
      woocommerce_product_loop_end();

    } else {

      $index = 1;
      foreach ($product_categories as $product_category) {
        if ( get_query_var( 'taxonomy' ) && 1 !== $index) {
          echo '<h2>'.$term->name.' - '.$product_category->name.'</h2>';
        }else{
          echo '<h2>'.$product_category->name.'</h2>';
        }
        
        woocommerce_product_loop_start(); 

        $args = array(
          'posts_per_page' => -1,
          'tax_query' => array(
            'relation' => 'AND',
            array(
              'taxonomy' => 'product_cat',
              'field' => 'term_id',
              'terms' => $product_category->term_id,
              'include_children' => false
            )
          ),
          'post_type' => 'product',
          'orderby' => 'menu_order',
          'order' => 'asc',
        );
        $cat_query = new WP_Query( $args );

        while ( $cat_query->have_posts() ) : $cat_query->the_post();
          wc_get_template_part( 'content', 'product' );
        endwhile; 
        wp_reset_postdata();
        woocommerce_product_loop_end(); 
        if ( $index < count($product_categories) )
          echo '<div class="content-seperator"></div>';
        $index++;
      }//foreach
    }
  
    do_action( 'woocommerce_after_shop_loop' );
  } else {
    do_action( 'woocommerce_no_products_found' );
  }
  
  }
  ?>

https://ithelp.ithome.com.tw/upload/images/20201009/20104531FlEFsdri7V.jpg

早上六點多起床,一早去醫院抽了一管血,現在寫程式都很二,而且我在桌底下的線因為沒收好掉下來,腳勾到螢幕差點整個被欻下來,比起寫程式,那個從焦躁的感覺中要如何快點回到工作狀態才是更主要的,鐵人賽的宗旨是發散技術,而對自己來說是如何是在每一天能快速打理好自己的狀態,不管是踢倒螢幕,還是你家的貓貓需要嚕,都得要專心在工作上。

然後截圖畫面會與實際使用有所落差,鏈結那些的程式碼我沒有去寫,不過因為截圖的是用當初自己寫的loop,現在使用原生的來大改,難免有點落差XD

reference

因為真的查了太多太多太多,我就放上幾個意思意思一下

get-the-subcategories-of-the-current-product-category-in-woocommerce-archives
reference
Change product prices via a hook in WooCommerce 3
how to override woocommerce specific loop or archive-product.php [closed]
User Defined order on get_categories?
wc_get_template_part( 'content', 'product' ) | Where is this file located?
how to override woocommerce specific loop or archiev product php
Display WooCommerce Categories, Subcategories, and Products in Separate Lists
How to display all the subcategories from a specific category in WooCommerce?
WordPress get_query_var()


上一篇
「Wordpress 外掛開發」商品與目錄以巢狀顯示
下一篇
「Wordpress 外掛開發」從get_tems到wp_query大破解,媽的你搞誰啊
系列文
Wordpress 外掛開發30

尚未有邦友留言

立即登入留言