从父页面和子页面获取自定义字段值

时间:2018-08-03 作者:Sam

我创建了以下页面和层次结构:

祖父母父母父母孩子祖父母页面有一个ACF自定义字段来选择颜色。ACF Page Type

我想在祖父母、父母和孩子的页面上应用这种颜色选择。

在循环中,我编写了以下代码来获取祖父母的颜色选择:

<div class="<?= get_field(\'colour\', $post->post_parent); ?>">
假设我选择了红色。

以下是前端结果:

祖父母(红色)父母(红色)父母(红色)父母(红色)父母(红色)父母(红色)祖父母(红色)祖父母(红色)祖父母(红色)祖父母(红色)祖父母。子页面未返回任何颜色(null)。

如何也包括子页面?

2 个回复
最合适的回答,由SO网友:Jacob Peattie 整理而成

据我所知,祖先页面的级别没有限制,因此任何解决方案都不应该依赖于具体引用特定的祖先。最好的解决方案是获取页面所有祖先的列表,并在其上循环,直到找到字段的值。然后停止循环并返回找到的值。功能get_post_ancestors() 可用于:

$colour = null;

/**
 * Get the IDs of the page\'s ancestors into a list.
 */
$page_ids = get_post_ancestors( $post );

/**
 * Put the current page\'s ID at the beginning of the list so we don\'t have to 
 * handle it separately.
 */
array_unshift( $page_ids, $post->ID );

/**
 * Loop over pages and find the first one with a colour.
 */
foreach ( $page_ids as $page_id ) {
    $maybe_colour = get_post_meta( \'colour\', $page_id, true );

    /**
     * If the page has a value for colour, put it in the colour variable and 
     * stop the loop.
     */
    if ( $maybe_colour ) {
        $colour = $maybe_colour;
        break;
    }
}

echo $colour;
为了节省模板中的空间,您可以将其添加到函数中,并在模板中使用该函数:

function wpse_310439_get_the_colour( $post = 0 ) {
    $post = get_post( $post );

    $page_ids = get_post_ancestors( $post );

    array_unshift( $page_ids, $post->ID );

    $colour = null;

    foreach ( $page_ids as $page_id ) {
        $maybe_colour = get_post_meta( \'colour\', $page_id, true );

        if ( $maybe_colour ) {
            $colour = $maybe_colour;
            break;
        }
    }

    return $colour;
}
然后在模板中:

<div class="<?php echo esc_attr( wpse_310439_get_the_colour() ); ?>">

SO网友:WebElaine

我不太确定你的祖父母页面是如何获得这种风格的,因为你的代码说要从父母那里获取字段。祖父母的后父母应为0,这意味着他们没有父母。也许你的等级制度中我遗漏了一些东西。

条件应在此处起作用:

(假设您已经指定global $post 在模板中):

<div class="<?php
// if this is a top-level post, grab its field
if($post->post_parent == 0) { ?>
    // output the field - no need to pass an ID as it is the ID of this post
    the_field(\'colour\');
// if this is not a top-level post (child, grandchild, or so forth)
} else {
    // get all of this post\'s ancestors: parent, grandparent, and so forth
    $ancestors = get_post_ancestors();
    // get the last item in the array - the "top" parent (grandparent)
    $id = end($ancestors);
    // now pull its field
    the_field(\'colour\', $id);
} ?>
">
实现相同效果的非ACF方法是将所需的类添加到<body> 中的类functions.php:

<?php // add a filter to the body_class() function
add_filter(\'body_class\', \'wpse_310439\');
function wpse_310429($classes) {
    // pull ancestors of the current page/post/cpt
    $ancestors = get_post_ancestors();
    // if this is a particular page ID, or a child of that ID
    if(is_page(\'12345\') || end($ancestors) == \'12345\') {
        // add a class to the <body>
        $classes[] = \'blue\';
    } elseif(is_page(\'54321\') || end($ancestors == \'54321\') {
        $classes[] = \'yellow\';
    }
    // always return $classes so body gets regular classes
    return $classes;
} ?>
通过这种方式,您可以在主题文件中设置类,并且还需要使用级联来针对任何需要着色的div(而不是.blue 您可以使用以下内容body.blue div.styleme), 但不需要插件。:)

结束

相关推荐