it-swarm-ko.tech

특정 사용자 정의 게시물 유형에 대해서만 메타 데이터를 저장하려면 어떻게합니까?

나는 이 튜토리얼 다음에 사용자 정의 게시 유형을 설정하려고합니다. 그러나, 나는 어떻게/어디서 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'작업을 내 사용자 정의 유형의 게시물에 대해서만 트리거하도록 제한해야한다고 생각합니다.

15
Bobby Jack
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의 코멘트를 반영하도록 함수를 업데이트했습니다. 감사합니다 잰!

16
John P Bloch

여러 게시물 유형을 처리하려면 기본 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
EAMann

@ John P Bloch와 @EAMann은 이미 큰 답변을주었습니다.

  1. 중히 여기다 meta_keys 앞에 밑줄을 붙입니다.. 이렇게하면 게시물 수정 화면에 표시된 맞춤 입력란 목록 (예 :.

    ($ post-> post_type == 'your_post_type') 
     update_post_meta ($ post_id, '_my_metadata', $ _POST [ 'my_metadata'] 함수는 save_my_metadata ($ post_id, $ post = false) ]); 
    } 
    
    물론 필드를 편집 할 수 있도록 사용자 지정 대사 물이 필요하다는 것을 의미합니다. 다음은 컨텍스트 편집 화면입니다.



  2. 네가 할 수있는 또 다른 일은 자신 만의 훅을 추가하여 특정 게시물 유형을 더 쉽게 저장할 수있게하는 것입니다. 즉 훅이 "save_{$post_type}_post"일 수 있습니다. movie 게시물 유형의 경우 save_movie_post가됩니다. 다음은 테마의 functions.php 파일이나 플러그인에 추가해야하는 사항입니다.

    [save_post_type_posts ', 10,2); [save_cost_post_type_posts', 10,2); [save_post_type_posts] > post_type} _post "); 
    } 
    
    그런 다음 원래 코드를 다시 작성할 수 있습니다 (위 # 1의 밑줄 트릭 포함).

    [_____.] update_post_meta ($ post_id, '_my_metadata', $ post_id, $ post) {save_my_postype_post_post ','save_my_postype_metadata ', 10,2); _POST [ 'my_metadata']); 
    }
4
MikeSchinkel

개인적으로, 게시 유형에 맞춤 메타 핸들러를 추가하는 경우 아래 패턴을 따르는 것을 선호합니다. 아래에서는 add_post_type_support ( 'my_post_type', 'subtitle')을 호출하여 게시 유형에 대한 지원 배열에 지원 키 (아래 예제에서 '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'));

희망적으로 이것과 같은 것이 곧 코어에 추가 될 것입니다.

1
prettyboymp

이 일을 할 수 없어 - 무슨 일을 잘못했는지 모르겠지만 -하지만 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');
0
jrutter

사전 업데이트는 현재 게시물이 게시물 유형인지 여부를 확인합니다. 그러면 모든 게시물에 대해 저장하지 않을 것입니다.

입력 내용도 확인해야하며 (예에서는 누락 됨) 해당 게시물 유형이 활성 상태 일 때만 작업을 추가 할 수 있습니다. 이 경우 나중에 해당 포스트 유형을 확인할 필요가 없습니다.

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

0
hakre