programing

WordPress 데이터베이스에서 Advanced Custom Fields 필드 키를 가져오려면 어떻게 해야 합니까?

css3 2023. 3. 26. 11:40

WordPress 데이터베이스에서 Advanced Custom Fields 필드 키를 가져오려면 어떻게 해야 합니까?

포스트 타입과 함께 고급 사용자 지정 필드를 사용하고 있습니다.선택한 커스텀 필드가 몇 개 있는데 각 필드의 모든 라벨 선택 항목을 표시하고 싶습니다.

저도 이렇게 해봤어요.

$field = get_field_object('hair_color');
$hair = $field["choices"];
    foreach($hair as $value){

을 하다

var_syslog 필드)

비어 있는 것 같습니다.

array(18) { 
   ["key"] => string(16) "field_hair_color" 
   ["label"] => string(0) "" 
   ["name"] => string(10) "hair_color" 
   ["_name"] => string(10) "hair_color" 
   ["type"]=> string(4) "text" 
   ["order_no"]=> int(1) 
   ["instructions"]=> string(0) "" 
   ["required"]=> int(0) 
   ["id"] => string(20) "acf-field-hair_color" 
   ["class"] => string(4) "text" 
   ["conditional_logic"] => array(3) { 
        ["status"] => int(0) 
        ["allorany"]=> string(3) "all" 
        ["rules"]=> int(0) 
   } 
   ["default_value"] => string(0) "" 
   ["formatting"] => string(4) "html" 
   ["maxlength"] => string(0) "" 
   ["placeholder"] => string(0) "" 
   ["prepend"] => string(0) "" 
   ["append"] => string(0) "" 
   ["value"] => bool(false) 
}

가득 채우는 유일한 방법은 다음과 같습니다.

get_field_object_field_51ac9d33d704';

array(17) { 
   ["key"] => string(19) "field_51ac9d333d704" 
   ["label"] => string(13) "Color de pelo" 
   ["name"] => string(10) "hair_color" 
   ["_name"] => string(10) "hair_color" 
   ["type"] => string(6) "select" 
   ["order_no"] => int(9) 
   ["instructions"] => string(27) "Selecciona el color de pelo" 
   ["required"] => int(0) 
   ["id"] => string(20) "acf-field-hair_color" 
   ["class"] => string(6) "select" 
   ["conditional_logic"] => array(3) { 
       ["status"] => int(0) 
       ["rules"] => array(1) { 
           [0] => array(3) { 
               ["field"] => string(19) "field_5195ef9879361" 
               ["operator"] => string(2) "==" 
               ["value"] => string(5) "small" 
           } 
       } 
       ["allorany"] => string(3) "all" 
   } 
   ["choices"] => array(5) { 
        ["bald"] => string(5) "Calvo" 
        ["brown"] => string(8) "Castaño" 
        ["brunette"] => string(6) "Moreno" 
        ["red"] => string(9) "Pelirrojo" 
        ["blonde"] => string(5) "Rubio" 
    } 
    ["default_value"] => string(0) "" 
    ["allow_null"] => int(1) 
    ["multiple"] => int(0) 
    ["field_group"] => int(90679) 
    ["value"]=> bool(false) 
}

하지만 저는 3가지 환경이 있고 필드 키를 하드코드로 만들고 싶지 않습니다.

무슨 방법이 있을까요?잘 부탁드립니다.

제가 직접 해보려고 조사를 좀 해봤어요ACF의 각 필드 및 필드 그룹은 커스텀 포스트 타입으로 데이터베이스의 wp_posts 테이블에 저장됩니다.필드는 'acf-field', 그룹은 'acf-field-group'입니다.

이 기능을 사용하여 필드가 없는 게시물에 대해 필드 키를 사용하여 update_field($field_key, $value)를 사용할 수 있었습니다.

