当前位置: 首页 > 知识库问答 >
问题:

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

朱淮晨
2023-03-14

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

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

提前感谢您!

共有2个答案

李鸿
2023-03-14

答案来自我在别处问过的同一个问题

我创造了我自己的例子

我添加了一些用于测试的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()
赵立果
2023-03-14

Wordpress的法典中给出的例子可能是处理信息的方式最好和最安全的:

添加元框

复制并粘贴它,然后摆弄它,以获得如何控制帖子和页面的好主意。

好的方面是你不需要担心检查你是否需要添加或者更新一个给定的Post元字段。使用Update Post Meta将确保为您采取正确的操作,即使该字段不存在。

如果您想添加一些插件/主题可能使用的全局控件,更新选项也是如此。

细分示例

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()返回任何具有给定post 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”。首先,我们的插件在实际保存任何数据之前必须通过一系列验证。

首先,我们不希望元框在每次给定的帖子自动更新时都更新。如果帖子正在自动更新,请取消该过程。

其次,我们要确保随机数数据可用并进行验证。如果没有可用的随机数数据或未经过验证,请取消该过程。

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

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

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

这是我能解释整个过程的最简单的方法。学习它,然后用代码弄脏你的手。最好的学习方式是通过应用而不是理论。

 类似资料:
  • 我想在portlet的管理菜单中添加另一项。例如,在外观和配置之间添加一项“组织”。有可能吗?? 然而,我在配置菜单中测试了一个新的配置页面。 所以我添加了portlet。xml: 在liferay portlet中。xml: 我的ConfigurationActionPrenalyticImpl如下所示: 但是我不知道如何正确地初始化这个页面,比如doView或doEdit中的一些内容。

  • 需要新增2个页面 第一个是WebContent/page/simple_role.jsp, 这是authority.jsp页面的外框 <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.

  • 有些容器应用程序不提供新建菜单栏的方法,因此,需用 Visual Basic 创建菜单栏。在用 Visual Basic 创建了一个菜单栏之后,就可用容器应用程序接口或继续用 Visual Basic 定义该菜单栏。 在运行时间添加菜单栏 要在运行时间给应用程序添加一个菜单栏,可用CommandBars 集合的Add 方法并将MenuBar 参数指定为 True。以下示例将添加一个不可移动的菜单栏

  • 问题内容: 我想在模型的列表视图中为我的模型的“添加”按钮旁边添加一个按钮,然后创建一个视图函数,在该函数中,我将做我的工作,然后将用户重定向回列表视图。 我已经检查了如何重载管理模板,但我仍然不知道,我应该将视图函数放在哪里做我的事情,以及如何将该视图注册到管理url中。 还有关于安全性的问题。我想在admin内部执行该操作,因此如果您未登录,则无法使用它。 问题答案: 当多个应用程序提供同一资

  • 我正在创建一个wordpress插件,让用户登录并上传文件,在后端管理员中,用户可以登录并设置权限等 这里是php文件生成前端现在im添加这个作为模板和创建前端的事情我想做的是把这个代码也在插件。。,是否有相关的钩子,但我没有找到合适的钩子。。。。

  • 我的WooCommerce版本是4.5。2. 我想删除自定义用户的添加顺序,使其无法访问。 我已使用具有以下权限的用户角色编辑器创建了自定义用户: 这样,用户只能查看现有订单,并单击订单预览更新为“已完成”。 我试着用这个: ...但订单主菜单变得不可访问。 我偶然发现这篇文章删除或隐藏批量订单面板上的WooCommerce上的“添加新”按钮,该按钮使用CSS从页面上隐藏“添加订单”。 我希望有人