保存时不触发SAVE_POST操作

时间:2014-04-20 作者:Noob Coder

下面是我的代码,它将获取post\\u id并从同一类别中随机获取3篇帖子,并将它们存储为自定义字段。代码显然是有效的,因为当我单击“New Post”时,我看到自定义字段正在填充,但当我单击“Publish”或“Save”时,下面的代码没有得到执行,据我所知,在创建新帖子时将调用一次Save\\u Post,在实际保存帖子时将调用一次Save\\u Post。

有趣的是,下面的代码可以在本地服务器WAMP上运行,但不能在我的生产服务器上运行,我不知道为什么。它们都使用相同的插件。

function update_postmeta($post_id) {
global $post;

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

unset($rand_id);

$cat_id = get_the_category($post_id);

$args = array(
\'showposts\' => 3,
  \'orderby\' => \'rand\',
  \'cat\' => $cat_id[0]->cat_ID,
  );
   $my_query = new WP_Query($args);
  while ($my_query->have_posts()) : $my_query->the_post();
    $rand_id = $rand_id.get_the_ID().\',\';
  endwhile; update_post_meta($post_id, \'related_id\',$rand_id);
  }

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

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

您的代码中有一些错误。例如,您unset 未定义的变量。下面的一些行您试图再次使用未定义的变量。。。。也许这就是问题的根源。

你能试试这个吗?(编辑,我认为更好get_postsnew WP_Query 在这种情况下)

function wpse_update_postmeta($post_id) {

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

    $cat_id = get_the_category($post_id);
    $related_posts = array();

    if( !empty($cat_id) ) {

        $args = array(
        \'posts_per_page\' => 3,
        \'orderby\' => \'rand\',
        \'category\' => $cat_id[0]->cat_ID,
    );

    $related_posts = get_posts($args);
    }

    if( count($related_posts) > 0 ) {

        $rand_id = array();

        foreach( $related_posts as $related_post ) {
            $rand_id[] = $related_post->ID;
        }

       update_post_meta($post_id, \'related_id\', implode(",", $rand_id));
       //Uncomment the next line to check if you get here
       //error_log("Hello! I\'m here");

    }

}
add_action(\'save_post\', \'wpse_update_postmeta\');

结束

相关推荐

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( $