保存WordPress时自定义字段不更新

时间:2014-03-14 01:16:31

标签: php wordpress

我已经写了一个函数来采取一些自定义分类法和&在这种情况下发布标题(街道(帖子标题),城市,州,邮编)并将它们地理编码为纬度/经度以保存到自定义字段_ct_latlng

问题是它没有在保存或更新后触发。任何帮助表示赞赏!

function ct_geocode_address($post_id) {
    global $post;
    if($_POST['post_type'] != 'listings')
        return;

    $city =  wp_get_post_terms($post_id, 'city');
    $city = $city[0];
    $city = $city->name;
    $state =  wp_get_post_terms($post_id, 'state');
    $state = $state[0];
    $state = $state->name;
    $zip =  wp_get_post_terms($post_id, 'zipcode');
    $zip = $zip[0];
    $zip = $zip->name;
    $street = get_the_title($post_id);

    if($street && $city) {
        global $post;
        $url = "http://maps.googleapis.com/maps/api/geocode/json?address=".urlencode($street.' '.$city.', '.$state.' '.$zip)."&sensor=false";
        $resp = wp_remote_get($url);
        if ( 200 == $resp['response']['code'] ) {
            $body = $resp['body'];
            $data = json_decode($body);
            if($data->status=="OK"){
                $latitude = $data->results[0]->geometry->location->lat;
                $longitude = $data->results[0]->geometry->location->lng;
                print $latitude.','.$longitude;
                update_post_meta($post_id, "_ct_latlng", $latitude.','.$longitude);
            }
        }
    }
}
add_action('save_post', 'ct_geocode_address');

3 个答案:

答案 0 :(得分:0)

尝试替换

if($_POST['post_type'] != 'listings')

$post = get_post( $post_id );
if($post->post_type != 'listings')

更新:

问题是您正在以默认优先级10运行ct_geocode_address功能。

您在主题中的其他位置有代码,用于更新手动输入到商品详情元框中的值。手动输入的值将通过ct_geocode_address()覆盖设置的值。这意味着该字段正在保存,但随后它将根据edit.php发送的$ _POST值再次保存。

更改

add_action('save_post', 'ct_geocode_address');

add_action('save_post', 'ct_geocode_address', 999);

这将有效。

答案 1 :(得分:0)

自定义帖子类型slugs往往是单数 - 也许这只是一个打错你的错字?尝试针对listing(单数)而不是listings(复数)进行测试。当然,这只取决于你如何定义CPT。

另外,请尝试使用get_post_type()功能进行测试。

if( get_post_type( $post_id ) != 'listing' )

答案 2 :(得分:0)

$lan = $latitude.','.$longitude;
update_post_meta($post_id, "_ct_latlng", $lan);