错误:为SAVE_POST挂钩添加操作时,POST需要更新两次

时间:2012-04-19 作者:HandiworkNYC.com

我的函数正是我希望它做的:我试图在保存“事件”帖子时在另一个帖子类型中添加/更新元字段。除了帖子需要更新两次,才能在前端更新信息。我做错了什么?

  function bam_create_next_show_meta($post_id) {
        if(get_post_type() == \'tribe_events\') {
            $meta = get_post_meta($post_id, $_artistMeta->$post_id, TRUE);
            $artists = unserialize($meta[\'_artistMeta\'][0]);

            if($meta) {
                $event_link = get_permalink();
                $eventVenue = tribe_get_venue();
                if($eventVenue) {
                    $eventVenueSplit = explode (\' \', $eventVenue, 3);
                    if($eventVenueSplit[0] == \'Centro\' && $eventVenueSplit[1] == \'Cultural\') {
                        $eventVenue = \' en C.C. \'.$eventVenueSplit[2];
                    } elseif($eventVenueSplit[0] == \'Biblioteca\') {
                        $eventVenue = \' en Bibl. \'.$eventVenueSplit[1].\' \'.$eventVenueSplit[2];
                    } else {
                        $eventVenue = \' en \'.$eventVenue;
                    }
                } else {
                    $eventVenue = \'\';
                }

                $eventStartDate = tribe_get_start_date($postID,false,\'j\');
                $eventStartMonth = tribe_get_start_date($postID,false,\'M\');

                $event_sort = tribe_get_start_date($postID,false,\'Y-m-d\');

                $es_eventStartMonth = strftime(\'%b\', strtotime($eventStartMonth));

                $event_title = \'Proxima fecha: <span class="c1 me">\'.$eventStartDate.\' de \'.$es_eventStartMonth.$eventVenue.\'</span>\';

                foreach ($artists[\'artistName\'] as $artist) {
                    if($myid == $artist)
                        continue;
                    $output[] = $artist;
                    $myid = $artist;
                }

                global $post;

                $artistas = get_posts(array(\'post_type\'=> \'artistas\',\'post__in\' => $output, \'posts_per_page\' => -1));

                foreach($artistas as $artista) {
                    setup_postdata($post);

                    $artistID = $artista->ID;

                    $artist_event_id = get_post_meta($artistID, \'artistEventId\', true);
                    $artist_event_link = get_post_meta($artistID, \'artistEventLink\', true);
                    $artist_event_title = get_post_meta($artistID, \'artistEventTitle\', true);
                    $artist_event_sort = get_post_meta($artistID, \'artistEventSort\', true);

                    if(strtotime($artist_event_sort) >= $date_sort || $post_id == $artist_event_id) {
                        update_post_meta($artistID, \'artistEventId\', $post_id, $artist_event_id);
                        update_post_meta($artistID, \'artistEventLink\', $event_link, $artist_event_link);
                        update_post_meta($artistID, \'artistEventTitle\', $event_title, $artist_event_title);
                        update_post_meta($artistID, \'artistEventSort\', $event_sort, $artist_event_sort);                    
                    }
                }
            }
        }
    }

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

1 个回复
最合适的回答,由SO网友:Tom J Nowell 整理而成

你做错了几件事,它们都是愚蠢的、可以避免的、基本的逻辑错误。

首先,您没有检查这是否是自动保存。自动保存不保存自定义字段,只保存原始核心wordpress字段,如内容,因此自动保存将为您提供未设置/空白值。

将其添加到保存功能的顶部:

if ( defined( \'DOING_AUTOSAVE\' ) && DOING_AUTOSAVE )
    return;
接下来,你打电话get_post_type 没有参数。通常,如果您在post循环中,这是可以的,但您没有,因此您无法获取已保存帖子的帖子类型(可能)。添加post id作为参数,例如:

if(get_post_type($post_id) == \'tribe_events\') {
随后立即在以下行:

$meta = get_post_meta($post_id, $_artistMeta->$post_id, TRUE);
我看不到变量的定义或声明$_artistMeta, 我只能假设它是一个全局值,但甚至没有global $_artistMeta;. $_artistMeta不在此范围内定义,如果不是为了可读性,而是为了弹性/鲁棒性,您应该立即修复此问题。如果$_artistMeta 是全局变量,请将其定义为全局变量,如果不是,请为变量指定一个值,使其不是全局变量null.

再往下看,我们看到了与前面相同的错误:

$event_link = get_permalink();
应该是

$event_link = get_permalink($post_id);
如果向下滚动,我们会看到:

$eventStartDate = tribe_get_start_date($postID,false,\'j\');
$eventStartMonth = tribe_get_start_date($postID,false,\'M\');

$event_sort = tribe_get_start_date($postID,false,\'Y-m-d\');
$postID 此处未定义,我假设您指的是正在保存的帖子,因此将其更改为:

$eventStartDate = tribe_get_start_date($post_id,false,\'j\');
$eventStartMonth = tribe_get_start_date($post_id,false,\'M\');

$event_sort = tribe_get_start_date($post_id,false,\'Y-m-d\');
最后,启动一个查询以获取类型为artistas, 但是:

你没有检查是否真的找到了任何帖子,你只是假设并开始一个循环if(!empty($artistas)){

  • 您以后不会使用重置post数据wp_reset_postdata 这意味着之后执行的任何代码都没有使用正确的$post对象,并且将被破坏。在进行查询时,请务必清理干净$postsetup_postdata 呼叫,但这是不正确的。你想愚弄$artista post,而不是保存的post,传递$post毫无意义
  • 我的印象是,您要么没有阅读代码,要么没有尝试调试代码,要么PHP语言技能不足,无法完全理解代码的实际功能。

    我建议:

    阅读WP_Query 类,并在您想要执行帖子循环和获取任何帖子时使用它。它比get_posts(), 而且语法更容易识别。This page has a lot of examplesWP_DEBUG. 它是发展的宝贵工具Read this short page on what PHP variable scope is

    结束

    相关推荐

    Custom Post Row Actions

    我偶然发现this question 在写这个问题的时候。我有一个问题是关于这个问题的。我发现你用的是get_delete_post_link 筛选为我的操作创建一个新的url(或一个类似的函数——在任何情况下,我都会将该函数与布尔值一起使用)。唯一的问题是,I don\'t know how to capture the event now. 考虑到我在谷歌上找不到很多关于行后操作的例子,我将不胜感激-/public function _wp_filter_get_delete_post_link( $