【问题标题】:How to fix 'Woocommerce Cart PDF' functions file to move pdf-link to checkout page instead of cart page如何修复“Woocommerce Cart PDF”功能文件以将 pdf 链接移动到结帐页面而不是购物车页面
【发布时间】:2019-08-26 17:55:02
【问题描述】:

我正在使用一个名为 Woocommerce Cart PDF (https://wordpress.org/plugins/wc-cart-pdf/) 的 wordpress-woocommerce 插件。它会生成当前购物车的 pdf 链接,但位于购物车页面上。

我有一个合并的购物车和结帐页面,因此链接不会出现在我的网站上。我不知道如何自己编辑插件文件以使其出现在我的购物车页面上。

我已经尝试过这个特定插件的 wordpress 插件支持论坛,但没有答案。

/**
 * Generates the PDF for download
 *
 * @return void
 */
function wc_cart_pdf_process_download() {
if( ! function_exists( 'WC' ) ) {
    return;
}

if( ! isset( $_GET['cart-pdf'] ) ) {
    return;
}

if( ! is_cart() || WC()->cart->is_empty() ) {
    return;
}

if( ! isset( $_GET['_wpnonce'] ) || ! wp_verify_nonce( $_GET['_wpnonce'], 'cart-pdf' ) ) {
    wc_add_notice( __( 'Invalid nonce. Unable to process PDF for download.', 'wc_cart_pdf' ), 'error' );
    return;
}

$dompdf = new \Dompdf\Dompdf();

$content = $css = '';

$cart_table = wc_locate_template( 'cart-table.php', '/woocommerce/wc-cart-pdf/', __DIR__ . '/templates/' );
$css        = wc_locate_template( 'pdf-styles.php', '/woocommerce/wc-cart-pdf/', __DIR__ . '/templates/' );

do_action( 'wc_cart_pdf_before_process' );

if( file_exists( $cart_table ) ) {
    ob_start();

    include $cart_table;

    $content = ob_get_clean();
}

if( file_exists( $css ) ) {
    ob_start();

    include $css;

    $css = apply_filters( 'woocommerce_email_styles', ob_get_clean() );
}

$dompdf->loadHtml( '<style>' . $css . '</style>' . $content );
$dompdf->setPaper( 'A4', 'portrait' );
$dompdf->render();
$dompdf->stream( 
    apply_filters( 'wc_cart_pdf_filename', 'WC_Cart-' . date( 'Ymd' ) . bin2hex( openssl_random_pseudo_bytes( 5 ) ) ) . '.pdf', 

    /**
     * 'compress' => 1 or 0 - apply content stream compression, this is on (1) by default
     * 'Attachment' => 1 or 0 - if 1, force the browser to open a download dialog, on (1) by default
     */ 
    apply_filters( 'wc_cart_pdf_stream_options', array( 'compress' => 1, 'Attachment' => 1 ) ) 
);

exit;
}
add_action( 'template_redirect', 'wc_cart_pdf_process_download' );


if( ! function_exists( 'wc_cart_pdf_button' ) ) {

/**
 * Renders the download cart as PDF button
 *
 * @return void
 */
function wc_cart_pdf_button() {
    if( ! is_cart() || WC()->cart->is_empty() ) {
        return;
    }

    ?>

    <a href="<?php echo esc_url( wp_nonce_url( add_query_arg( array( 'cart-pdf' => '1' ), wc_get_cart_url() ), 'cart-pdf' ) );?>" class="cart-pdf-button button" target="_blank">
        <?php esc_html_e( 'Download Cart as PDF', 'wc-cart-pdf' ); ?>
    </a>

    <?php
}
}
add_action( 'woocommerce_proceed_to_checkout', 'wc_cart_pdf_button',     21 );

这可能是插件中功能的不正确部分,但我想我是对的。

【问题讨论】:

    标签: wordpress pdf woocommerce


    【解决方案1】:

    wc_cart_pdf_process_download() 函数并不真正相关。评论指出它“生成 PDF 以供下载”。它所做的是在用户通过生成请求的 PDF 文件访问 PDF 链接时做出响应。重要的功能是它下面的那个,wc_cart_pdf_button()

    现在我们知道了我们感兴趣的函数,接下来是什么?在您的问题中,您建议编辑插件文件,但避免这样做很重要。编辑插件文件是确保您所做的更改在下次更新时被覆盖的可靠方法。

    你有几个选择:

    1. 创建一个迷你功能插件。
    2. 将代码添加到您(希望是子)主题的 functions.php 文件的底部。

    第一个选项是推荐的方法,但这会使我们远远超出问题的范围。将代码放在子主题的 functions.php 文件中足以让您启动和运行。

    好的,现在我们知道要修改的代码是什么,以及我们要将这些修改存储在哪里。让我们分解一下实际的代码:

    if( ! is_cart() || WC()->cart->is_empty() ) {
        return;
    }
    

    这会检查两件事,我们是否在购物车页面上以及购物车是否包含商品?如果其中任何一个是假的,我们将提前纾困。您在结帐页面,而不是购物车页面,因此即使调用此函数,它也不会超过此条件。

    <a href="<?php echo esc_url( wp_nonce_url( add_query_arg( array( 'cart-pdf' => '1' ), wc_get_cart_url() ), 'cart-pdf' ) );?>" class="cart-pdf-button button" target="_blank">
        <?php esc_html_e( 'Download Cart as PDF', 'wc-cart-pdf' ); ?>
    </a>
    

    如果前面的两项检查通过,则生成按钮输出。

    add_action( 'woocommerce_proceed_to_checkout', 'wc_cart_pdf_button',     21 );
    

    这会执行 woocommerce_proceed_to_checkout 挂钩上的代码,该挂钩会在购物车页面上的购物车总数后触发。结帐按钮本身也使用相同的操作。

    我们需要编写自己的函数,在结帐页面上显示相同的输出。在不知道您希望按钮出现在哪里的情况下,我无法建议使用哪个操作。我使用woocommerce_checkout_order_review 的优先级将其放在订单表和付款选项之间。如果您需要重新定位它,则必须通过这些钩子并找到合适的位置。

    您确实在问题中提到这是必要的,因为您将购物车和结帐页面结合在一起。您可能需要一个完全不同的钩子,我无法仅根据您的问题知道。

    这是最终代码:

    function stackoverflow_wc_checkout_pdf_button() {
        // We're on the checkout page based on the action. 
        // Highly unlikely we need the is_empty() check but it can't hurt if you may find yourself reusing elsewhere.
        if ( WC()->cart->is_empty() ) {
            return;
        } ?>
    
        <a href="<?php echo esc_url( wp_nonce_url( add_query_arg( array( 'cart-pdf' => '1' ), wc_get_cart_url() ), 'cart-pdf' ) );?>" class="cart-pdf-button button" target="_blank">
            <?php esc_html_e( 'Download Cart as PDF', 'wc-cart-pdf' ); ?>
        </a>
    
        <?php
    }
    add_action( 'woocommerce_checkout_order_review', 'stackoverflow_wc_checkout_pdf_button', 15 );
    

    【讨论】:

    • 它工作得很好,而且位置正是我需要的位置。我确实使用了一个子主题,并且应该指定我的意思。感谢您的详细回复,并给了我学习的机会。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-04
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 2012-09-27
    • 2019-05-19
    • 2016-09-29
    相关资源
    最近更新 更多