Wordpress ACF:使用页面(具有特定页面模板)作为 CPT 存档页面

Wordpress ACF: Using a page (with a specific page template) as a CPT archive page

我正在使用 ACF 在两个区域创建具有独立灵活布局部分的页面,主要页面部分区域和侧边栏区域。

我有一个名为 case-studies 的 CPT,并创建了一个名为 case-studies 的页面。我在 CPT 中设置了 'has_archive' => false,,希望该页面被使用,但是(我理解)这有一个层次结构,所以如果没有给出存档,那么它将加载我的 home.php (这就是我在新闻中使用的 posts post 类型)。

有什么方法可以将页面用作 CPT 的存档吗?目前我能看到的唯一解决方案是使用 ACF CPT Options Pages 插件并将我创建的 ACF 字段附加到我的 'Case Studies Archive' 页面但是,我必须复制我的所有代码以便它们可以称为正确的内容。例如:

the_field('field_name');the_field('field_name', 'cpt_case-studies');

有没有人能够使用一个页面作为 CPT 的存档,并为页面分配一个模板,该模板既查询 CPT posts 又从页面中获取 ACF 字段?

非常感谢您的帮助。如果还有什么我可以提供的,请告诉我。

最好的方法是将 has_archive 参数设置为 true,然后在您的主题中创建一个 archive-case-studies.php 模板。您仍然可以使用 ACF 中的自定义字段。当您使用 the_field() and the_get() 时,第二个接受的参数是 post id,但这是根据当前全局对象自动设置的。

例如:

<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>

    <?php the_field( 'custom_field', $post->ID ); ?>

<?php endwhile; endif; ?>

等同于:

<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>

    <?php the_field( 'custom_field' ); ?>

<?php endwhile; endif; ?>

长话短说;使用带有自定义模板的存档页面,您将能够毫无问题地实现我认为您所追求的目标。如果你这样做,它比滚动自定义的东西要少得多,因为归档页面可能会很痛苦。

基于 Daniel James 的回答,我创建了一个函数,其中包含一个数组,其中包含我需要获取 ID 以将其内容添加到特定存档页面的所有页面。

function getOtherPageID($page = null) 
{
    global $post; 
    $postIDs = [
        'case-studies' => 42, // 42 being the page ID of the content I need
    ];

    if(array_key_exists($page, $postIDs)) :
        $id = $postIDs[$page];
    endif;

    return $id;
}

通过在我的 archive-case-studies.php 模板页面(或任何其他存档模板)中调用 $id = getOtherPageID('case-studies');,我能够获取我需要的 ID,然后将其添加到 ACF 字段中。然后在每个相应的 ACF 字段调用中,我只需将 $id 添加到 ACF 字段调用中:get_field('field_name', $id);

希望这对其他人有所帮助。

----更新----

我没有输入 post ID(在上面的例子中是 42),而是修改为使用 get_page_by_path(); 函数。因此,我的函数是:

function getOtherPageID($page = null) 
{
    global $post; 
    $postIDs = [
        'case-studies' => get_page_by_path( $page ),
    ];

    if(array_key_exists($page, $postIDs)) :
        $id = $postIDs[$page]->ID;
    endif;

    return $id;
}

现在将获取 post 对象,然后 $id 将设置为 post 对象的 ID,然后返回。