특정 맞춤 게시물 유형에 대한 메타 데이터 만 저장하려면 어떻게합니까?


16

이 튜토리얼에 따라 사용자 정의 게시물 유형을 설정하려고합니다 . 그러나, 나는 어떻게 / 어떻게 구현 해야할지 혼란스러워합니다 update_post_meta(). 튜토리얼에서는이 패턴을 제안합니다.

add_action('save_post', 'save_my_metadata');

function save_my_metadata()
{
    global $post;
    update_post_meta($post->ID, 'my_metadata', $_POST['my_metadata']);
}

어느 것이 작동하지만 메타 데이터가이 사용자 정의 유형에 속하는지 여부에 관계없이 각 게시물에 메타 데이터를 추가하는 것은 불행한 효과가 있습니다.

위의 내용을 넣고 functions.php문제의 일부일 것으로 추측합니다. 내 사용자 정의 유형의 게시물에 대해서만 트리거하도록 'save_post'작업을 제한해야한다고 생각합니다.


좋은 질문 Bobby Jack하지만 "특정 사용자 정의 게시물 유형에 대한 메타 데이터 만 저장하는 방법"과 같은 질문에 제목을 다시 물어볼 수 있습니다. 사람들이이 문제에 대한 해결책을 찾을 때 인식하기에는 제목이 너무 일반적입니다.
MikeSchinkel

@Mike : 완료 (완전히 제안에 동의, 감사합니다!)
Bobby Jack

답변:


18
function save_my_metadata($ID = false, $post = false)
{
    if($post->post_type != 'your_post_type')
        return;
    update_post_meta($ID, 'my_metadata', $_POST['my_metadata']);
}

작동합니다. 'your_post_type'을 게시물 유형의 이름으로 바꾸십시오. 또한 알려진 사실이 거의 없습니다. 'save_post'후크는 게시물의 ID를 인수로 전달합니다.

편집하다

Jan의 의견을 반영하여 기능을 업데이트했습니다. 고마워요 Jan!


1
게시물 자체를 두 번째 인수로 추가 하기 때문에 전역 변수를 사용할 필요가 없습니다.
Jan Fabry

이 솔루션은 효과가 있습니다 ... 나는 많은 성공을 거두기 전에 클라이언트 프로젝트에서 사용했습니다.
EAMann

훌륭합니다-매력처럼. 그리고 "if ($ post-> post_type == 'animal') {update_post_meta ($ ID,"number_of_legs ", $ _POST [ 'number_of_legs']);} else if ($를하는 것이 합리적이라고 가정합니다 post-> post_type == 'vehicle') {update_post_meta ($ ID, "number_of_wheels", $ _POST [ 'number_of_wheels']);} // ... 등 ... 여러 가지 다른 게시물 유형을 처리하려면? 댓글의 서식 기능이
Bobby Jack

실제로 여러 가지 포스트 유형의 경우 switch 문을 대신 사용하는 것이 좋습니다. 더 적은 마크 업, 더 빠른 성능, 향후 케이스 추가가 용이합니다.
EAMann

@EAMann-yup, 쓰기 중반에 스위치가 더 좋을 것이라고 알았지 만 주석은 코드 편집을 시작하기에 이상적인 장소가 아니므로 게으 르기 시작했습니다.)
바비 잭

4

여러 게시물 유형을 처리하려면 기본 switch 문을 사용하는 것이 좋습니다.

add_action('save_post', 'save_my_metadata');

function save_my_metadata($ID = false, $post = false)
{
    switch($post->post_type) 
    {
        case 'post_type_1':
            // Do stuff for post type 1
            update_post_meta($ID, 'my_metadata', $_POST['my_metadata']); // Example...
            break;
        case 'post_type_2':
            // Do stuff for post type 2
            break;
        default:
            return;
    }
}

경우는 기본적으로 동일 if($post->post_type) == 'post_type_1') {}하지만 여러 if-else 블록이 필요하지 않습니다. default스위치 의 블록은 게시물 유형이 사용자 정의 세트에없는 경우를 처리합니다.


4

