2014-04-03 26 views
7

Tôi đang làm việc trên plugin WP đầu tiên của mình và bị kẹt.WordPress Tải bài đăng Meta từ chức năng gọi lại

Tôi đã tạo trường tùy chỉnh (trường 1) trên trang bài đăng bên dưới trình chỉnh sửa nội dung. Nó tiết kiệm một cách chính xác. :)

Tôi đã tạo trường tùy chỉnh (trường 2) bên trong cửa sổ bật lên Thư viện phương tiện khi thêm phương tiện. Nó tiết kiệm một cách chính xác. :)

Những gì tôi đang muốn làm, là sử dụng giá trị từ trường 1 là giá trị mặc định cho trường 2.

Tôi nghi ngờ rằng vấn đề nằm trong attachment_fields_to_edit chức năng callback .

Tôi nghĩ rằng $ bài hiện đang đề cập đến thực tế "tập bài tập tin đính kèm" chứ không phải là bài riêng của mình, vì vậy khi tôi đang tham khảo giá trị lưu của tôi:

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

nó thực sự là kéo tất cả các meta được liên kết với tệp đính kèm đó chứ không phải với bài đăng hiện tại. Có thể kéo meta từ bài đăng thực tế không?

Mã này là từ 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'); 

Làm thế nào tôi sẽ get_post_meta cho bài hiện tại mà chúng ta đang chèn tập tin đính kèm vào? Điều này sẽ cần phải xảy ra trong hàm gọi lại my_add_attachment_location_field trong mã codex ở trên.

Cảm ơn!

+0

bạn có quyền truy cập vào cơ sở dữ liệu của mình không? – David

+0

thực sự bạn muốn sử dụng điều này ở đâu, làm hình ảnh nổi bật hoặc hình ảnh bổ sung? – David

+0

hình ảnh bổ sung – Aaron

Trả lời

1

Một cách tôi có thể nghĩ:

$ actual_post_id = $ hậu> post_parent;

Sau đó, bạn có thể làm:

get_post_meta ($ actual_post_id)

+0

Cảm ơn, nhưng điều này dường như không hoạt động. Tôi cũng đã tìm kiếm xung quanh một chút và dường như không thể thực hiện bất kỳ tiến bộ nào. – Aaron

+0

Hmmm ... Tôi sẽ var_dump ($ post) và xem liệu thuộc tính post_parent có thực sự được đặt hay không. Nếu nó vẫn không hoạt động, hãy thử https://codex.wordpress.org/Function_Reference/get_post_ancestors này. – Edenbauer

+0

Cảm ơn! Tôi nghĩ rằng $ post thực sự là một "bài viết" hoàn toàn riêng biệt cho hình ảnh/tệp đính kèm - và không phải là bài đăng thực tế? Tôi không thể lặp lại ID bài đăng thực tế từ bên trong cửa sổ bật lên của thư viện phương tiện vì điều này. Có vẻ như chức năng mà bạn đã tham chiếu là muốn ID bài đăng, nhưng tôi sẽ cho nó một ảnh. – Aaron

1

Bạn có thể thử như sau:

/** 
* 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'); 

để cập nhật giá trị meta bài đăng của location của bài đăng gốc, từ cửa sổ bật lên phương tiện.

Bạn cũng có thể muốn kiểm tra này ra, nếu bạn chỉnh sửa các tập tin đính kèm trực tiếp từ các trang thư viện phương tiện truyền thông:

/** 
* 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); 

Tôi không chắc chắn những loại công việc mà bạn có trong tâm trí, nhưng tôi nghĩ rằng có một vấn đề với ý tưởng của bạn, như tôi hiểu nó:

Khi bạn cập nhật các lĩnh vực location trong giới truyền thông popup, nó trông giống như bạn muốn cập nhật giá trị sau meta location cho bài cha mẹ. Nhưng vì màn hình chỉnh sửa bài đăng không cập nhật khi bạn chèn hình ảnh vào trình chỉnh sửa bài đăng, giá trị location của bạn sẽ bị ghi đè với giá trị cũ khi bạn cập nhật bài đăng.

Vì vậy, tôi tự hỏi nếu bạn có thể sử dụng giá trị meta bài đăng ẩn thay thế, ví dụ: _location?

Hy vọng điều này sẽ hữu ích.

0

ok hãy thử một cách khác ...... bạn sẽ không dễ dàng có thể nhận được id bài trong khi đang trong trình điều hướng. Im không chắc chắn vị trí là gì nhưng nếu bạn muốn lưu hình ảnh như bài meta, tôi sử dụng này ............

bước sau:

1.create một file js mới + truy cập http://jsfiddle.net/dheffernan/BB37U/2/ và sao chép tệp js vào tệp js. gọi nó là miu_script.js hoặc nếu bạn muốn thay đổi nó, bạn cần phải thực hiện một số mod để mã dưới đây. Lưu nó vào thư mục plugin của bạn (thay đổi đường dẫn dưới đây nếu bạn muốn di chuyển nó vào thư mục con

  1. nhập vào mã dưới đây vào các chức năng của bạn -. Nó sẽ lưu vị trí hình ảnh như một url serialized và trong một lĩnh vực được gọi là "_images" một lần nữa thay đổi nếu bạn muốn bằng cách sửa đổi mã.

  2. Có thể có lỗi bên dưới, tôi đã có định dạng Oop để cho tôi biết nếu có vấn đề. lỗi php nhưng nó làm việc dosent, kiểm tra giao diện điều khiển trong chrome hoặc firefox.Phải có thể gỡ lỗi

trong các chức năng của 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'); 
0

chỉ là một giải pháp đơn giản

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); 

làm việc tốt với plugin của tôi

$ _REQUEST [ 'post_id'] là wp thực tế bài ID và với get_post_meta bạn có thể nhận được vị trí metabox của bạn .. :)

0

Tôi không biết nếu tôi chỉ đoán nó. bạn có thể sử dụng chức năng này

wp_reset_query(); 
    global $post; 
    $post->ID // retrive the global $post id; 
Các vấn đề liên quan