2012-07-28 73 views
1

我想創建一個插件來批量管理帖子的自定義字段數據。我知道我可以通過在帖子編輯屏幕中添加元框來添加帖子元素,並使用add_action('save_post','function_to_update_meta')來觸發添加元函數。如何在管理菜單頁面中添加/更新帖子元?

但我不知道如何觸發管理菜單頁面(如自定義管理菜單)中的add_post_meta函數。怎麼做?

預先感謝您!

回答

0

答案是從the same question I asked somewhere else

我開了我的版本例如

我添加了一些測試功能的console.log,但是這基本上doning同樣的事情@Chris_()答案:

菜單回調函數生成菜單內容(PHP):

function ajax_menu_callback() { 
?> 
<div class="wrap"> 
    <div id="icon-themes" class="icon32"></div> 
    <h2>Test</h2> 
    <br /> 
    <form> 
     <input id="meta" type ="text" name="1" value="<?php echo esc_html(get_post_meta(1, 'your_key', true)); ?>" /> 
     <?php submit_button(); ?> 
    </form> 
</div> 
<?php 
} 

然後JavaScript來打印管理員SI德(JavaScript的,不要忘了包括jQuery庫):

jQuery(document).ready(function() { 
    $("form").submit(function() { 
     console.log('Submit Function'); 
     var postMeta = $('input[name="1"]').val(); 
     console.log(postMeta); 
     var postID = 1; 
     var button = $('input[type="submit"]'); 
     button.val('saving......'); 
     $.ajax({ 
      data: {action: "update_meta", post_id: postID, post_meta: postMeta, }, 
      type: 'POST', 
      url: ajaxurl, 
      success: function(response) { console.log('Well Done and got this from sever: ' + response); } 
     }); // end of ajax() 
     return false; 
    }); // end of document.ready 
}); // end of form.submit 

然後PHP函數手柄update_post_meta(PHP):

add_action('wp_ajax_update_meta', 'my_ajax_callback'); 
function my_ajax_callback() { 
    $post_id = $_POST['post_id']; 
    $post_meta = $_POST['post_meta']; 
    update_post_meta($post_id, 'your_key', $post_meta); 
    echo 'Meta Updated'; 
    die(); 
} // end of my_ajax_callback() 
1

在WordPress的抄本給出的例子可能是最好的,最安全的處理信息的方式:

Add Meta Box

複製和粘貼,然後反覆折騰它上獲得一個好主意如何控制你的帖子和頁面。

好的部分是,你不必擔心檢查是否需要添加VS更新給定的郵政元字段。使用Update Post Meta將確保爲您採取適當的行動,即使該字段不存在。

如果你想添加一些你的插件/主題可能使用的全局控件,Update Option也是如此。

BREAKDOWN實施例:

add_action('add_meta_boxes', 'myplugin_add_custom_box'); 
add_action('save_post', 'myplugin_save_postdata'); 

這些是動作鉤。當帖子編輯器中正在填充元框時執行第一個元素,並且在添加或更新帖子時執行第二個元素。

function myplugin_add_custom_box() 
{ 
    add_meta_box( 
     'myplugin_sectionid', 
     __('My Post Section Title', 'myplugin_textdomain'), 
     'myplugin_inner_custom_box', 
     'post' 
    ); 
    add_meta_box(
     'myplugin_sectionid', 
     __('My Post Section Title', 'myplugin_textdomain'), 
     'myplugin_inner_custom_box', 
     'page' 
    ); 
} 

該函數由'add_meta_boxes'動作鉤調用。注意函數的名字和action鉤子的第二個參數完全相同。這會註冊您的元框,它們應該顯示哪些帖子類型,以及用於生成包含在其中的表單的回調函數。

function myplugin_inner_custom_box($post) 
{ 
    wp_nonce_field(plugin_basename(__FILE__), 'myplugin_noncename'); 

    $value = get_post_meta($post->ID, 'myplugin_new_field') ? get_post_meta($post->ID, 'myplugin_new_field') : 'New Field'; 

    echo '<label for="myplugin_new_field">'; 
    _e("Description for this field", 'myplugin_textdomain'); 
    echo '</label> '; 
    echo '<input type="text" id="myplugin_new_field" name="myplugin_new_field" value="'.$value.'" size="25" />'; 
} 

這是由註冊元框自動生成表單調用的函數。請注意函數是如何被稱爲'myplugin_inner_custom_box'的,而元框註冊中的第三個參數也被稱爲'myplugin_inner_custom_box'。

wp_nonce_field()在表單中生成一個隱藏字段,用於驗證發送到表單的數據實際上是否來自Wordpress,並且在其他插件正在使用「save_post」動作鉤子時也可以用於結束該函數。

還要注意$ post對象被作爲參數傳入。這將允許您使用帖子對象中的某些屬性。我冒昧地檢查是否有get_post_meta()函數返回給定的帖子ID。如果是這樣,該字段將填充該值。如果不是,它充滿了'新領域'。

function myplugin_save_postdata($post_id) 
{ 
    if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) 
     return; 
    if (!wp_verify_nonce($_POST['myplugin_noncename'], plugin_basename(__FILE__))) 
     return; 
    if ('page' == $_POST['post_type']) 
    { 
     if (!current_user_can('edit_page', $post_id)) 
     return; 
    } 
    else 
    { 
     if (!current_user_can('edit_post', $post_id)) 
     return; 
    } 

    $mydata = $_POST['myplugin_new_field']; 
    update_post_meta($post_id, 'myplugin_new_field', $mydata); 
} 

這是'save_post'動作鉤調用的函數。注意第二個動作鉤子和這個函數的第二個參數都被稱爲'myplugin_save_postdata'。首先,我們的插件在實際保存任何數據之前必須通過一系列驗證。

首先,我們不希望我們的元框在每次給定的帖子自動更新時都進行更新。如果該帖子是自動更新的,則取消該過程。

其次,我們要確保nonce數據可用並驗證它。如果沒有現成數據可用或未驗證,請取消該過程。

第三,我們要確保給定的用戶具有edit_page權限。該函數首先檢查帖子類型,然後檢查適當的權限。如果用戶沒有該權限,請取消該過程。

最後,我們的插件終於得到驗證,我們希望保存信息。我冒昧地在最後的update_post_meta()一行中添加了這些內容,以向您展示它們是如何結合在一起的。

請注意$ post_id是如何作爲參數傳遞給函數的。這是update_post_meta()函數所需的部分之一。該鍵被命名爲'myplugin_new_field',並且該元數據的值現在保存爲您輸入到自定義元框中的該自定義輸入字段中的值。

這就像我可以解釋整個過程一樣簡單。只要研究它,並用代碼弄髒你的手。學習的最佳方式是通過應用而不是理論。

+0

我通過這些例子走,但我沒有找到我想要的是。讓我改進我的表達方式:我可以在'add_menu_page()'添加的菜單頁面中使用'update_post_meta()'嗎? – Daiwei 2012-07-28 06:22:19

+0

當然。 update_post_meta()和update_option()可以在任何地方執行。 – maiorano84 2012-07-28 06:24:59

+0

我是PHP初學者,所以這可能對你很明顯,但對我很迷惑。 update_post_meta()必須接受輸入(發佈ID,相關元鍵和元值)。我應該首先使用

來收集數據(由add_menu_page()創建的頁面中的數據)?那麼我怎樣才能觸發update_post_meat()使用提供的數據,但並寫入相關的職位?是否有像'save_post'這樣的動作鉤子? – Daiwei 2012-07-28 06:49:58

相關問題