function get_acf_key($field_name){
    global $wpdb;

    return $wpdb->get_var("
        SELECT post_name
        FROM $wpdb->posts
        WHERE post_type='acf-field' AND post_excerpt='$field_name';
    ");
}

그 후 다음을 사용할 수 있었습니다.

update_field(get_acf_key('my_field_name'), 'some value', $post_id);

이미 있는 투고에 대한 필드를 업데이트하거나 필드를 추가하고 필드가 없는 투고에 대한 주요 참조를 추가합니다.

다음은 "LIKE"의 정확한 meta_value와 일치하는 @BFDatabaseAdmin에 의해 제공된 답변의 수정 버전입니다.

function get_acf_key($field_name) {
  global $wpdb;
  $length = strlen($field_name);
  $sql = "
    SELECT `meta_key`
    FROM {$wpdb->postmeta}
    WHERE `meta_key` LIKE 'field_%' AND `meta_value` LIKE '%\"name\";s:$length:\"$field_name\";%';
    ";
  return $wpdb->get_var($sql);
}

난 다른 선택권을 던지고 있어.기존 답변은 좋다고 생각합니다만, 부모 그룹을 참조하지 않는 한 필드 이름은 여러 그룹에 걸쳐 존재할 수 있기 때문에 신뢰할 수 있는 필드 키를 얻을 수 없습니다.

예를 들어, 두 개의 사용자 정의 그룹이 있다고 가정합니다. 하나는 포스트 유형 북용이고 다른 하나는 사용자 정의 포스트 유형 동영상용입니다.두 그룹 모두 제목이라는 필드를 추가했습니다.

둘 다 '다'와 함께 됩니다.post_except = 'title' ★★★★★★★★★★★★★★★★★」post_type = 'acf-field' 두 .post_except의존하는 모든 쿼리는post_except와일드카드든 아니든 틀릴 거예요

Post ID에 의존하는 쿼리도 좋지 않습니다.Post가 항상 존재하는 것은 아니기 때문입니다.

따라서 이름에서 필드 키를 가져오려면 필드와 그룹을 조합하여 전달해야 합니다.이 스니펫은 나에게 매우 적합합니다.

if (! function_exists('acf_field_from_name')) {

    function acf_field_from_name($field, $group)
    {
        global $wpdb;

        return $wpdb->get_var($wpdb->prepare("
            SELECT post.post_name as field_name
            FROM $wpdb->posts AS post
            LEFT JOIN $wpdb->posts AS parent
                ON post.post_parent = parent.id
            WHERE post.post_excerpt = %s
                AND post.post_type = 'acf-field'
                AND parent.post_excerpt = %s
                AND parent.post_type = 'acf-field-group'
        ", $field, $group));
    }
}

이름 및 그룹에서 필드 키를 반환하고 없으면 null을 반환합니다.

사용방법:

acf_field_from_name('title', 'movie-fields'); // returns field_3333333333333

acf_field_from_name('title', 'book-fields'); // returns field_4444444444444

acf_field_from_name('plumbus', 'movie'); // returns null

ACF는 여러 환경을 동기화하는 몇 가지 쉬운 방법을 제공합니다. PHP 또는 로컬 JSON 파일에 필드를 등록할 수 있습니다.이렇게 하면 여러 환경에서 단일 필드 키로 get_field_object()를 계속 사용할 수 있습니다.참조:

http://www.advancedcustomfields.com/resources/register-fields-via-php/

http://www.advancedcustomfields.com/resources/local-json/

저는 보통 사용자 인터페이스를 사용하여 ACF를 개발하고 여러 환경에 배포하기 위해 모든 필드 그룹을 PHP로 내보냅니다.

간단한 예시로 업데이트:이 기능을 함수에 추가할 수 있습니다.php 또는 커스텀플러그인으로 여러 환경에 필드를 프로그래밍 방식으로 추가합니다.그런 다음 모든 환경에서 공통 field_key를 사용하여 get_field_object()를 호출합니다.

add_action('acf/init', 'wp123_add_local_acf_fields');
function wp123_add_local_acf_fields() {

    acf_add_local_field_group(array(
        'key' => 'group_1',
        'title' => 'My Group',
        'fields' => array (
            array (
                'key' => 'field_51ac9d333d704',
                'label' => 'Color de pelo',
                'name' => 'hair_color',
                'type' => 'select',
                'instructions' => 'Selecciona el color de pelo'
                'required' => 0,
                'choices' => array (
                    'bald' => 'Calvo',
                    'brown' => 'Castaño',
                    'brunette' => 'Moreno',
                    'red' => 'Pelirrojo',
                    'blonde' => 'Rubio',
                ),
                'default_value' => array (
                ),
                'allow_null' => 1,
                'multiple' => 0,
            )
        ),
        'location' => array (
            array (
                array (
                    'param' => 'post_type',
                    'operator' => '==',
                    'value' => 'post',
                ),
            ),
        ),
    ));

}

ACF가 동작하는 방법에서는, 정말로 키를 사용할 필요가 있습니다.

(http://www.advancedcustomfields.com/resources/get_field_object/) 에서)

$field_key는 항상 사용할 수 있고 사용해야 합니다.

$field_name을 사용할 때의 문제는 참조가 아직 존재하지 않으면 ACF가 필드 개체를 찾을 수 없으며 값을 저장할 수 없다는 것입니다.이 상황은, 코드를 사용해 투고를 삽입했을 경우에 발생합니다.

또한 field_key를 update_field 함수의 첫 번째 파라미터로 사용하는 것이 더 효율적입니다.이는 참조 룩업을 바이패스하기 때문입니다."

올바른 방법은acf_maybe_get_field다음과 같이 기능합니다.

acf_maybe_get_field( 'field_name', false, false );

인수는 다음과 같습니다.field name,post id(현직에 추가) 및 가장 중요한 것strict디폴트로는true단, 투고용으로 아직 존재하지 않는 필드 오브젝트라도 취득하기 위해 이 값을 여기에 설정합니다.

필드 이름으로 프로그래밍 방식으로 ACF 필드 키 가져오기

이름은 메타데이터이기 때문에 변경할 수 있는 반면, 키는 수동으로 데이터베이스를 편집하지 않고 변경할 수 없기 때문에 이름을 사용하여 키를 안정적으로 검색할 수 있는 방법은 없습니다.

단, 이 기능은 최신 버전의 ACF에서 동작하지만 몇 가지 주의사항이 있습니다.ACF는 커스텀 투고 타입의 ACF로서 투고내에 필드 그룹을 작성합니다만, 필드 자체에 관한 모든 데이터는 post_meta 테이블내에 보관 유지됩니다.

function get_acf_key($field_name) {

    global $wpdb;

    return $wpdb->get_var("
        SELECT `meta_key`
        FROM $wpdb->postmeta
        WHERE `meta_key` LIKE 'field_%' AND `meta_value` LIKE '%$field_name%';
    ");

}

경고: 필드 이름은 배열의 일부로 저장되므로 SQL을 통해 검색할 때 와일드카드 검색을 사용해야 합니다. 와일드카드 검색은 오류가 발생할 수 있습니다.모든 필드의 이름이 완전히 다르면 문제 없습니다. 그러나 예를 들어 "farm"이라는 필드와 "farmer"라는 필드가 있으면 두 필드가 모두 검색되므로 오류가 발생합니다.

필드를 갱신하는 신뢰할 수 있는 유일한 방법은 키를 수동으로 코드화하는 것입니다.단, 이것은 분명 투박하기 때문입니다.이것이 제가 처음에 여기 온 이유입니다.

같은 문제를 안고, 열쇠도 사용하게 되어, 열쇠의 가치를 얻을 수 있는 통상의 방법이 없는 막다른 골목에 다다랐지만, 운 좋게도 이것을 접하게 되었습니다.

취득처 - https://wordpress.stackexchange.com/questions/248006/acf-add-fields-values-to-newly-inserted-post

function acf_getValue($fieldname, $post_id){
    if(($value = get_field($fieldname, $post_id)))
        return $value;
    $value = get_post_meta($post_id, $fieldname);
    return $value[0];
}
function acf_updateValue($fieldname, $value, $post_id){
    $field_key = 'field_' . uniqid();
    update_post_meta($post_id, $fieldname, $value);
    update_post_meta($post_id, '_'.$fieldname, $field_key);
    update_field($field_key, $value, $post_id);
}

여기서 acf_updateValue는 수동으로 저장할 때 ACF 자체에 의해 실행되는 작업을 시뮬레이트합니다.ACF 컬럼에는 update_field만으로는 불충분하기 때문에

언급URL : https://stackoverflow.com/questions/21184015/how-to-get-advanced-custom-fields-field-key-from-wordpress-database