如何修复“ Woocommerce购物车PDF”功能文件以将pdf链接移至结帐页面而非购物车页面

时间:2019-08-26 17:55:02

标签: wordpress pdf woocommerce

我正在为wordpress-woocommerce使用一个名为Woocommerce Cart PDF(https://wordpress.org/plugins/wc-cart-pdf/)的插件。它会生成当前购物车的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 );

这可能是插件中功能的不正确部分,但我希望我做对了。

1 个答案:

答案 0 :(得分: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 );