【问题标题】:PHP Include Isn't Including - WoocommercePHP 包含不包含 - Woocommerce
【发布时间】:2016-01-29 15:59:42
【问题描述】:

简短的故事,我让 php 向我证明该文件存在并且是可读的,但是一旦命中 include 语句,脚本似乎就停止运行。

此外,您还会从这个问题的数据输出中进一步注意到我使用的是绝对路径。

我在解决此问题时尝试过的一些值得注意的事情是:

  1. include 替换为 requirerequire_once
  2. 用硬编码字符串替换 $include 变量
  3. 使用 require 将硬编码字符串替换为无效位置。

在每一种情况下,都会发生相同的事情,除了 include 或 require 语句之外不会执行任何脚本,也不会引发错误。

我正在开发一个 Woocommerce(这可能是一个无关紧要的点,但可能有帮助)系统,它的行为似乎很奇怪。我的代码如下,我插入了一堆 var_dumps 来演示我的问题:

/**
 * Output the cart shortcode.
 */
public static function output() {

    var_dump("Hello");

    // Constants
    if ( ! defined( 'WOOCOMMERCE_CART' ) ) {
        define( 'WOOCOMMERCE_CART', true );
    }

    var_dump("After Constants");

    // Update Shipping
    if ( ! empty( $_POST['calc_shipping'] ) && wp_verify_nonce( $_POST['_wpnonce'], 'woocommerce-cart' ) ) {
        self::calculate_shipping();
    }

    var_dump("After Shipping Calc");

    // Check cart items are valid
    do_action( 'woocommerce_check_cart_items' );

    var_dump("After cart items check");

    // Calc totals
    WC()->cart->calculate_totals();

    var_dump("After Calc Totals");

    var_dump(WC()->cart->get_cart());
    var_dump(sizeof( WC()->cart->get_cart() ));

    if ( 0 === sizeof( WC()->cart->get_cart() ) ) {

        var_dump("Size = 0 , Empty");

        wc_get_template( 'cart/cart-empty.php' );
    } else {

        var_dump("Size != 0 , Not Empty");

        wc_get_template( 'cart/cart.php' );
    }
}

调用 wc_get_template() 函数:

/**
 * Get other templates (e.g. product attributes) passing attributes and including the file.
 *
 * @access public
 * @param string $template_name
 * @param array $args (default: array())
 * @param string $template_path (default: '')
 * @param string $default_path (default: '')
 * @return void
 */
function wc_get_template( $template_name, $args = array(), $template_path = '', $default_path = '' ) {

    var_dump("wc_get_template fired. Template name = " . $template_name);

    if ( $args && is_array( $args ) ) {
        extract( $args );
    }

    $located = wc_locate_template( $template_name, $template_path, $default_path );

    var_dump($located);

    if ( ! file_exists( $located ) ) {
        _doing_it_wrong( __FUNCTION__, sprintf( '<code>%s</code> does not exist.', $located ), '2.1' );
        return;
    }

    var_dump(file_exists( $located ), "File exists");

    var_dump(file_get_contents($located));

    // Allow 3rd party plugin filter template file from their plugin
    $located = apply_filters( 'wc_get_template', $located, $template_name, $args, $template_path, $default_path );

    do_action( 'woocommerce_before_template_part', $template_name, $template_path, $located, $args );

    var_dump("After do_action function");

    include $located;

    var_dump("After the file is included");

    do_action( 'woocommerce_after_template_part', $template_name, $template_path, $located, $args );
}

输出:

