Как отобразить таблицу загрузок WooCommerce, используя PHP-код или Shotcode - PullRequest
1 голос
/ 01 мая 2019

Я пытаюсь отобразить таблицу загрузки 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 последних загрузок в табличном формате. хотел бы знать, как ограничить это действие <?php do_action( 'woocommerce_available_downloads', $downloads ); ?>, чтобы отображать только последние 5 загрузок.

UPDATE

Это таблица загрузки на странице конечной точки загрузки Woocommerce. enter image description here

, в котором я хочу отобразить точно такую ​​же структуру таблицы на странице конечной точки панели управления

enter image description here

Ответы [ 3 ]

1 голос
/ 01 мая 2019

Вы можете использовать 2 способа:

Вариант 1 - Использование ловушки фильтра (фильтрация по определенной конечной точке ) :

Фильтр woocommerce_customer_get_downloadable_products находится внутри кода метода WC_CUstomer get_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 вашей активной дочерней темы (или активной темы). Проверено и работает.

Пример использования (в шаблоне или шорткоде) :

<code>$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 '
';

Примечание: Хуки действий не фильтруют данные.

1 голос
/ 01 мая 2019

Следуя коду, заданному параметром @LoicTheAztec Second (Вариант 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 вашей активной дочерней темы (или активной темы).).Проверено и работает.

0 голосов
/ 01 мая 2019

Вот простой пример, иллюстрирующий, как вы будете манипулировать списком загрузок перед его отображением в 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" в вашей теме. Пожалуйста, имейте в виду, что это быстрый и грязный пример и не проверен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...