我正在开发具有以下功能的自定义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' )
,来自插件的设置页面。
那么..有一种方法可以先用变量的值替换变量,然后再用if语句检查它或其他解决方法?
答案 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))