首先用其字符串替换变量,然后执行“ if”检查

时间:2018-08-05 11:36:37

标签: php wordpress if-statement

我正在开发具有以下功能的自定义WordPress插件

// Callback for setting the if condition where theme should be used instead of Oxygen.
function ote_on_these_views() {

    $oxygen_theme_enabler_options = get_option( 'oxygen_theme_enabler_option_name' ); // Array of All Options

    $myifcondition = $oxygen_theme_enabler_options['enter_your_if_condition_1'];

    if ( is_page( 'contact' ) ) {
        return true;
    } else {
        return false;
    }
}

有了这个,一切正常。在其余的代码中,我要多次致电ote_on_these_views()

现在当我更换

if ( is_page( 'contact' ) ) {

使用

if ( $myifcondition ) {

它不起作用,因为if条件正在检查变量是否存在(并且确实存在),因此ote_on_these_views()始终返回true。

$myifcondition的当前值为is_page( 'contact' ),来自插件的设置页面。

enter image description here

那么..有一种方法可以先用变量的值替换变量,然后再用if语句检查它或其他解决方法?

3 个答案:

答案 0 :(得分:1)

使用过滤器会更好。如果您的用户具有足够的开发人员知识,可以声明诸如is_page()之类的条件,那么他们应该能够足够容易地添加过滤器。

function ote_on_these_views() {
    if ( ote_on_these_views_condition() ) {
        return true;
    } else {
        return false;
    }
}

function ote_on_these_views_condition() {
    // Set our default condition value
    $oxygen_theme_enabler_options = get_option( 'oxygen_theme_enabler_option_name' ); // Array of All Options
    $myifcondition = boolval( $oxygen_theme_enabler_options['enter_your_if_condition_1'] );
    // Add a filter to allow users to override the condition
    return apply_filters( 'ote_on_these_views_condition', $myifcondition );
}

现在您的用户可以轻松更改条件的结果

add_filter( 'ote_on_these_views_condition', 'filter_ote_on_these_views_condition' );

function filter_ote_on_these_views_condition( $myifcondition ) {
    if ( is_page( 'contact' ) ) {
        $myifcondition = true;
    } else {
        $myifcondition = false;
    }
    return $myifcondition;
}

答案 1 :(得分:0)

if ( $myifcondition ) {

应该是

if ( call_user_func_array($myifcondition, array('contact')) ) {

其中

$myifcondition = 'is_page'

您可以通过以下方式拆分用户输入的文本

$condition_name=explode('(',$myifcondition,2) // 2 is max number of split parts
$params=rtrim(trim($condition_name[1]),')') //trim is used to remove any trailing spaces

然后使用

call_user_func_array($condition_name[0], array($params))

答案 2 :(得分:0)

您必须使用eval函数,但是使用它不是一个好习惯。另外,您还必须在输入的字符串中添加return;

if (eval('return ' . $myifcondition . ';')) {

}

如您所说,您只希望允许特定功能,因此可以使用以下正则表达式来验证表达式:

preg_match_all("/\(?(\w+)?\(.*?\)/", $input_lines, $output_array);

我不太擅长正则表达式,因此我敢肯定有可能使此功能更好。

对于以下表达式:

is_page() && (some_function('arg') || what_else())

您将获得以下$output_array

array(2
    0   =>  array(3
        0   =>  is_page()
        1   =>  (some_function('arg')
        2   =>  what_else()
    )
    1   =>  array(3
        0   =>  is_page
        1   =>  some_function
        2   =>  what_else
    )
)

现在,您可以一个个$output_array[1]来获取每个使用的函数名称,并检查用户是否可以调用此函数:

if (in_array($used_function, $allowed_functions_array))