【问题标题】:Including ACF (Advanced custom fields) in a custom theme or plugin: Exporting fields on distribution在自定义主题或插件中包含 ACF(高级自定义字段):在分发时导出字段
【发布时间】:2017-05-01 11:12:46
【问题描述】:

我正在开发一个自定义主题,并在该主题中包含了 acf pro,如 docs 中所述。主题工作正常,并且在主题激活时激活了 acf。这是代码。

// customize ACF path
add_filter('acf/settings/path', 'my_acf_settings_path');
function my_acf_settings_path( $path ) {
    $path = get_stylesheet_directory() . '/inc/advanced-custom-fields-pro/';
    return $path;
}
// customize ACF dir
add_filter('acf/settings/dir', 'my_acf_settings_dir');
function my_acf_settings_dir( $dir ) {
    $dir = get_stylesheet_directory_uri() . '/inc/advanced-custom-fields-pro/';
    return $dir;
}
// Include ACF
include_once( get_stylesheet_directory() . '/inc/advanced-custom-fields-pro/acf.php' );

我现在面临几个小时的问题是由于我想在 acf 中实例化的组/字段。我有一些希望在全新安装时显示的字段组。以下是我尝试过的方法:

方法一: 我已将字段作为 json 导出到名为 acf-json 的文件夹中。 ACF 确实识别它并显示为同步字段。但是当我尝试同步它时,它只会创建一个新的空字段。

方法二: 我也尝试将字段组导出为 php 文件,然后将其包含在我的 functions.php 文件中,但 acf 无法识别此代码。

【问题讨论】:

  • 我从未尝试过这样做,但有一种方法可以以编程方式创建字段组和字段。然后你可以在你的主题中包含一个定义你的字段的 php 文件。 advancedcustomfields.com/resources/register-fields-via-php
  • Joe 提到的就是我推荐的。我已经做到了,并且有效。
  • 谢谢大家,我知道 php 导出功能,但我正在考虑更精简的东西。如果有兴趣,我已经在下面的答案中解释了我的解决方案。

标签: json wordpress wordpress-theming advanced-custom-fields


【解决方案1】:

在主题或插件中分发 ACF 有点棘手,因为文档中缺少信息。棘手的部分是使用您的主题和插件导出您的字段,这样您的用户不必做任何与他们习惯使用任何其他主题或插件不同的事情。我将详细介绍该过程。

主题和插件开发:

参考official docs,将代码复制并粘贴到您的functions.php文件中以进行主题开发应该很容易,而对于插件开发,您可以将其添加到主插件文件中。这将完成这 4 项任务。

  1. 添加 ACF 路径
  2. 添加 ACF 目录
  3. 对客户端隐藏 ACF(如果需要)
  4. 包括 ACF

到目前为止,您所做的实际上并没有做任何特别的事情。它只会在您激活主题/插件时激活 ACF,并且在主题/插件停用时同样停用 ACF。

导出字段:(通过 JSON 同步)

在这个阶段,如果您分发主题/插件,它只会激活 ACF,但其中不会包含任何字段。 ACF 使用 JSON 来跟踪所有字段和字段组。默认情况下,ACF 将在主题的根目录中查找名为 acf-json 的文件夹。如果你有这个文件夹,那么 ACF 会自动为你添加或更新的每个字段组添加/更新一个新的 json 文件。

如果您想将其保留在您的包含文件夹中,您可以更改此文件夹的位置。不知何故,您无法更改主题的默认位置,但对于插件,您可以通过添加此代码。

add_filter('acf/settings/save_json', 'set_acf_json_save_folder');
function set_acf_json_save_folder( $path ) {
    $path = dirname(__FILE__) . '/includes/acf-json';
    return $path;
}
add_filter('acf/settings/load_json', 'add_acf_json_load_folder');
function add_acf_json_load_folder( $paths ) {
    unset($paths[0]);
    $paths[] = dirname(__FILE__) . '/includes/acf-json';
    return $paths;
}

现在,如果您与某人共享此主题/插件,当他们进入 ACF 时,他们应该会看到一个新的同步选项。在同步所有文件时,他们应该可以使用字段。

自动化同步过程:

如果您想完全隐藏 ACF,那么显然您不能让您的用户进入 ACF 并同步字段。因此,在这种情况下,您需要一个脚本来自动同步 json 文件夹中的所有字段。您可以将此代码添加到您的 functions.php 主题中或您的主插件文件中。您不必更改此脚本中的任何路径,因为在前面的代码中您已经告诉 ACF 从何处加载 JSON 文件。

add_action( 'admin_init', 'article_gamification_sync_acf_fields' );
function article_gamification_sync_acf_fields() {
    // vars
    $groups = acf_get_field_groups();
    $sync   = array();
    // bail early if no field groups
    if( empty( $groups ) )
        return;
    // find JSON field groups which have not yet been imported
    foreach( $groups as $group ) {

        // vars
        $local      = acf_maybe_get( $group, 'local', false );
        $modified   = acf_maybe_get( $group, 'modified', 0 );
        $private    = acf_maybe_get( $group, 'private', false );
        // ignore DB / PHP / private field groups
        if( $local !== 'json' || $private ) {

            // do nothing

        } elseif( ! $group[ 'ID' ] ) {

            $sync[ $group[ 'key' ] ] = $group;

        } elseif( $modified && $modified > get_post_modified_time( 'U', true, $group[ 'ID' ], true ) ) {

            $sync[ $group[ 'key' ] ]  = $group;
        }
    }
    // bail if no sync needed
    if( empty( $sync ) )
        return;
    if( ! empty( $sync ) ) { //if( ! empty( $keys ) ) {

        // vars
        $new_ids = array();

        foreach( $sync as $key => $v ) { //foreach( $keys as $key ) {

            // append fields
            if( acf_have_local_fields( $key ) ) {

                $sync[ $key ][ 'fields' ] = acf_get_local_fields( $key );

            }
            // import
            $field_group = acf_import_field_group( $sync[ $key ] );
        }
    }
}

**现在,当您分发主题/插件时,激活时它也会激活 ACF,然后复制所有 json 文件并执行它们。这将自动同步所有字段组,现在您甚至可以隐藏您的 ACF 插件,并且您的用户都不必进入 ACF 来同步字段,事实上他们甚至不必知道他们的站点上存在 ACF。其次,即使您在 ACF 中进行了新的更改,它也应该自动更新对 json 文件的更改。您现在甚至可以对它们进行版本控制以获得更好的控制。 **

【讨论】:

    猜你喜欢
    • 2019-04-11
    • 2018-08-15
    • 2018-09-17
    • 2018-05-01
    • 2017-08-15
    • 1970-01-01
    • 2015-05-02
    • 2016-01-20
    • 2018-07-11
    相关资源
    最近更新 更多