wordpress自定义字段自定义域插件Advanced Custom Fields

wordpress自定义字段功能使用非常广泛,前面介绍了《WordPress添加自定义字段栏目面板》是通过代码实现的,对于主题开发都而言无形中增加了不少工作量,对于不擅长代码的博主来说扩展难度偏大,需要的功能不易实现。而通过Advanced Custom Fields插件可以快速地实现可视化编辑器、文本字段、文本域、图像、文件、单选按钮、复选框、页面链接、文章选择、日期选择器、颜色选择器等自定义字段。此外插件还支持字段导出到XML或PHP。

插件使用教程:

  1. 下载插件后把解压出的advanced-custom-fields文件夹上传到wp-content/plugins/目录,登陆博客后台,在已安装插件列表中启用该插件;
  2. 在后台左栏新增的“字段”选项卡下点击“字段”进入字段和表单域界面,点击“新建”添加新字段组,输入标题后,点击“添加字段”,其中字段名称使用英文字母,其余的根据自己的需要进行设置:
    wordpress自定义字段自定义域插件Advanced Custom Fields
  3. 设置完成后,点击“发布”,写文章的时候,底部就会出现刚刚添加的字段:
    wordpress自定义字段自定义域插件Advanced Custom Fields
  4. 在当前主题要显示字段的地方添加调用代码:
    1
    
    <?php the_field('field_name'); ?>

    field_name代表字段名称,在添加字段时“字段名称”中填写的内容,只能输入字母和下划线。

  5. 保存文件即可。

插件下载:DownLoad

以上是简单的应用,下面是部分扩展教程:

返回字段的值:the_field()会直接显示字段的值,要返回的话,就要用get的方式。

1
2
3
4
<?php
$variable = get_field('field_name');
// 现在可以使用$variable了
?>

使用前判断值是否存在:如果(value == “” || value == null || value == false),则get_field()返回false,这样就可以先判断值是否存在,再输出。

1
2
3
4
5
6
<?php
if(get_field('field_name'))
{
    echo '<p>' . get_field('field_name') . '</p>';
}
?>

处理数组类型的返回值:插件中image、file等类型可以用数组形式(如选择image object)返回更多的数据,而不仅仅是只返回image url或者file url。下面的代码演示先用get_field()获取数组,在用foreach循环读取数组元素的方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
$values = get_field('field_name');
if($values)
{
    echo '<ul>';
    foreach($values as $value)
    {
        echo '<li>' . $value . '</li>';
    }
    echo '</ul>';
}
// 用var_dump()看一看$values的真面目吧
var_dump($values);
?>

处理返回url的image类型:如果创建image type时选择返回url,代表返回值是一个字符串,所以显示方法如下。

1
<img src="<?php the_field('image_test'); ?>" alt="" />

处理返回ID的image类型:如果创建image type时选择返回image ID,则返回值会是一个整数,我们当然不想显示整数,要根据这个ID获取更多信息。

1
2
<?php $image = wp_get_attachment_image_src(get_field('image_test'), 'full'); ?>
<img src="<?php echo $image[0]; ?>" alt="<?php echo get_the_title(get_field('image_test')) ?>" />

获取Repeater Field的值:Repeater Field是ACF的付费组件,repeater field的值可以由 get_field、 the_repeater_field /the_sub_field获取

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<?php
// 方法一:直接使用数组方式操作,$rows是一个数组
$rows = get_field('repeater_field_name');
if($rows)
{
    echo '<ul>';
    foreach($rows as $row)
    {
        echo '<li>sub_field_1 = ' . $row['sub_field_1'] . ', sub_field_2 = ' . $row['sub_field_2'] .', etc</li>';
    }
    echo '</ul>';
}
// 方法二:使用has_sub_field + get_sub_field的组合获取
if(get_field('repeater_field_name'))
{
    echo '<ul>';
    while(has_sub_field('repeater_field_name'))
    {
        echo '<li>sub_field_1 = ' . get_sub_field('sub_field_1') . ', sub_field_2 = ' . get_sub_field('sub_field_2') .', etc</li>';
    }
    echo '</ul>';
}
//方法三:使用the_repeater_field + the_sub_field的组合获取
if(get_field('repeater_field_name')): ?>
    <ul>
    <?php while(has_sub_field('repeater_field_name')): ?>
        <li>sub_field_1 = <?php the_sub_field('sub_field_1'); ?>, sub_field_2 = <?php the_sub_field('sub_field_2'); ?>, etc</li>
    <?php endwhile; ?>
    </ul>
<?php endif; ?>

随机获取repeater fleid中的一个元素:

1
2
3
4
5
6
<?php
$rows = get_field('repeater_field_name');
$row_count = count($rows);
$i = rand(0, $row_count - 1);
echo $rows[$i]['sub_field_name'];
?>

从非当前页面获取数据:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
 //要获取数据的页面的post ID
$other_page = 12;
//直接显示内容
?>
<p><?php the_field('field_name', $other_page); ?></p>
<?php
//不直接显示,先将值赋给一个变量
// get variable
$variable = get_field('field_name', $other_page);
// 以repeater类型为例  -注意 the_sub_field和get_sub_field函数不需要post ID参数
if(get_field('repeater_field_name', $other_page))
{
    echo '<ul>';
    while(has_sub_field('repeater_field_name', $other_page))
    {
        echo '<li>sub_field_1 = ' . get_sub_field('sub_field_1') . ', sub_field_2 = ' . get_sub_field('sub_field_2') .', etc</li>';
    }
    echo '</ul>';
}
?>

使用ACF的值查询数据:本质是根据custom field的值查询post。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
$posts = get_posts(array(
    'numberposts' => -1,
    'post_type' => 'event',
    'meta_key' => 'location', //acf中定义
    'meta_value' => 'melbourne'
));
if($posts)
{
    echo '<ul>';
    foreach($posts as $post)
    {
        echo '<li><a href="' . get_permalink($post->ID) . '">' . get_the_title($post->ID) . '</a></li>';
    }
    echo '</ul>';
}
?>

Shortcode方式:

1
[acf field="field_name"]

使用这个shortcode,就可以直接在所见即所得编辑器中使用ACF的值,不过有一些局限性:只能获取当前文章的ACF内容,还有对repeater field不适用

使用例子:

1
his is a story about a boy named [acf field="name"]. He is [acf field="age"] years old.

扩展部分转自:Solagirl

发表留言