게시물을 만들 때 기본 맞춤 입력란을 설정하는 방법이 있습니까?


11

새 게시물을 만들 때 "새로 추가"를 클릭 한 직후 에 게시물 편집기가 표시되면 드롭 다운 메뉴를 사용하고 사용할 사용자 정의 필드를 선택하지 않고 기본 사용자 정의 필드 입력을 이미 갖고 싶습니다. 열린 결말.

시각적으로 대신 :

여기에 이미지 설명을 입력하십시오

나는 다음과 같은 것을 갖고 싶다 :

여기에 이미지 설명을 입력하십시오

플러그인 (CPT, 기타 필드 등)이 있지만 기본 기능으로 간단한 플러그인을 사용하고 싶습니다.

나는 이와 같은 것을 시도했다 (나는 커스텀 포스트 타입 'product'을 사용하고있다) :

function register_custom_fields( $post_ID ) {

    global $wpdb;

        if( !wp_is_post_revision( $post_ID ) ) {

            add_post_meta( $post_ID, 'reference', '', true);
            add_post_meta( $post_ID, 'price', '', true);

        }

}

add_action('edit_product', 'register_custom_fields');

그러나 그것은 작동하지 않는 것 같습니다. 나는 훅이 잘못되었다고 생각 edit_post하지만 (업데이트 후 발생 하기 때문에 ) "새 게시물"에 대한 후크가 보이지 않습니다 (사용자가 wp admin에서 "새 게시물"을 클릭 한 직후). 있어요 ?

아니면 전체 아이디어가 잘못되었거나 다른 방법이 있습니까?

답변:


9

작업 후크 save_post가 저장시 호출되지만 현재 메타 데이터를 추가 할 수 있는지 모르겠습니다. 그러나 게시물이 조치 후크로 저장된 후 메타 데이터를 작성 / 업데이트 할 수 있어야합니다 updated_post_meta.

편집하다

사후 작성 화면에서 일부 메타 필드 (사용자 정의 필드)를 미리 선택하려면 먼저이 메타 값을 빈 값으로 추가해야합니다.

파일에서 post_custom_meta_box()함수 (사용 된 메타 박스에 대한 콜백 postcustom) wp-admin/includes/meta-boxes.php를 보면 함수가 list_meta()사전 선택된 메타 필드를 작성하는 데 사용되고 있음을 알 수 있습니다.

이제이 메타 박스가 표시 될 때까지 프로그램 흐름을 살펴 보겠습니다 (여기서 사용할 수있는 액션 / 필터 후크를 찾고 있습니다).

  1. 워드 프레스가 파일을로드 함 post-new.php
  2. 이 파일 39은 함수 에 따라 데이터베이스에 기본 게시물을 생성 합니다 get_default_post_to_edit(). 잘 됐네요 기본적으로 게시물은 자동 초안으로 데이터베이스에 이미 있습니다. 불행히도 현재 이러한 데이터를 변경하거나 새로운 것을 추가하기위한 후크가 없습니다.
  3. 다음 단계로 파일 edit-form-advaned.php이 포함됩니다. 이 파일은 홀 관리 페이지를 생성 supports하며 게시 유형 의 매개 변수를 기반으로 필요한 모든 메타 박스를 포함합니다 .
  4. 온라인 136으로 사용자 정의 필드 메타 박스 postcustom가 포함되고 위의 함수가 호출됩니다. 다시, 우리가 사용할 수있는 행동 고리가 없습니다.

결론

나는 당신이 할 수있는 유일한 방법은 jQuery를 사용하거나 postcustom메타 박스를 오버로드 하고 list_meta()함수 를 실행하기 전에 메타 값을 추가하는 것입니다.

예 :

add_action('admin_menu', 'wpse29358_replaceMetaBoxes'); // maybe add_meta_boxes hook
function wpse29358_replaceMetaBoxes() {
    remove_meta_box('postcustom', {POST_TYPE}, 'normal');
    add_meta_box('postcustom', __('Custom Fields'), 'wpse29358_postcustomMetabox', {POST_TYPE}, 'normal', 'core');
}

function wpse29358_postcustomMetabox($post) {
    // Add your meta data to the post with the ID $post->ID
    add_post_meta($post->ID, 'key', 'value');

    // and then copy&past the metabox content from the function post_custom_meta_box()
}

