每次创建,编辑或删除自定义帖子类型时,我都必须将通知存储在自定义表 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);
}
}
}
我们将不胜感激,在此先感谢您。