显示组中的整个字段(文件+ ACF)

时间:2017-07-27 09:27:38

标签: php wordpress advanced-custom-fields

我制作了包含要下载文件的ACF插件组。在组I中有“文件1”,“文件2”等字段。 我想显示所有附加文件到页面。可以显示属于组的所有字段吗?我尝试使用基本代码,但在这种情况下,我只有1个文件。

如何向此添加迭代或显示所有字段?

<?php

$file = get_field('attachment_1');

if( $file ): 

    // vars
    $url = $file['url'];
    $title = $file['title'];
    $caption = $file['caption'];

    if( $caption ): ?>

        <div class="wp-caption">

    <?php endif; ?>

<ul>
       <li><a href="<?php echo $url; ?>" title="<?php echo $title; ?>">

        <span><?php echo $title; ?></span>

    </a>
       </li>
<ul>

    <?php if( $caption ): ?>

            <p class="wp-caption-text"><?php echo $caption; ?></p>

        </div>

    <?php endif; ?>

<?php endif; ?>

1 个答案:

答案 0 :(得分:1)

由于您的所有字段都是单独设置的,因此不仅仅是循环遍历所有相同类型字段的数组(即只是您的文件字段)。

有几种方法可能适合您:

选项1。 如果文件的所有字段名称遵循相同的命名模式并按顺序命名,则可以使用名称循环。

示例,假设您的字段被命名为attachment_1至attachment_5:

$statement = get_field('name_of_your_statement_field');  
//do whatever you need to with $statement

for ($i=1; $i<=5; $i++){
    //use the number from the loop to find the file by name
    $file = get_field('attachment_'.$i);  
    if( $file ){
        // display file details as appropriate
    }
}

选项2。 如果文件字段名称不遵循相同的模式,则可以遍历字段名称数组。

示例:

$statement = get_field('name_of_your_statement_field');
//do whatever you need to with $statement

// Create an array with the field names of all your files
// N.B. This also lets you specify the order to process them
$file_fieldnames = array('file_1', 'file2', 'another_file'); 

foreach ($file_fieldnames as $fieldname) {
    $file = get_field($fieldname);
    if( $file ){
        // display file details as appropriate
    }
}

选项3。如果要遍历帖子/页面上的所有字段,可以将字段保存到数组中。

这看起来似乎是最常用的方法,但是由于你不知道每个字段的类型以便知道如何处理和显示它们而使事情变得复杂...你首先要做的找出它是什么字段类型。您可以通过名称(类似于上面)来执行此操作,或者您可以通过检查字段内容来尝试识别每个字段。

注意,检查字段内容是非常危险的,因为还有其他字段类型可以具有相似的特征(例如,文件不是唯一可以具有URL的类型)所以我不会建议该策略,除非您100%确定您永远不会更改字段组或将其他字段组添加到帖子/页面。

示例:

$fields = get_fields();
foreach ($fields as $fieldname => $content) {
    if (is_string ($content)){
        // display the string
    }
    else if (is_array($content) && $content['url']) { 
        // then you could assume its a file and display as appropriate
   }
}

请注意,此代码均未经过测试。但是,它应该让您了解每个选项背后的逻辑,以便您可以决定什么对您有用。

根据提供的新代码进行更新:

根据JSFiddle中的代码查看下面的内容。我忽略了文件列表之外的标题,因为它没有意义 - 每个文件都有自己的标题。

<?php

for ($i=1; $i<=5; $i++){
    //use the number from the loop to find the file by name
    $file = get_field('attachment_'.$i);  
    if( $file ){
        $url = $file['url'];
        $title = $file['title'];
        $caption = $file['caption'];
        // now display this file INSIDE the loop so that each one gets displayed:
        ?>
        <li>
            <a href="<?php echo $url; ?>" title="<?php echo $title; ?>" target="_blank">
            <span><?php echo $title; ?></span>
            </a>
            <?php if( $caption ): ?>
                <p class="wp-caption-text"><?php echo $caption; ?></p>
            <?php endif; ?>
        </li>
        <?php
    }    // end if 
}    // end for loop
?>
<ul>

如果您了解数组,我建议您将文件详细信息添加到数组中,然后再进行第二次循环以显示文件...但是我猜测你并不熟练使用基本的编码结构,因为你不了解循环,所以我试图保持简单。我强烈建议您在编写代码时做一些有关编程基础知识的教程。