string 'Hello' (length=5)
string 'After Constants' (length=15)
string 'After Shipping Calc' (length=19)
string 'After cart items check' (length=22)
string 'After Calc Totals' (length=17)
array (size=2)
  'e82c4b19b8151ddc25d4d93baf7b908f' => 
    array (size=10)
      'product_id' => int 2468
      'variation_id' => string '' (length=0)
      'variation' => 
        array (size=0)
          empty
      'quantity' => int 1
      'line_total' => float 27.06
      'line_tax' => float 5.412
      'line_subtotal' => float 27.06
      'line_subtotal_tax' => float 5.412
      'line_tax_data' => 
        array (size=2)
          'total' => 
            array (size=1)
              ...
          'subtotal' => 
            array (size=1)
              ...
      'data' => 
        object(WC_Product_Simple)[101]
          public 'id' => int 2468
          public 'post' => 
            object(WP_Post)[103]
              ...
          public 'product_type' => string 'simple' (length=6)
          protected 'dimensions' => string '' (length=0)
          protected 'shipping_class' => string '' (length=0)
          protected 'shipping_class_id' => int 0
          public 'price' => string '27.06' (length=5)
          public 'manage_stock' => string 'no' (length=2)
          public 'stock_status' => string 'instock' (length=7)
          public 'tax_status' => string 'taxable' (length=7)
          public 'virtual' => string 'no' (length=2)
  '1843e35d41ccf6e63273495ba42df3c1' => 
    array (size=10)
      'product_id' => int 2463
      'variation_id' => string '' (length=0)
      'variation' => 
        array (size=0)
          empty
      'quantity' => int 1
      'line_total' => float 29.7
      'line_tax' => float 5.94
      'line_subtotal' => float 29.7
      'line_subtotal_tax' => float 5.94
      'line_tax_data' => 
        array (size=2)
          'total' => 
            array (size=1)
              ...
          'subtotal' => 
            array (size=1)
              ...
      'data' => 
        object(WC_Product_Simple)[69]
          public 'id' => int 2463
          public 'post' => 
            object(WP_Post)[67]
              ...
          public 'product_type' => string 'simple' (length=6)
          protected 'dimensions' => string '' (length=0)
          protected 'shipping_class' => string '' (length=0)
          protected 'shipping_class_id' => int 0
          public 'price' => string '29.70' (length=5)
          public 'manage_stock' => string 'no' (length=2)
          public 'stock_status' => string 'instock' (length=7)
          public 'virtual' => string 'no' (length=2)
          public 'tax_status' => string 'taxable' (length=7)
int 2
string 'Size != 0 , Not Empty' (length=21)
string 'wc_get_template fired. Template name = cart/cart.php' (length=52)
string '/var/www/public/natural-choice/wp-content/themes/theme524401/woocommerce/cart/cart.php' (length=86)
boolean true
string 'File exists' (length=11)
string '<?php
/**
 * Cart Page
 *
 * @author  WooThemes
 * @package WooCommerce/Templates
 * @version 2.3.8
 */

var_dump("Fired");

if ( ! defined( 'ABSPATH' ) ) {
    exit; // Exit if accessed directly
}

wc_print_notices();

do_action( 'woocommerce_before_cart' ); ?>

<form action="<?php echo esc_url( WC()->cart->get_cart_url() ); ?>" method="post">

<?php do_action( 'woocommerce_before_cart_table' ); ?>

<table class="shop_table cart" cellspacing="0">
    <thead>
        <tr>
            <th class="product-remove">&nbsp;</th>
            <t'... (length=6908)
string 'After do_action function' (length=24)

您还会注意到我已经编辑了要包含的文件,因此它将触发另一个 var_dump 并打印“已触发”。但预期的输出并没有发生。

这个问题的原因可能是什么?

【问题讨论】:

标签: php wordpress woocommerce php-include


【解决方案1】:

您应该能够通过查看调试日志来调试此类问题。它们可能在您的安装中被停用。

您可以尝试将这两行添加到 PHP 文件的顶部以启用它们。它应该可以帮助您识别问题。

error_reporting(E_ALL);
ini_set("display_errors", 1);

【讨论】:

  • 一个很好的建议/评论...但这不是问题的答案。
  • 啊,谢谢。也许我与 WooCommerce 合作的事实毕竟是相关的,似乎所有出于某种奇怪原因的错误报告都被停用了。我现在得到了适当的可用反馈。
  • @rnevius 确实。但是,我多次看到比我“更高的代表”提交的答案就像这些一样并且被(信不信由你)接受。 想想看,嗯?!
  • FWIW,答案可以帮助 OP 在解决方案方面取得进展。 "Any answer that gets the asker going in the right direction is helpful..." 也就是说,使用一些代码进行简单的“试试这个”并不是一个好答案。一些动机和/或解释会改善这些答案。
【解决方案2】:

啊,使用 WordPress 的乐趣。事实证明,includerequire 简单地停止脚本执行的原因是因为我不知道许多第 3 方插件正在停用并抑制所有错误。

在@jason-pate 的建议 (PHP Include Isn't Including - Woocommerce) 之后,我找到了这个问题的根源。

includerequired 给出了错误,他们只是没有显示它们,也不是简单地无缘无故地停止脚本,手动激活突出显示的错误被引用的模板存在语法问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-13
    • 2016-02-17
    • 1970-01-01
    • 2012-05-13
    • 1970-01-01
    • 2023-03-24
    • 2013-01-07
    • 1970-01-01
    相关资源
    最近更新 更多