CustomPostType的Meta-Box导致PHP错误,并在“Add New”视图中发出通知

时间:2012-06-06 作者:mathiregister

我有一个名为wr_events. 我在这类帖子中有很多元框。post类型和元框本身工作正常。

唯一的一件事:无论我在什么帖子类型创建“新帖子”,我都会收到很多php错误和通知…

Notice: Undefined index: _wr_event_speaker in /Users/my/htdocs/wr/wp-content/themes/wr/functions.php on line 246

Notice: Undefined index: _wr_event_date in /Users/my/htdocs/wr/wp-content/themes/wr/functions.php on line 248

Notice: Trying to get property of non-object in /Users/my/htdocs/wr/wp-content/themes/wr/functions.php on line 249

Notice: Trying to get property of non-object in /Users/my/htdocs/wr/wp-content/themes/wr/functions.php on line 250

Notice: Undefined index: _wr_event_time in /Users/my/htdocs/wr/wp-content/themes/wr/functions.php on line 250

Notice: Trying to get property of non-object in /Users/my/htdocs/wr/wp-content/themes/wr/functions.php on line 251

Notice: Undefined index: _wr_event_review in /Users/my/htdocs/wr/wp-content/themes/wr/functions.php on line 251
因此,即使这个元框只是分配给我的“事件”帖子类型,当我创建一个普通的新帖子时,上面的错误也会出现。

因此,如果我再次单击“添加新内容”,就会出现此消息。如果我在自定义帖子类型中选择“添加新内容”,它们也会出现。

奇怪的是,如果我edit 帖子或自定义帖子。

你知道是什么原因吗?

update:

我为自定义元数据库使用了一个类,因为我的需求非常特殊。https://github.com/jaredatch/Custom-Metaboxes-and-Fields-for-WordPress

/**
 * Initialize the post-meta class
 */

