2014-03-12 77 views
2

下载在Woocommerce(*我的帐户页)我现在可以看到所有可用的,比如下载一个无序列表:WooCommerce - 按产品

<ul class="digital-downloads"> 
    <li><a href="#">Product 1 - File</a></li> 
    <li><a href="#">Product 1 - Another File</a></li> 
    <li><a href="#">Product 2 - File</a></li> 
    <li><a href="#">Product 2 - Another File</a></li> 
    <li><a href="#">Product 3 - File</a></li> 
    <li><a href="#">Product 3 - Another File</a></li> 
</ul> 

我怎么能按产品的下载?像:

<ul class="digital-downloads"> 
    <li> 
    <span>Product 1</span> 
    <ul> 
     <li><a href="#">File</a></li> 
     <li><a href="#">Another File</a></li> 
    </ul> 
    </li> 

    <li> 
    <span>Product 2</span> 
    <ul> 
     <li><a href="#">File</a></li> 
     <li><a href="#">Another File</a></li> 
    </ul> 
    </li> 

    <li> 
    <span>Product 3</span> 
    <ul> 
     <li><a href="#">File</a></li> 
     <li><a href="#">Another File</a></li> 
    </ul> 
    </li> 
</ul> 

从我的主题/ woocommerce /我的账户/我-downloads.php代码:

<ul class="digital_downloads"> 
    <?php foreach ($downloads as $download) : ?> 
     <li> 
      <?php 
       do_action('woocommerce_available_download_start', $download); 

       echo apply_filters('woocommerce_available_download_link', '<a href="' . esc_url($download['download_url']) . '">' . $download['download_name'] . '</a>', $download); 

       do_action('woocommerce_available_download_end', $download); 
      ?> 
     </li> 
    <?php endforeach; ?> 
</ul> 

回答

1

我知道,我很晚才回答这个问题,但是我为此发布了一个答案,以防其他人正在寻找答案。

请创建一个子主题,并在该子主题中创建文件/woocommerce/my-account/my-downloads.php。在该文件中添加以下内容

<?php 
/** 
* My Orders 
* 
* Shows recent orders on the account page 
* 
* @author  WooThemes 
* @package  WooCommerce/Templates 
* @version  2.0.0 
*/ 
if (!defined('ABSPATH')) { 
    exit; 
} 

function wdm_print_download_file_name($download, $product_meta) { 
    if (is_numeric($download['downloads_remaining'])) 
     echo apply_filters('woocommerce_available_download_count', '<span class="count">' . sprintf(_n('%s download remaining', '%s downloads remaining', $download['downloads_remaining'], 'woocommerce'), $download['downloads_remaining']) . '</span> ', $download); 

    echo apply_filters('woocommerce_available_download_link', '<a href="' . esc_url($download['download_url']) . '">' . $product_meta[$download['download_id']]['name'] . '</a>', $download); //Print file name 
} 

if ($downloads = WC()->customer->get_downloadable_products()) : 
    ?> 

    <h2><?php echo apply_filters('woocommerce_my_account_my_downloads_title', __('Available downloads', 'woocommerce')); ?></h2> 

    <ul class="digital-downloads"> 
     <?php 
     $all_product_ids = array(); 
     $all_download_ids = array(); 
     $download_ids_used_till_now = array(); 
     foreach ($downloads as $download) : 
      ?> 

      <?php 
      do_action('woocommerce_available_download_start', $download); 

      if (!in_array($download['product_id'], $all_product_ids)) { //Check if current product id is already there in $all_product_ids array. If it goes in this loop, that means it is new product id 
       $product_meta = get_post_meta($download['product_id'], '_downloadable_files', true); //All download ids of the product 

       $all_product_ids[] = $download['product_id']; //Push Current download's Product id to an array 

       $all_download_ids = array_keys($product_meta); //Get all download ids of the current product 

       echo '<li><span>' . get_the_title($download['product_id']) . '</span><ul>'; //Print product name 

       $download_ids_used_till_now[] = $download['download_id']; //add download id to an array 

       echo '<li>'; 
       wdm_print_download_file_name($download, $product_meta); 
       echo '</li>'; 

       $check_if_this_is_last_element = array_values(array_diff($all_download_ids, $download_ids_used_till_now)); 

       if (empty($check_if_this_is_last_element)) { //This is last download id of a product 
        echo '</ul></li>'; //close ul and li tags 
       } 
      } else { //product id is already in use. 
       $check_if_this_is_last_element = array_values(array_diff($all_download_ids, $download_ids_used_till_now)); 

       if (isset($check_if_this_is_last_element[0]) && $download['download_id'] == $check_if_this_is_last_element[0]) { //This is last download id of a product 
        echo '<li>'; 
        wdm_print_download_file_name($download, $product_meta); 
        echo '</li>'; 

        echo '</ul></li>'; //close ul and li tags 

        unset($download_ids_used_till_now); 
        unset($all_download_ids); 
       } else { //There are few more download ids 
        $download_ids_used_till_now[] = $download['download_id']; 

        echo '<li>'; 
        wdm_print_download_file_name($download, $product_meta); 
        echo '</li>'; 
       } 
      } 
      do_action('woocommerce_available_download_end', $download); 
      ?> 

     <?php endforeach; ?> 
    </ul> 

    <?php endif; ?> 

