【问题标题】:How to display WooCommerce downloads table using PHP code or Shotcode如何使用 PHP 代码或 Shotcode 显示 WooCommerce 下载表
【发布时间】:2019-04-30 22:13:50
【问题描述】:

我正在尝试在仪表板端点上显示 woocommerce 下载表。在研究了 woocommerce 下载端点文件后,我注意到 woocommerce 使用以下代码来显示下载表;

$downloads     = WC()->customer->get_downloadable_products();
$has_downloads = (bool) $downloads;

do_action( 'woocommerce_before_account_downloads', $has_downloads ); ?>

<?php if ( $has_downloads ) : ?>

    <?php do_action( 'woocommerce_before_available_downloads' ); ?>

    <?php do_action( 'woocommerce_available_downloads', $downloads ); ?>

    <?php do_action( 'woocommerce_after_available_downloads' ); ?>

<?php else : ?>
    <div class="woocommerce-Message woocommerce-Message--info woocommerce-info">
        <a class="woocommerce-Button button" href="<?php echo esc_url( apply_filters( 'woocommerce_return_to_shop_redirect', wc_get_page_permalink( 'shop' ) ) ); ?>">
            <?php esc_html_e( 'Go shop', 'woocommerce' ); ?>
        </a>
        <?php esc_html_e( 'No downloads available yet.', 'woocommerce' ); ?>
    </div>
<?php endif; ?>

<?php do_action( 'woocommerce_after_account_downloads', $has_downloads ); ?>

我想要实现的是以表格格式显示 5 个最新下载。想知道如何限制此操作&lt;?php do_action( 'woocommerce_available_downloads', $downloads ); ?&gt; 仅显示最新的 5 次下载。

更新

这是 Woocommerce 下载端点页面中的下载表

我想在仪表板端点页面上显示完全相同的表结构

【问题讨论】:

标签: php wordpress woocommerce download hook-woocommerce


【解决方案1】:

您可以使用两种方式:

