自定义字段的值不可用。php

时间:2015-10-26 作者:Karmacoma

我正在使用WooCommerce和高级自定义字段插件。我有一个计算产品折扣的函数,如下所示:

function woo_add_cart_fee() {

  global $woocommerce;

  $discount = floatval(10);
    if(!empty($discount) || $discount != 0){
    $discount *= -1;
    $woocommerce->cart->add_fee(\'discount\', $discount, true, \'\' );
  } 
}
add_action( \'woocommerce_cart_calculate_fees\', \'woo_add_cart_fee\' );
它正在工作,但我的折扣值是动态的,因此必须使用自定义字段。将此行添加到函数时,得到一个空值:

$value = get_field( "text_field" );

if( $value ) {
    echo $value;
} else {
    echo \'empty\';
}
但实际上,WordPress管理面板中的自定义字段不是空的。我在这里做错了什么,我该如何修复它?

1 个回复
最合适的回答,由SO网友:Tom J Nowell 整理而成

这是因为你做得太早了。您需要将代码包装在必要的挂钩中,以便它在正确的时间发生。

因为你不告诉我get_field 当前帖子的ID,它需要知道从哪个帖子获取字段,并通过引用全局变量来实现$post, 当你打电话的时候the_post, 或者在页面加载的早期通过WP-Core。

但是,如果在设置之前尝试这样做,函数将不知道当前帖子是什么,并且会失败。这就是你所看到的functions.php. 什么时候functions.php 已加载,WordPress尚未设置post循环或查询数据库,它仍在加载主题和插件文件的过程中。最早的事件/挂钩$post 已设置,将是wp 事件,则代码运行时间早于此。

因此,让我们参考core load diagram, 这说明从init 钩住并向前移动。我建议用下一个钩子,wp_loaded 相反,您可以自行决定更改:

function karmacoma_206593() {
    $value = get_field( "text_field" );
    if( $value ) {
        echo $value;
    } else {
        echo \'empty\';
    }
}
add_action( \'wp_loaded\', \'karmacoma_206593\' );
这里,我将您的代码放在一个函数中,并告诉WordPress在init 事件/挂钩/动作。为了确保它不会与您拥有的任何其他代码冲突,我使用了您的用户名和此问题的ID作为函数名。

接下来,我们有两个您不知道的新问题。首先,你的if 报表检查可能更好。例如,如果您的值为false, 您的检查将失败,即使它是有效值,因此我将使用empty:

if( !empty( $value ) ) {
其次,您正在输出此字段的值,而不需要任何形式的转义。如果该字段的值是脚本标记怎么办?让我们通过使用来保护此代码esc_html 要删除任何html标记,请执行以下操作:

echo esc_html( $value );
给我们这个:

function karmacoma_206593() {
    $value = get_field( "text_field" );
    if ( !empty( $value ) ) {
        echo esc_html( $value );
    } else {
        echo \'empty\';
    }
}
add_action( \'wp_loaded\', \'karmacoma_206593\' );

相关推荐

无法在模板函数.php中使用IS_HOME

我试图在标题中加载一个滑块,但只在主页上加载。如果有帮助的话,我正在使用Ultralight模板。我正在尝试(在template functions.php中)执行以下操作:<?php if ( is_page( \'home\' ) ) : ?> dynamic_sidebar( \'Homepage Widget\' ); <?php endif; ?> 但这行不通。现在,通过快速的google,我似乎需要将请