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

kninwzqo  于 2022-12-03  发布在  WordPress
关注(0)|答案(2)|浏览(158)

我想创建一个插件来批量管理帖子的自定义字段数据。我知道我可以通过在帖子编辑屏幕中添加一个元框并使用add_action('save_post', 'function_to_update_meta')来触发添加元功能来添加帖子 meta。
但是我不知道如何在管理菜单页面(比如自定义管理菜单)中触发add_post_meta函数,怎么做呢?
提前感谢您!

jv2fixgn

jv2fixgn1#

Wordpress的codex中给出的例子可能是处理信息的方式中最好和最安全的:
Add Meta Box
复制并粘贴它,然后摆弄它,以获得一个关于如何控制您的帖子和页面的好主意。
好的一面是你不需要担心检查是否需要添加或更新一个给定的帖子 meta字段。使用Update Post Meta将确保为你采取适当的行动,即使该字段不存在。
如果你想添加一些插件/主题可能使用的全局控件,Update Option也是如此。

分解示例:

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

这些是动作钩子。第一个钩子在帖子编辑器中填充 meta框时执行,第二个钩子在添加或更新帖子时执行。

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" />';
}

这是注册的 meta框调用的函数,用于自动生成表单。请注意该函数是如何被称为“myplugin_inner_custom_box”的,并且元框注册中的第三个参数也被称为“myplugin_inner_custom_box”。
wp_nonce_field()会在表单中生成一个隐藏字段,以验证发送到表单的数据是否确实来自WordPress,如果其他插件正在使用'保存_post'操作挂钩,则还可以用来结束该函数。
还要注意,$post对象是作为一个参数传入的。这将允许您使用post对象的某些属性。我冒昧地检查了get_post_ meta()是否返回了具有给定post ID的任何内容。如果是,则该字段将填充该值。如果不是,则将填充'New Field'。

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

这是由'保存_post'操作钩子调用的函数。注意第二个操作钩子的第二个参数和这个函数都被称为'myplugin_save_postdata'。首先,在我们的插件可以真正保存任何数据之前,必须通过一系列的验证。
首先,我们不希望在每次自动更新帖子时,我们的 meta框都更新。如果帖子是自动更新的,请取消该过程。
其次,我们要确保nonce数据可用并验证它。如果没有nonce数据可用或未验证,则取消该过程。
第三,我们要确保给定用户具有edit_page权限。该函数首先检查帖子类型,然后检查相应的权限。如果用户没有该权限,则取消该过程。
最后,我们的插件终于通过了验证,我们想保存信息。我冒昧地添加了最后的update_post_ meta()行,向您展示了这一切是如何组合在一起的。
请注意$post_id是如何作为参数传递给函数的。这是update_post_ meta()函数需要的部分之一。键被命名为'myplugin_new_field',元数据的值现在保存为您在自定义元框中的自定义输入字段中输入的任何内容。
这是我能解释的最简单的整个过程。只要学习它,然后用代码弄脏你的手。最好的学习方法是通过应用而不是理论。

q8l4jmvw

q8l4jmvw2#

答案来自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()

相关问题