programing

WordPress 콜백 함수에서 게시 메타 가져오기

closeapi 2023. 7. 10. 22:23
반응형

WordPress 콜백 함수에서 게시 메타 가져오기

저는 제 첫 번째 WP 플러그인 작업 중이고, 막혔습니다.

콘텐츠 편집기 아래 게시 페이지에 사용자 정의 필드(필드 1)를 만들었습니다.올바르게 저장됩니다.:)

미디어를 추가할 때 미디어 라이브러리 팝업 내에 사용자 정의 필드(필드 2)를 만들었습니다.올바르게 저장됩니다.:)

제가 하고 싶은 것은 필드 1의 값을 필드 2의 기본값으로 사용하는 것입니다.

attachment_fields_to_edit 콜백 함수에 문제가 있는 것 같습니다.

$post는 이제 게시물 자체가 아닌 실제 "파일 첨부 게시물"을 참조하는 것으로 생각되므로 저장된 값을 참조할 때 다음과 같이 하십시오.

$post_meta = get_post_meta( $post->ID );

현재 게시물이 아닌 해당 첨부 파일과 관련된 모든 메타 데이터를 끌어오는 중입니다.실제 게시물에서 메타를 꺼내는 것이 가능합니까?

이 코드는 Codex에서 가져온 것입니다.

function my_add_attachment_location_field( $form_fields, $post ) {
    $field_value = get_post_meta( $post->ID, 'location', true );
    $form_fields['location'] = array(
        'value' => $field_value ? $field_value : '',
        'label' => __( 'Location' ),
        'helps' => __( 'Set a location for this attachment' )
    );
    return $form_fields;
}
add_filter( 'attachment_fields_to_edit', 'my_add_attachment_location_field', 10, 2 );

function my_save_attachment_location( $attachment_id ) {
    if ( isset( $_REQUEST['attachments'][$attachment_id]['location'] ) ) {
        $location = $_REQUEST['attachments'][$attachment_id]['location'];
        update_post_meta( $attachment_id, 'location', $location );
    }
}
add_action( 'edit_attachment', 'my_save_attachment_location' );

첨부 파일을 삽입하는 현재 게시물에 대한_post_meta를 어떻게 얻을 수 있습니까?이는 위의 codex 코드에 있는 my_add_attachment_location_field 콜백 함수에서 발생해야 합니다.

감사합니다!

제가 생각할 수 있는 한 가지 방법은:

$post_post_id = $post->post_parent;

그러면 다음을 수행할 수 있습니다.

get_post_id)

다음을 시도할 수 있습니다.

/**
 * Display custom 'location' attachment field
 */

function so_22850878_attachment_fields_to_edit( $form_fields, $post )
{
    $field_value = get_post_meta( $post->post_parent, 'location', true );

    $form_fields['location'] = array(
        'value' => $field_value ? $field_value : '',
        'label' => __( 'Location' ),
        'helps' => __( 'Set a location for this attachment' )
    );  

    return $form_fields;
}

add_filter( 'attachment_fields_to_edit', 
            'so_22850878_attachment_fields_to_edit', 10, 2 );

그리고.

/**
 * Edit attachment fields
 */

function so_22850878_edit_attachment( $attachment_id )
{
    $p = get_post( $attachment_id );

    if ( isset( $_REQUEST['attachments'][$attachment_id]['location'] ) )
    {
        $location = $_REQUEST['attachments'][$attachment_id]['location'];

        // Save the value of the 'location' attachment field 
        // to the 'location' post meta of the post parent if it exists:

        if( ! is_null( $p )
            && 0 < $p->post_parent 
        )
            update_post_meta( $p->post_parent, 
                              'location', 
                               sanitize_text_field( $location ) 
            );
    }
}

add_action( 'edit_attachment', 'so_22850878_edit_attachment' );

업데이트location미디어 팝업에서 상위 게시물의 게시 메타 값.

미디어 라이브러리 페이지에서 직접 첨부 파일을 편집하는 경우에도 이 항목을 체크아웃할 수 있습니다.

/**
 * Save attachment fields
 */

 function so_22850878_attachment_fields_to_save( $post, $attachment )
{
    $p = get_post( $post['ID'] );

    // Save the value of the 'location' attachment field 
    // to the 'location' post meta of the post parent if it exists:

    if( isset( $attachment['location'] ) 
        && ! is_null( $p ) 
        && 0 < $p->post_parent 
    )
        update_post_meta( $p->post_parent, 
                          'location', 
                           sanitize_text_field( $attachment['location'] ) 
        );

    return $post;
}

add_action( 'attachment_fields_to_save', 
            'so_22850878_attachment_fields_to_save', 10, 2 );

어떤 종류의 워크플로우를 염두에 두고 있는지는 모르겠지만, 제가 이해하기로는 당신의 아이디어에 문제가 있다고 생각합니다.

업데이트할 때location미디어 팝업의 필드, 업데이트를 원하는 것처럼 보입니다.location상위 게시물에 대한 게시 메타 값입니다.하지만 포스트 에디터에 이미지를 삽입해도 포스트 에디터 화면이 업데이트되지 않기 때문에location게시물을 업데이트할 때 이전 값으로 값을 덮어씁니다.