add_action( \'init\', \'be_initialize_cmb_meta_boxes\', 9999 );
function be_initialize_cmb_meta_boxes() {
    if ( !class_exists( \'cmb_Meta_Box\' ) ) {
        require_once( \'lib/metabox/init.php\' );
    }
}

add_filter( \'cmb_meta_boxes\', \'cmb_sample_metaboxes\' );

function cmb_sample_metaboxes( array $meta_boxes ) {

    $prefix = \'_wr_\';

    $meta_boxes[] = array(
        \'id\'         => \'event_review\',
        \'title\'      => \'Review\',
        \'pages\'      => array( \'wr_event\'),
        \'context\'    => \'normal\',
        \'priority\' => \'low\',
        \'fields\'     => array(
            array(
                \'name\'    => \'Review\',
                \'id\'      => $prefix . \'event_review\',
                \'type\'    => \'wysiwyg\',
                \'options\' => array( \'textarea_rows\' => 5, ),
            )
        ),
    );

    return $meta_boxes;
}
所以,再说一次:这很有魅力,这些通知其实不应该困扰我,因为一切都很顺利。然而,我只是想知道为什么每个“添加新”页面上都会出现这些通知。

update:

这个update_post_meta() 函数引发错误。

add_action(\'save_post\', \'save_details\');

function save_details(){
    global $post;
    update_post_meta($post->ID, "event_review", $_POST["_wr_event_review"]);
}

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

从阅读通知开始——它们非常明确地告诉你问题是什么。

让我们从第一个开始:

Notice: Undefined index: _wr_event_speaker in /Users/my/htdocs/wr/wp-content/themes/wr/functions.php on line 246
首先,这只是一个“通知”。这意味着实际上没有发生错误。PHP只是告诉您有些地方不太正确,但它跳过了问题并继续执行脚本的其余部分。

接下来,通知本身是“未定义索引:\\u wr\\u event\\u speaker”。“未定义索引”表示您正在尝试访问实际上不存在的数组键(键为“\\u wr\\u event\\u speaker”)。对于元框,您可能正在执行以下操作:

<input type="text" name="something" value="<?php echo $my_array[\'_wr_event_speaker\'] ?>" />
但由于您正在创建一篇新帖子,因此还没有为\\u wr\\u event\\u speaker设置值,因此您试图回应一些不存在的内容,并触发通知。这解释了为什么通知只发生在新帖子上——旧帖子确实为\\u wr\\u event\\u speaker设置了一个值,所以没有问题。

现在,看看通知的结尾。它告诉您,该通知是在文件“/Users/my/htdocs/wr/wp-content/themes/wr/functions.php”的第246行触发的。这就是您将看到有问题的代码的地方(可能与上面的示例类似)。

您可以通过许多不同的方式避免此类警告。所有这些都涉及在尝试访问数组键之前检查数组键是否已实际设置。一种方法(如果要内联执行)是在echo语句中使用“三元运算符”,如下所示:

<input type="text" name="something" value="<?php echo ( isset( $my_array[\'_wr_event_speaker\'] ) ? $my_array[\'_wr_event_speaker\'] : \'\' ); ?>" />
这对php说:“如果设置了$my\\u array[\'\\u wr\\u event\\u speaker\',请打印其值,否则打印一个空字符串”。它将阻止通知被绊倒。

最好的做法是在打印数组键或对象属性之前,始终检查其是否存在。

EDIT BASED ON OP\'S COMMENTS

以下是我根据您发布的代码剪报建议的修改。看起来很多,但我添加了一些评论(我希望)让它更清楚。其要点是,除了使用“isset”(问题的最初症结所在)之外,在将任何函数挂接到save\\u post操作时,您应该始终添加以下样板。为了避免未来的问题,需要解释一些奇怪之处。

add_action(\'save_post\', \'save_details\');

function save_details($post_id){

    // Check for autosaves and quickedits. This is really important.
    // These types of saves DON\'T pass in any custom meta box values, so for autosaves
    // and quickedits, just bail right away, or our post meta values will be
    // overwritten with blank ones!
    if ( defined( \'DOING_AUTOSAVE\' ) && DOING_AUTOSAVE || (defined(\'DOING_AJAX\') && DOING_AJAX) ) 
    return;

    // The "save_post" action runs whenever any item of any type is saved, so you have to figure out what kind of item this is, and handle it accordingly.
    // Otherwise, your DB will fill up with blank values for this post meta, associated with all post types.
    $post_type = isset($_POST[\'post_type\']) ? $_POST[\'post_type\'] : \'\';

    switch($post_type) {

        // If this is the "post" post type
        case "post":

            // Update the _wr_event_review value
            $wr_event_review = isset($_POST[\'_wr_event_review\']) ? wp_filter_post_kses($_POST[\'_wr_event_review\']) : \'\';
            update_post_meta($post->ID, \'event_review\', $wr_event_review);

            break;

    }

}
编辑注意:此时您应该真正清理输入。看起来这是一个文本区域?在这种情况下,你至少想通过$_POST["_wr_event_review"] 通过wp_filter_post_kses() 保存前。

SO网友:Chris_O

定义元框后需要调用“include if(class\\u exists)”,或者只需在include块的正上方定义一个空数组。

$meta_boxes = array();

https://github.com/jaredatch/Custom-Metaboxes-and-Fields-for-WordPress/issues/8

您还可以通过创建问题直接从开发人员和其他用户那里获得支持。还可以浏览已关闭的问题。

根据更新进行更新:

更新函数需要将变量包装在isset()中;以防止通知。

您还需要进行nonce检查、条件检查,以确保在清除字段时使用正确的post\\u类型和delete\\u post\\u meta。

add_action(\'save_post\', \'save_details\');
function save_details( $post_id, $post ){
    if ( !wp_verify_nonce( $_POST [ \'you_are_using_nonces_right\' ], plugin_basename( __FILE__ ) )) 
         return $post->ID; 
    if ( ( \'revision\' == $post->post_type ) || ( \'wr_event\' !== $post->post_type ) ) 
         return $post->ID ; 
    $value = isset( $_POST[\'_wr_event_review\'] ) ? $_POST[_wr_event_review] : null;
    update_post_meta($post->ID, \'_event_review\', $value );
    if (! $value ) delete_post_meta( $post ->ID, \'_event_review\' ); 

}

结束

相关推荐

从sidesbar.php的循环中排除当前帖子ID

目前,下面所有代码都显示了来自当前页面所在类别的3篇随机帖子。因此,如果当前页面属于“艺术家”类别,例如,请在页面的下面显示“艺术家”类别中的3篇随机帖子。我的问题是,当前帖子一直出现在这一部分中,我想将其排除在外,但无法使用我当前的循环来解决此问题。这是我的循环:<?php if ( in_category( \'artists\' ) ) { ?> <h2>Similar articles</h2>