【问题标题】:Wordpress hook to edit the post meta data before displaying a post edit page在显示帖子编辑页面之前编辑帖子元数据的 Wordpress 钩子
【发布时间】:2017-02-27 10:24:17
【问题描述】:

我正在尝试在帖子显示在屏幕上之前编辑元数据中的字段。

我一直在查看“load-post.php”钩子,但这是在加载帖子之前调用的(如果我理解正确的话),所以帖子 ID 和元数据为空。 我尝试了其他钩子,但我无法完成这项工作。

以下帖子元字段需要更改才能显示在编辑页面上。

$post_price = get_post_meta(get_the_ID(), 'price', TRUE);

示例:数据库中的 Price = 10,但我希望它在帖子编辑页面上显示时为 Price = 15。

非常感谢任何链接、提示和想法。 :)

编辑:
我目前的解决方案:

add_action('load-post.php','calculate_price');
function calculate_price(){
    $post_id = $_GET['post'];
    //get price from post by post_id and do stuff
}

这是正确的方法吗?

【问题讨论】:

  • 我通过在显示元框的 add_meta_boxes 钩子之前调用另一个 add_meta_boxes 钩子来完成这项工作

标签: php wordpress hook edit


【解决方案1】:

我发现的最好的钩子是load-post.php 使用$current_screen

对于 Woocommerce 产品,这很有效:

add_action('load-post.php', "calculate_price" );

function calculate_price( ){
   global $current_screen;
   if( is_admin() && $current_screen->post_type === 'product' ){
       $post_id = (int) $_GET['post'];
       $post = get_post( $post_id );
       //Do something
   }
}

【讨论】:

    【解决方案2】:

    编辑:好的,我以为您只需要使用帖子 ID。如果您需要更改帖子对象(已经从 db 加载并准备好打印),您可以使用 'the_post' 代替。由于您只需要访问帖子 ID,我会这样做:

    function my_the_post_action( $post ) {
        $screen = get_current_screen();
        if( is_admin() && $screen->parent_base == 'edit' && get_post_type() == 'product' ) {
            $post_id = $post->ID;
            $price = (int) get_post_meta( $post_id, 'price', true );
            update_post_meta( $post_id, 'price', $price + 5 );
        } 
    }
    add_action( 'the_post', 'my_the_post_action' );
    

    这部分:

    get_post_type() == '产品'

    不是必需的,但您应该确定您要为哪种类型的帖子(基于帖子类型、类别、元字段等)运行这段代码。没有它,每次在管理员查询中都会执行。此代码未经测试,如有错误请随时报告。

    【讨论】:

    • 谢谢你的回复,但是这个钩子不能让你更改查询吗?我不需要更改查询,我需要一个允许我更改查询结果中的数据的钩子。
    • 谢谢,看起来比我的解决方案好得多,但“the_post”似乎被忽略了。有任何想法吗?如果这很重要, add_action 在类的构造函数中。我对 hooks 和 wordpress 很陌生。
    • 尝试在类外的主题functions.php中使用这个sn-p。然后,如果什么都没发生,请输入 echo 'works';在 my_the_post_action 的开头,以确保没有任何事情发生。在管理区查看正文附近的源代码,因为“作品”可能被隐藏了。
    • OP 正在尝试转换数据用于显示目的,而不是永久更新数据库,我相信。
    猜你喜欢
    • 1970-01-01
    • 2017-09-20
    • 1970-01-01
    • 1970-01-01
    • 2018-02-01
    • 1970-01-01
    • 2019-09-07
    • 1970-01-01
    • 2017-08-30
    相关资源
    最近更新 更多