PHP 包括不包括 - Woocommerce
PHP Include Isn't Including - Woocommerce
简而言之,我正在 php 向我证明该文件存在且可读,但一旦包含语句被命中,脚本似乎就停止了 运行。
此外,您会从这个问题的数据输出中进一步注意到我使用的是绝对路径。
我尝试解决此问题的一些值得注意的事情是:
- 将 include 替换为 require 和 require_once
- 用硬编码字符串替换 $include 变量
- 使用 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"> </th>
<t'... (length=6908)
string 'After do_action function' (length=24)
您还会注意到我已经编辑了我要包含的文件,因此它会触发另一个 var_dump 并打印 "Fired"。但是预期的输出并没有发生。
导致此问题的原因可能是什么?
您应该能够通过查看调试日志来调试此类问题。它们可能会在您的安装中停用。
您可以尝试将这两行添加到 PHP 文件的顶部以启用它们。它应该可以帮助您确定问题。
error_reporting(E_ALL);
ini_set("display_errors", 1);
啊,使用 WordPress 的乐趣。事实证明 include 和 require 只是停止脚本执行的原因是因为我不知道许多第 3 方插件正在停用和压制所有错误。
根据@jason-pate 的建议()我查到了这个问题的根源。
include 和 required 给出了错误,他们只是没有显示它们,也不是无缘无故地停止脚本,手动激活错误突出显示正在引用的模板中存在语法问题。
简而言之,我正在 php 向我证明该文件存在且可读,但一旦包含语句被命中,脚本似乎就停止了 运行。
此外,您会从这个问题的数据输出中进一步注意到我使用的是绝对路径。
我尝试解决此问题的一些值得注意的事情是:
- 将 include 替换为 require 和 require_once
- 用硬编码字符串替换 $include 变量
- 使用 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"> </th>
<t'... (length=6908)
string 'After do_action function' (length=24)
您还会注意到我已经编辑了我要包含的文件,因此它会触发另一个 var_dump 并打印 "Fired"。但是预期的输出并没有发生。
导致此问题的原因可能是什么?
您应该能够通过查看调试日志来调试此类问题。它们可能会在您的安装中停用。
您可以尝试将这两行添加到 PHP 文件的顶部以启用它们。它应该可以帮助您确定问题。
error_reporting(E_ALL);
ini_set("display_errors", 1);
啊,使用 WordPress 的乐趣。事实证明 include 和 require 只是停止脚本执行的原因是因为我不知道许多第 3 方插件正在停用和压制所有错误。
根据@jason-pate 的建议(
include 和 required 给出了错误,他们只是没有显示它们,也不是无缘无故地停止脚本,手动激活错误突出显示正在引用的模板中存在语法问题。