wordpress - 如何修复 'Woocommerce Cart PDF' 函数文件以将 pdf 链接移动到结账页面而不是购物车页面

标签 wordpress pdf woocommerce

我正在使用名为 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 );

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

最佳答案

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 Hook 上的代码,该 Hook 在购物车页面上的购物车总计后触发。结帐按钮本身也使用相同的操作。

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

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

这是最终的代码:

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 );

关于wordpress - 如何修复 'Woocommerce Cart PDF' 函数文件以将 pdf 链接移动到结账页面而不是购物车页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57662667/

相关文章:

jquery - 如何手动控制我的 wordpress 网站上的折叠按钮

用于嵌入超链接支持的 android pdf 查看器 sdk

wordpress - REST API woocommerce - 未在 GET/customers 上显示所有客户

php - WooCommerce REST API 更新图像问题

wordpress - Woocommerce Wordpress 插件改变结账流程

php - 有条件地限制为来自特定产品子类别的 1 个购物车项目

php - 用 PHP 编写 MySQL 数据库查找/替换脚本

php - 自定义页面和页面模板 WordPress

javascript - 从 HTML/JS 更改 PDF 中的数据

java - 在屏幕上显示时删除 pdf 文件的安全方法