문제는 저장하기 위해 아무것도 추가하지 않고 있다는 것입니다. 사용자가 편집 페이지에 도착하면 이미 열린 일부 사용자 정의 필드 입력을 표시하려고합니다 (스크린 샷 업데이트 참조)
mike23

아 이제 나는 당신의 문제를 이해합니다. 내 답변을 편집했습니다.
rofflox

3

맞춤 입력란 지원을 추가하는 적절한 방법입니다 (게시물을 편집 할 때 빈 입력란이 표시되지 않음)

function set_default_meta($post_ID){
    $current_field_value = get_post_meta($post_ID,'Sort Order',true);
    $default_meta = '100'; // value
    if ($current_field_value == '' && !wp_is_post_revision($post_ID)){
            add_post_meta($post_ID,'Sort Order',$default_meta,true);
    }
    return $post_ID;
}
add_action('wp_insert_post','set_default_meta');

1

모든 게시물 유형에서 실행되는 게시물 유형을 확인하여 save_post 작업을 사용하고 작업을 격리해야합니다. 분명히 당신을 위해 작동하도록하기 위해 더 많은 논리가 있어야합니다. 포스트 메타 필드를 비워 두려는 경우 사용자가 좌절하지 않도록 기본값을 한 번 설정했는지 확인하는 포스트 메타 필드를 설정해야합니다.

코드 예제에서 볼 수 있듯이 기본값을 null로 설정하려면 오버 헤드가 추가되고 포스트 메타 필드가 기본적으로 값으로 채워지지 않기 때문에 함수를 만들지 마십시오.

function register_custom_fields( $post_ID ) {
    //Do nonce checking here
    if( !wp_is_post_revision( $post_ID ) ) {
        if('product' === $_REQUEST['post_type']){
            $reference = $_REQUEST['reference'] ? esc_html($_REQUEST['reference']) : 'default_value';
            $price = $_REQUEST['price'] ? esc_html($_REQUEST['price']) : 'default_value';
            update_post_meta( $post_ID, 'reference', $reference);
            update_post_meta( $post_ID, 'price', $price);
        }
    }
}
add_action('save_post', 'register_custom_fields');

1

개발중인 WP 사이트의 각 사용자 지정 게시물에 대해 고유 한 메타 설명을 갖고 싶습니다. 또한 기본 사용자 정의 필드를 찾고 여기에 착륙했습니다.

나는 이것이 꽤 오래된 게시물이라는 것을 알고 있지만 mariokostelac.com 에서 찾은 간단한 답변을 게시 할 것이라고 생각 했습니다 .

kg은 내 네임 스페이스이므로 원하는 이름으로 함수의 이름을 지정할 수 있습니다. 나는 후크와 WP 커스터마이징에 익숙하지 않지만 wp_insert_post가 찾고있는 후크라고 생각합니다.

add_action('wp_insert_post', 'kg_set_default_custom_fields');

function kg_set_default_custom_fields($post_id)
{
    if ( $_GET['post_type'] != 'page' ) {
        add_post_meta($post_id, 'meta-description', '', true);
    }

    return true;
}

참고 : 있습니다 get_post_type(). 또한 느슨한 비교를 수행 할 때는 YODA 스타일 조건 구문을 사용해야합니다.
카이저

@kaiser YODA 스타일은 무엇을 의미합니까? 또한 왜 get_post_type($post_id) 보다 낫 $_GET['post_type']습니까?
Aziz

1
비교하기 전에 값을 사용하십시오 'page' === $_GET['post_type']. 그렇지 않으면 단일 값을 잊었을 때 두 값을 비교하는 대신 값 =할당 하는 상황이 발생할 수 있습니다. 그리고 그것은 데이터베이스에서 쓰레기로 끝날 것입니다. === 유형 안전 비교 를 사용하고 싶을 수도 있습니다 (값은 page?이고 유형은 string?).
kaiser

1
@kasier 내가 본-그래서 최종 코드는 다음과 같습니다 : 'page' === get_post_type($post_id) ?
Aziz

-1

어떤 사람이 게시물 유형별로 사용자 정의 필드를 가져 가야하는 경우 내가 한 방식으로 아래 코드를 남겨두고 잘 작동합니다. :)

function awh_field_type($post_id){
$awh_f_post = get_post_type($post_id);
$meta_value = '';
$meta_name = 'custom';
    if($awh_f_post == 'product'){
        add_post_meta($post_id,$meta_name,$meta_value,true);
    }
return $awh_f_post;

} add_action ( 'wp_insert_post', 'awh_field_type');

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.