如果父页面具有特定模板,则显示ACF

时间:2019-03-27 作者:DimChtz

我正在尝试创建一个新的ACF规则,以便在父页面具有特定模板名称时显示字段。以下是我当前的尝试:

add_filter(\'acf/location/rule_types\', \'acf_location_rules_types\');
function acf_location_rules_types( $choices ) {

    $choices[\'Parent\'][\'parent_template\'] = \'Parent Template\';

    return $choices;

}

add_filter(\'acf/location/rule_values/parent_template\', \'acf_location_rules_values_parent_template\');
function acf_location_rules_values_parent_template( $choices ) {

    $templates = get_page_templates();

    if ( $templates ) {
        foreach ( $templates as $template_name => $template_filename ) {

            $choices[ $template_name ] = $template_name;

        }
    }

    return $choices;
}

add_filter(\'acf/location/rule_match/parent_template\', \'acf_location_rules_match_parent_template\', 10, 3);
function acf_location_rules_match_parent_template( $match, $rule, $options ) {

    $selected_template = $rule[\'value\'];

    global $post;
    $template = get_page_template_slug( $post->post_parent );

    if( $rule[\'operator\'] == "==" ) {

        $match = ( $selected_template == $template );

    } elseif($rule[\'operator\'] == "!=") {

        $match = ( $selected_template != $template );

    }

    return $match;
}
我认为问题在于我试图为当前页面获取父页面模板的方式。我甚至可以在函数内部的挂钩函数中获取父页面模板。php?

2 个回复
SO网友:DimChtz

对于任何处理相同问题的人,我只需要改变:

$choices[ $template_name ] = $template_name;
使用:

$choices[ $template_filename ] = $template_name;
考虑一个页面模板Homepage (page-home.php). 这样模板名称Homepage 将出现在“自定义字段”页面上,但$rule[\'value\'] 将实际返回page-home.php 然后我们可以将其与get_page_template_slug( $post->post_parent ).

SO网友:Krzysiek Dróżdż

问题不在于您获取父页面的方式或其模板。你可以像你一样做。

问题在于这两条线:

$choices[ $template_name ] = $template_name;
...
$match = ( $selected_template == $template );
所以您将模板名称设置为选项,但将其与模板的文件名进行比较。

将第一个更改为

$choices[ $template_filename ] = $template_name;
它将正常工作。

相关推荐