如何在管理菜单页面中添加/更新post meta?

时间:2012-07-28 02:19:33

标签: wordpress wordpress-plugin metadata

我想创建一个插件来批量管理帖子的自定义字段数据。我知道我可以通过在帖子编辑屏幕中添加元框来添加帖子元素,并使用add_action('save_post','function_to_update_meta')来触发添加元函数。

但我不知道如何在管理菜单页面(例如自定义管理菜单)中触发add_post_meta功能。怎么做?

提前谢谢!

2 个答案:

答案 0 :(得分:1)

Wordpress'codex中给出的示例可能是处理信息的最佳和最安全的方法:

Add Meta Box

复制并粘贴它,然后随意摆弄它,以便了解如何控制帖子和页面。

不错的部分是,您无需担心是否需要添加vs更新给定的Post Meta字段。使用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'动作钩子调用。注意函数的名称和动作钩子的第二个参数完全相同。这将注册您的元框,它们会显示它们应该出现的类型,以及用于生成内部包含的表单的回调。

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对象作为参数传入。这将允许您使用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数据可用并验证它。如果没有可用的nonce数据或未验证,则取消该过程。

第三,我们希望确保给定用户具有edit_page权限。该函数首先检查帖子类型,然后检查适当的权限。如果用户没有该权限,请取消该过程。

最后,我们的插件最终已经过验证,我们希望保存这些信息。我冒昧地在最后的update_post_meta()行中添加了一行,以向您展示它是如何组合在一起的。

注意$ post_id是如何作为参数传递给函数的。这是update_post_meta()函数所需的部分之一。该键被命名为“myplugin_new_field”,该元数据的值现在保存为您在自定义元框中的自定义输入字段中输入的内容。

这就像我能解释整个过程一样简单。只是研究它,并用代码弄脏你的手。学习的最佳方式是通过应用而不是理论。

答案 1 :(得分:0)

答案来自the same question I asked somewhere else

我创建了我的示例

我添加了一些console.log函数进行测试,但这基本上与@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(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()