上面的代码使用WooCommerce 2.1.12进行测试。

+0

谢谢完成。事实上,即使问题有点老,我自己也没有想出来,所以我会在接下来的几天里测试你的答案。 – George

+0

今天测试,它工作顺利,正是我所需要的。非常感谢。 – George

+0

是否可以添加产品的特色图片?如果是,如何? – George

0

我修复

变化 行

  if (isset($check_if_this_is_last_element[0]) && $download['download_id'] == $check_if_this_is_last_element[0]) 

  if (isset($check_if_this_is_last_element[1]) && $download['download_id'] == $check_if_this_is_last_element[1]) 
+0

我不认为你明白这个问题 – George

1

上面的代码似乎太早收出孩子名单。所以,如果我有一个产品下两个下载它将显示为

<ul class="digital-downloads"> 
    <li> 
    <span>Product 1</span> 
     <ul> 
     <li><a href="#">Product 1 File 1</a></li> 
     </ul> 
    </li> 
    <li><a href="#">Product 1 File 2</a></li> 
</ul> 

而是我只是将html标记更改为div。这可能在语义上不是正确的,但完成了工作,编码更简单。

function wdm_print_download_file_name($download, $product_meta) { 
if (is_numeric($download['downloads_remaining'])) 
    echo apply_filters('woocommerce_available_download_count', '<span class="count">' . sprintf(_n('%s download remaining', '%s downloads remaining', $download['downloads_remaining'], 'woocommerce'), $download['downloads_remaining']) . '</span> ', $download); 

echo apply_filters('woocommerce_available_download_link', '<a href="' . esc_url($download['download_url']) . '">' . $product_meta[$download['download_id']]['name'] . '</a>', $download); //Print file name 
} 

if ($downloads = WC()->customer->get_downloadable_products()) : 
?> 

<h2><?php echo apply_filters('woocommerce_my_account_my_downloads_title', __('Available Downloads and Videos', 'woocommerce')); ?></h2> 

<div class="digital-downloads"> 
    <?php 
    $all_product_ids = array(); 
    $all_download_ids = array(); 
    foreach ($downloads as $download) : 
     ?> 

     <?php 
     do_action('woocommerce_available_download_start', $download); 

     if (!in_array($download['product_id'], $all_product_ids)) { //Check if current product id is already there in $all_product_ids array. If it goes in this loop, that means it is new product id 
      $product_meta = get_post_meta($download['product_id'], '_downloadable_files', true); //All download ids of the product 

      $all_product_ids[] = $download['product_id']; //Push Current download's Product id to an array 

      $all_download_ids = array_keys($product_meta); //Get all download ids of the current product 

      echo '<div class="download-title">' . get_the_title($download['product_id']) . '</div>'; //Print product name 

     } else { 
      //product id is already in use. 
     } 

     echo '<div class="download-product">'; 
     wdm_print_download_file_name($download, $product_meta); 
     echo '</div>'; 

     do_action('woocommerce_available_download_end', $download); 
     ?> 

    <?php endforeach; ?> 
</div> 
<?php endif; ?> 

这在WooCommerce 2.5.2

+0

我没有同样的问题。在一款产品中,我总是至少有两次下载,而且它们看起来就像是为第二个文件显示的。 – George