为什么我必须按两次“更新”按钮才能保存我的meta box值?

时间:2012-02-01 作者:Caleb

我在更新post_date 在我编写的自定义函数中。

我想改变post_date 按我的习惯meta_date 价值

功能如下:

function cfc_reset_postdate( $data, $postarr ) {
 // If it is our form has not been submitted, so we dont want to do anything
if(defined(\'DOING_AUTOSAVE\') && DOING_AUTOSAVE) return;

if($data[\'post_type\'] == \'scripture-memory\') {
$date = get_post_meta( get_the_ID(), \'cfc_date\', true );
$date = DateTime::createFromFormat(\'D - M j, Y\', $date);
$date = $date->format(\'Y-m-d\');

$data[\'post_date\'] = $date;
return $data;
}
add_filter( \'wp_insert_post_data\', \'cfc_reset_postdate\', \'10\', 2);
它可以工作,除非我必须按Update 按钮两次以更改post_date 以匹配我的新元日期。

我在线阅读了wp includes中的一些内容2380:

如果$postarr参数的“ID”设置为值,则将更新post。

我不知道这意味着什么,但我认为这可能会帮助我解决这个问题。

我做错了什么?

EDIT:

下面是我发送到meta box插件的代码:

$prefix = \'cfc_\';

global $meta_boxes;

$meta_boxes = array();

// 1st meta box
$meta_boxes[] = array(
// Meta box id, UNIQUE per meta box
\'id\' => \'scripture_memory_verse\',

// Meta box title - Will appear at the drag and drop handle bar
\'title\' => \'Scripture Memory Verse\',

// Post types, accept custom post types as well - DEFAULT is array(\'post\'); (optional)
\'pages\' => array( \'scripture-memory\' ),

// Where the meta box appear: normal (default), advanced, side; optional
\'context\' => \'normal\',

// Order of meta box: high (default), low; optional
\'priority\' => \'high\',

// List of meta fields
\'fields\' => array(
    array(
        // Field name - Will be used as label
        \'name\'      => \'Reference\',
        // Field ID, i.e. the meta key
        \'id\'        => $prefix . \'reference\',
        // Field description (optional)
        \'desc\'      => \'If you don\\\'t spell the book correctly, the verse won\\\'t show up!\',
        // CLONES: Add to make the field cloneable (i.e. have multiple value)
        \'clone\'     => true,
        \'type\'      => \'text\'
    ),
    array(
        \'name\'      => \'Day\',
        \'id\'        => "{$prefix}date",
        \'type\'      => \'date\',
        \'desc\'      => \'(What Sunday are we saying this verse)\',
        // Date format, default yy-mm-dd. Optional. See: http://goo.gl/po8vf
        \'format\'    => \'DD - M d, yy\'
    )
)
);

2 个回复
最合适的回答,由SO网友:mor7ifer 整理而成

问题是您正在使用get_post_meta(), 但既然你在勾搭wp_insert_post_data 您尚未设置帖子元(因为钩子在帖子插入数据库之前触发。您应该从元数据提交中提取,并运行用于update_post_meta(). 如果您将代码张贴在设置postmeta和注释的位置,我将尝试编写一些示例代码(假设您需要它)

SO网友:samjco

尝试查看是否可以获取$\\u POST数据并在更新时添加它:

//see what is being pass...
print_r($postarr);
die();
然后将字段信息添加到函数中

function update_post_from_meta($data,$postarr) {

//see what is being pass...
//print_r($postarr);
//die();

if(defined(\'DOING_AUTOSAVE\') && DOING_AUTOSAVE) return;

if($data[\'post_type\'] == \'scripture-memory\') {

$date = $_POST[\'you_field_name\'];
//OR
//$date = $postarr[\'your_field_name\'];

$date = DateTime::createFromFormat(\'D - M j, Y\', $date);
$date = $date->format(\'Y-m-d H:i:s\');

$data[\'post_date\'] = $date;
return $data;

}
add_filter(\'wp_insert_post_data\',\'update_post_from_meta\',99,2);

结束

相关推荐

在短代码中获取Metabox值?

是否可以在该页上执行的短代码中获取该页的元盒值?场景:我每个页面都有一个侧边栏元数据库</我有一些自定义的Gallery快捷码我的gallery快捷码输出600x200幅图像(我在这里使用timthumb)。但如果没有侧栏,我希望它显示900x300。通常我会使用:$sidebar = get_post_meta($post->ID, \'metabox_sidebar\', true); if($sidebar == \"true\") { do something }