@John P Bloch와 @EAMann은 이미 큰 답변을 받았고 내 것이 추가되었습니다.

  1. 치다 밑줄로 meta_keys 접두어 . 이렇게하면 게시물 편집 화면에 표시된 사용자 정의 필드 목록에서 해당 필드가 숨겨집니다.

    save_my_metadata 함수 ($ post_id, $ post = false) {
       if ($ post-> post_type == 'your_post_type')
          update_post_meta ($ post_id, '_my_metadata', $ _POST [ 'my_metadata']);
    }
    
    필드를 편집 할 수 있으려면 사용자 정의 메타 박스가 필요합니다. 컨텍스트 편집 화면은 다음과 같습니다.



  2. 또 다른 방법은 특정 게시물 유형을 더 쉽게 저장하기 위해 자신의 후크를 추가하는 것입니다. 즉, 후크는 " save_{$post_type}_post"일 수 있습니다 . A에 대한 movie포스트 유형이 될 것이다 save_movie_post. 테마 functions.php파일 또는 플러그인 어딘가에 추가해야 할 내용은 다음과 같습니다 .

    add_action ( 'save_post', 'save_custom_post_type_posts', 10,2);
    save_custom_post_type_posts ($ post_id, $ post = false) 함수 {
       do_action ( "save _ {$ post-> post_type} _post");
    }
    
    이를 통해 다음과 같이 원래 코드를 다시 작성할 수 있습니다 (위의 # 1 밑줄 트릭 포함).

    add_action ( 'save_my_postype_post', 'save_my_postype_metadata', 10,2);
    함수 save_my_postype_metadata ($ post_id, $ post) {
        update_post_meta ($ post_id, '_my_metadata', $ _POST [ 'my_metadata']);
    }

1

개인적으로 게시물 유형에 사용자 정의 메타 핸들러를 추가하려면 아래 패턴을 선호합니다. 아래에서 add_post_type_support ( 'my_post_type', 'subtitle')을 호출하여 지원 키 (아래 예제의 '자막')를 게시물 유형의 지원 배열에 추가하여 게시물 유형에 메타 지원을 추가 할 수 있습니다.

class Subtitle_Meta_Handler {
    public function initialize() {
        add_action('add_meta_boxes', array($this, 'add_metabox'), 10, 2);
        add_action('save_post', array($this, 'update'));
    }

    public function add_metabox($post_type, $post)
    {
        if(post_type_supports($post_type, 'subtitle'))
        {
            add_meta_box('subtitle', 'Subtitle', array($this, 'metabox'), $post_type);
        }
    }

    public function metabox($post)
    {
        $subtitle = get_post_meta($post->ID, 'subtitle', true);
        if(!$subtitle)
        {
            $subtitle = '';
        }
        ?>
        <input type="text" style="width: 70%;" value="<?php echo esc_attr($subtitle);?>" name="subtitle" id="subtitle">
        <?php
        wp_nonce_field('update_subtitle', 'subtitle_nonce');
    }

    public function update($post_id)
    {
        if(wp_is_post_autosave($post_id) || wp_is_post_revision($post_id)) {
            return $post_id;
        }
        if(isset($_REQUEST['subtitle_nonce']) && wp_verify_nonce($_REQUEST['subtitle_nonce'], 'update_subtitle')) {
            $subtitle = trim(strip_tags($_REQUEST['subtitle'], '<b><strong><span><a>'));
            if(empty($subtitle)) {
                delete_post_meta($post_id, 'subtitle');
            } else {
                update_post_meta($post_id, 'subtitle', $subtitle);
            }
        }
    }
}
add_action('init', array(new Subtitle_Meta_Handler(), 'initialize'));

이 같은 것이 곧 코어에 추가되기를 바랍니다.


0

업데이트 전에 현재 게시물이 게시물 유형인지 확인하십시오. 모든 게시물에 저장하지 않아도됩니다.

입력 내용도 확인해야합니다 (예제에서 누락 됨). 그 옆에는 해당 포스트 유형이 활성화 된 경우에만 작업을 추가 할 수 있습니다. 이 경우 나중에 해당 포스트 유형을 확인할 필요가 없습니다.

게시물 유형 얻기 : get_post_type()또는$post->post_type;


0

게시물이 업데이트 된 후이 값을 삽입하여 다른 사용자 정의 필드에서 값을 검색 할 수 있기 때문에이 작업을 수행 할 수 없습니다-잘못된 일이 확실하지 않지만 save_post 대신 post_updated 후크를 사용하려고합니다. .

 function update_meta ($ID = false, $post = false) {
  update_post_meta($ID, 'rest_long', 'Test 1');
  update_post_meta($ID, 'rest_lat', 'Test 2');
}

add_action('post_updated', 'update_meta');

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