获取可下载产品的下载计数以在 Woocommerce 中显示

Get download count of downloadable product to display in Woocommerce

我希望显示有多少人下载了该产品, 注意,不是销售数量。 因为有时我会免费提供产品, 我希望每次点击都能操纵这个数字。

第一部分我尝试显示下载数:

function add_download_count(){
    global $product;
    if ($product->is_downloadable('yes')){
$query = "SELECT SUM( download_count ) AS count FROM {$wpdb->prefix}woocommerce_downloadable_product_permissions WHERE product_id = $product->id";
    $count = $wpdb->get_var( $query );
        echo "Downloads: ".$count;
    }
}
add_action("woocommerce_before_single_product_summary", "add_download_count");

我是从另一个 post 那里学到的: 这是一个非常过时的 post 所以现在我尝试了代码但无济于事,因为它 returns 一个错误:调用成员函数 get_var() on null

第二部分,希望通过点击以下添加下载数:

foreach( $downloads as $key => $each_download ) {
  echo '<a href="'.$each_download["file"].'">Download</a>';
}

但是我不确定如何做到这一点?我在想是否可以点击并触发更新 +1 到 download_count.

还是我逻辑有误?


UPDATE

修改了一下,发现这个方法不行。

global $wpdb; 都没有。

点击后下载次数加数的原因是:

通过 $product->get_downloads() 生成的 link 的用户下载不会通过 WooCommerce 的购物车系统。

因此它不会自动反映在购买或下载数量上。

我认为这是错误的逻辑,也许不是实现这个想法的好方法。 我继续并尝试使用默认的 $product->get_total_sales()。 这似乎是一种更安全的方式,并且符合原始设计的意图。

我通过以下方式轻松成功地显示了销售数量:

function add_download_count(){
    global $product;
    $count = $product->get_total_sales();
    echo "<span id='downloadcount' data-downloadcount='".$count."'><span class='enclass'>Downloads:</span>&nbsp;".$count."</span>";
}
add_action("woocommerce_single_product_summary", "add_download_count", 15);

如您所见,我尝试将计数存储在 data-count 中,因此可以通过 AJAX.

对其进行操作

jQuery(document).ready(function($) {

    $( ".downloadbtn_now" ).click(function() {



    //aJAX
    let wasdownloadcount = parseInt($( "#downloadcount" ).data( "downloadcount" ) ) ;
    let downloadcount = wasdownloadcount + 1;
     $.ajax({
            type: "POST",url: "<? admin_url('admin-ajax.php') ?>",            
            dataType: "json",
            data: { downloadcount: downloadcount, action: 'download_count' }
          }).done(function() {
            alert( "Data was " + wasdownloadcount + " but now is: " +downloadcount );
          });

    });


});

我得到了:

POST http://localhost/wp-admin/admin-ajax.php 500 (Internal Server Error)

而且我不确定如何从这里前进。

我在 functions.php 中的函数回调如下,它使用 woocommerce 中的默认函数 set_total_sales:

//AJAX
add_action('wp_ajax_download_count', 'download_count_callback');
 add_action('wp_ajax_nopriv_download_count', 'download_count_callback');
function download_count_callback(){
    $downloadcount = $_POST['downloadcount'];
set_total_sales($downloadcount);
    die();
}

我的问题在哪里?

function show_number_of_downloads() {
    global $wpdb, $product;

    $product_id = ( is_object( $product ) && is_callable( array( $product, 'get_id' ) ) ) ? $product->get_id() : 0;

    if ( empty( $product_id ) ) return;

    $product_type = ( is_object( $product ) && is_callable( array( $product, 'get_type' ) ) ) ? $product->get_type() : 'simple';

    if ( 'variable' === $product_type ) {
        $product_ids = $product->get_children();
    } else {
        $product_ids = array( $product_id );
    }

    $how_many_product_ids = count( $product_ids );
    $id_placeholder       = array_fill( 0, $how_many_product_ids, '%d' );

    $count = $wpdb->get_var(
        $wpdb->prepare(
            "SELECT SUM( download_count ) AS count
                FROM {$wpdb->prefix}woocommerce_downloadable_product_permissions
                WHERE product_id IN (".implode( ',', $id_placeholder ).")",
            $product_ids
        )
    );
    if ( ! empty( $count ) ) {
        echo '<strong>' . esc_html__( 'Total downloads' ) . '</strong>: ' . $count;
    }
}
add_action( 'woocommerce_single_product_summary', 'show_number_of_downloads' );

我添加了这段代码并且效果很好

function add_download_count(){ global $product; $count = $product->get_total_sales(); echo “ Downloads:  ”.$count.” ”; } add_action(“woocommerce_single_product_summary”, “add_download_count”, 15); 

原来是这样