그래서 저는 당신이 숨겨진 포스트 메타 값을 대신 사용할 수 있는지 궁금합니다, 예를 들어._location?

이게 도움이 되길 바랍니다.

좋아요. 다른 방법을 시도해 보세요. 탐색기에 있는 동안에는 게시물 ID를 쉽게 얻을 수 없습니다.위치가 어디인지 잘 모르겠지만 이미지를 포스트 메타로 저장하려면 이것을 사용합니다........

단계:

1.새 js 파일을 생성하고 http://jsfiddle.net/dheffernan/BB37U/2/ 을 방문하여 js 파일에 js를 복사합니다. miu_script.js라고 부르거나 변경하려면 아래 코드를 수정해야 합니다.플러그인 폴더에 저장합니다. 하위 폴더로 이동하려면 아래 경로를 변경하십시오.

  1. 아래 코드를 함수에 입력합니다. 이미지 위치를 직렬화된 URL로 저장하고 코드를 수정하여 "_dll"이라는 필드를 다시 변경합니다.

  2. 아래에 오류가 있을 수 있습니다. Oop 형식으로 가지고 있었으니 문제가 있으면 알려주십시오. php 오류가 있으면 php 오류를 기록하십시오. php 오류가 없지만 전송이 되면 크롬이나 파이어폭스의 콘솔을 확인하십시오.디버깅할 수 없습니다.

당신의 기능으로 php.

function add_image_meta_box() {
   add_meta_box(
                'multi_image_upload_meta_box'
                , __('Upload Multiple Images', 'miu_textdomain')
                , 'render_meta_box_content'
                , $post_type
                , 'advanced'
                , 'high'
        ); 
}

add_action( 'add_meta_boxes', 'add_image_meta_box' );




function render_meta_box_content($post) {

    wp_nonce_field('miu_inner_custom_box', 'miu_inner_custom_box_nonce');

    $value = get_post_meta($post->ID, '_images', true); // <-- change field if wanted, there is 1 more below that will need the same name

    $metabox_content = '<div id="miu_images"></div><input type="button" onClick="addRow()" value="Add Image" class="button" />';
    echo $metabox_content;

    $images = unserialize($value); //<--- when using the images use this!!

    $script = "<script>
        itemsCount= 0;";
    if (!empty($images))
    {
        foreach ($images as $image)
        {
            $script.="addRow('{$image}');";
        }
    }
    $script .="</script>";
    echo $script;
}





function save_image($post_id){

    if (!isset($_POST['miu_inner_custom_box_nonce']))
        return $post_id;

    $nonce = $_POST['miu_inner_custom_box_nonce'];

    if (!wp_verify_nonce($nonce, 'miu_inner_custom_box'))
        return $post_id;

    if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)
        return $post_id;


    if ('page' == $_POST['post_type']) {

        if (!current_user_can('edit_page', $post_id))
            return $post_id;
    } else {

        if (!current_user_can('edit_post', $post_id))
            return $post_id;
    }

    $posted_images = $_POST['miu_images'];
    $miu_images = array();
    foreach ($posted_images as $image_url) {
        if(!empty ($image_url))
            $miu_images[] = esc_url_raw($image_url);
    }


    update_post_meta($post_id, '_images', serialize($miu_images));<--if you changed this above.......make sure they match
  }

  add_action( 'save_post', 'save_image' );


  function enqueue_scripts($hook){
    if ('post.php' != $hook && 'post-edit.php' != $hook && 'post-new.php' != $hook)
        return;
    wp_enqueue_script('miu_script', plugin_dir_url(__FILE__) . 'miu_script.js', array('jquery')); //<--this is the path!!! change if wanted (prob a good idea to add to js folder)
}
  add_action('admin_enqueue_scripts', 'enqueue_scripts');

단순한 해결책

function my_add_attachment_location_field( $form_fields, $post ) {
    $field_value = get_post_meta( $post->ID, 'location', true );

    $default = get_post_meta( $_REQUEST['post_id'] , 'location', true ) ? get_post_meta( $_REQUEST['post_id'] , 'location', true ): "Location Not Yet Set";

    $form_fields['location'] = array(
        'value' => $field_value ? $field_value : $default,
        'label' => __( 'Location' ),
        'helps' => __( 'Set a location for this attachment' )
    );
    return $form_fields;
}
add_filter( 'attachment_fields_to_edit', 'my_add_attachment_location_field', 10, 2 );

내 플러그인으로 잘 작동합니다.

$_REQUEST['post_id']는 실제 WP 포스트 ID이며 get_post_meta를 사용하면 메타박스 위치를 얻을 수 있습니다.:)

제가 그냥 추측하는 것인지 모르겠습니다.이 기능을 사용할 수 있습니다.

    wp_reset_query();
    global $post;
    $post->ID // retrive the global $post id;

언급URL : https://stackoverflow.com/questions/22850878/wordpress-get-post-meta-from-callback-function

반응형