选项 1 - 使用过滤器挂钩 (在特定端点上过滤

过滤器woocommerce_customer_get_downloadable_products位于WC_CUstomerget_downloadable_products()方法的代码内。

以下内容将为您提供特定端点中的 5 次最新下载(在我的帐户上 > downloads 端点)

add_filter( 'woocommerce_customer_get_downloadable_products', 'filter_customer_downloadable_products', 10, 1 );
function filter_customer_downloadable_products( $downloads ) {
    $limit = 5; // Number of downloads to keep

    // Only on My account Downloads section for more than 5 downloads
    if( is_wc_endpoint_url( 'downloads' ) && sizeof($downloads) > $limit ) {
        $keys_by_order_id = $sorted_downloads = array();
        $count = 0;

        // Loop through the downloads array
        foreach( $downloads as $key => $download ) {
            // Store the array key with the order ID
            $keys_by_order_id[$key] = $download['order_id']; 
        }

        // Sorting the array by Order Ids in DESC order
        arsort($keys_by_order_id); 

        // Loop through the sorted array
        foreach( $keys_by_order_id as $key => $order_id ) {
            // Set the corresponding  download in a new array (sorted)
            $sorted_downloads[] = $downloads[$key];
            $count++; // Increase the count
            // When the count reaches the limit
            if( $count === $limit ) {
                break; // We stop the loop
            }
        }
        return $sorted_downloads;
    }
    return $downloads;
}

代码进入您的活动子主题(或活动主题)的 function.php 文件中。经过测试并且可以工作。


选项 2 - 使用过滤的自定义函数:

只需使用此功能,即可从客户$downloads 变量处获取最新的 5 次下载。

它可以在任何地方使用。

function get_customer_latest_downloads( $downloads, $limit = 5 ) {
    // Only on my account pages for more than 5 downloads
    if( sizeof($downloads) > $limit ) {
        $keys_by_order_id = $sorted_downloads = array();
        $count = 0;

        // Loop through the downloads array
        foreach( $downloads as $key => $download ) {
            // Store the array key with the order ID
            $keys_by_order_id[$key] = $download['order_id']; 
        }

        // Sorting the array by Order Ids in DESC order
        arsort($keys_by_order_id); 

        // Loop through the sorted array
        foreach( $keys_by_order_id as $key => $order_id ) {
            // Set the corresponding  download in a new array (sorted)
            $sorted_downloads[] = $downloads[$key];
            $count++; // Increase the count
            // When the count reaches the limit
            if( $count === $limit ) {
                break; // We stop the loop
            }
        }
        return $sorted_downloads;
    }
    return $downloads;
}

代码进入您的活动子主题(或活动主题)的 function.php 文件中。经过测试并且可以工作。

USAGE 示例 (在模板或简码中)

$downloads     = WC()->customer->get_downloadable_products();

$downloads     = get_customer_latest_downloads( $downloads ); // The 5 latest downloads

// Testing the array raw output
echo '<pre>'; print_r($downloads); echo '</pre>';

注意:动作挂钩不会过滤数据。

【讨论】:

  • 没有钩子版本是我正在深入研究的内容,因为我想将表格放在我的自定义 woocommerce 仪表板区域的特定部分...检查代码
  • 我已经尝试了第二种方法,它看起来对我有用,因为我想把它放在某个区域,但是在放置代码并使用用法示例之后,我得到了 Notice: Array to string conversion in ...然后我进行了测试购买,看看是否是因为我作为用户没有任何下载,并且在测试购买之后,仍然是同样的错误
  • 刚试过方法一……还是一样的注意。也许我是没有使用此代码的人。
  • Woocommerce 版本 3.6.2 ...我将您答案中的第二个代码添加到我的 functions.php 文件中,然后我转到 MY_THEME > woocommerce> myaccount > 中的仪表板文件并添加了您的使用示例给了,我收到了通知错误
  • 我做了同样的事情,我得到了数组,有没有解决方案?
【解决方案2】:

这是一个简单的示例,用于说明在 WooCommerce 显示下载列表之前如何对其进行操作。

最有效的方法是使用过滤器。此函数仅返回数组中的前五个下载。为了确保它返回的五个下载是最新的,您需要做更多的工作。

// Define the callback
function filter_woocommerce_customer_available_downloads($downloads, $customer_id) { 

    // Manipulate download data here, this example we'll get the first 5 downloads in the array
    $downloads = array_slice($downloads, 0, 5);

    // Return first five downloads
    return $downloads;

}; 
// Add the filter, this tells wordpress to apply this filter every time available downloads is called
add_filter( 'woocommerce_customer_available_downloads', 'filter_woocommerce_customer_available_downloads', 10, 2 );

将它放在主题中“functions.php”文件的底部。请记住,这是一个快速而肮脏的示例,未经测试。

【讨论】:

  • 非常感谢您提供的代码...在浏览完上面的代码后,我意识到这将打印出或返回特定用户可用的 5 个下载列表。有没有办法在默认的 Woocommerce 下载表中输出这个结果? (类似于 Orders Endpoint 表的表?(即依靠 woocommerce 函数以表格式返回结果
  • 这不是这个过滤器的作用。过滤器传递可下载项目的数组 - 您可以操作上述代码所做的数组。您需要修改代码以逐步遍历数组并计算下载次数,如果超过 5 次,则可以从数组中删除该项目。过滤器需要在最后返回数组 - 然后将使用普通的 woocommerce 模板进行处理。
【解决方案3】:

按照@LoicTheAztec 第二个选项(选项2)的代码,然后我将WooCommerce 下载模板添加到简码中,同时在@LoicTheAztec 选项2 中添加函数以过滤输出。代码如下;

function make_customer_download_output_five_products() {
    $downloads     = WC()->customer->get_downloadable_products();
    $downloads  = get_customer_latest_downloads($downloads); //Here is the function from Option 2
    $has_downloads = (bool) $downloads;
    ob_start();

    if ( $has_downloads ) {
        do_action( 'woocommerce_available_downloads', $downloads );
    } else {
        ?>
        <div class="woocommerce-Message woocommerce-Message--info woocommerce-info">
            <a class="woocommerce-Button button" href="<?php echo esc_url( apply_filters( 'woocommerce_return_to_shop_redirect', wc_get_page_permalink( 'shop' ) ) ); ?>">
                <?php esc_html_e( 'Go shop', 'woocommerce' ); ?>
            </a>
            <?php esc_html_e( 'No downloads available yet.', 'woocommerce' ); ?>
        </div>
        <?php
     }
    return ob_get_clean();
}
add_shortcode('your_downloads', 'make_customer_download_output_five_products');

然后,您可以使用 do_shortcode(['your_downloads']) 将短代码添加到任何选择的页面。

代码进入您的活动子主题(或活动主题)的 function.php 文件中。经过测试并且可以工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-30
    • 1970-01-01
    相关资源
    最近更新 更多