如何在transition_post_status

时间:2019-11-20 10:25:06

标签: php wordpress metadata custom-post-type wordpress-gutenberg

每次创建,编辑或删除自定义帖子类型时,我都必须将通知存储在自定义表 wp_notifications 中。

要构建该通知,我需要ACF插件创建的自定义字段中的数据。

我正在使用transition_post_status钩来检测帖子状态(新帖子已发布,帖子已编辑等)的更改,并根据新状态构建通知。

问题是我只是无法访问需要发出通知的帖子元数据/自定义字段值。

我尝试从 $ _ POST 变量获取值,但是由于某种原因它为空,我也尝试在 $ _ REQUEST 中查找,但是它基本上是空的也是

我尝试的另一件事是使用 get_field()函数来获取自定义字段的值,如下所示:

 get_field('custom_field_name', $object->ID);

但是它是空的。

我也尝试过使用get_post_meta函数,甚至对这样的数据库进行手动查询:

$object_meta = $wpdb->get_results("SELECT * FROM wp_postmeta WHERE post_id = $object->ID");

但是在两种情况下,我都只获得_edit_lock值,所有其他值均缺失。

根据我在网上发现的信息,似乎在将post meta存储到数据库之前执行了transition_post_status。在类似问题的答案之一中,有人建议使用相同的钩子(transition_post_status)来执行另一个功能,并从 $ _ POST 变量中手动将帖子元保存到数据库,但将 $ _ POST 是空的。

到目前为止,我的代码:

 add_action( 'transition_post_status', 'savePostMeta', 1, 3 );
 add_action( 'transition_post_status', 'notifications', 10, 3 );


   // transition_post_status triggers before post metadata is available
   // so metadata needs to be saved with higher priority function
   function savePostMeta ($new_status, $old_status, $post) {

    if ( 'publish' !== $new_status) {
        return;
    }

    if(is_object($post) && ($post->post_type == 'poruke' || $post->post_type == 'toolovi')) {
        echo "<pre>";
            die(var_dump( $_POST )); // empty 
        echo "</pre>";
        if (!empty($_POST['acf'])) {
            foreach ($_POST['acf'] as $field_name => $value) {
                update_post_meta($post->ID, $field_name, $value);
            }
        }
    }
    }

function notifications ( $new_status, $old_status, $post ) {

    $post_type = $post->post_type;

    $sender = wp_get_current_user();
    if (!in_array('administrator', $sender->roles) && !in_array('super_admin', $sender->roles)) {
        return;
    }
    $notification_type = '';

    if ( 'publish' === $new_status && 'publish' !== $old_status ) {

        global $wpdb;
        $object_meta = $wpdb->get_results("SELECT * FROM wp_postmeta WHERE post_id = $post->ID"); // just _edit_lock in here


        if ($post_type == 'poruke') {
            $notification_type = 'add_message';
        } else if ($post_type == 'toolovi') {
            $notification_type = 'add_tool';
        }

        if ($notification_type) {
            create_notification($sender,$notification_type, $post);
        }
    } else if ( 'trash' === $new_status ) {

        if ($post_type == 'poruke') {
            $notification_type = 'remove_message';
        } else if ($post_type == 'toolovi') {
            $notification_type = 'remove_tool';
        }

        if ($notification_type) {
            create_notification($sender,$notification_type, $post);
        }

    } else if ( get_the_time('', $post) != get_the_modified_time('', $post) && $old_status == 'publish' && $old_status == $new_status ) {

        if ( empty($_POST) && $post_type == 'poruke' ) return;

        if ($post_type == 'poruke') {
            $notification_type = 'edit_message';
        } else if ($post_type == 'toolovi') {
            $notification_type = 'edit_tool';
        }

        if ($notification_type) {

            create_notification($sender,$notification_type, $post);
        }

    }
}

我们将不胜感激,在此先感谢您。

0 个答案:

没有答案