2016-11-06 48 views
0

我有一个每天运行的函数,我想检查帖子是否过期(基于自定义postmeta字段),如果是这样,则将帖子状态设置为草稿。我认为我有正确的原则,但是有些东西可能是错误的,而这些语法并没有使它正常工作。这是迄今为止功能:如果帖子元字段等于值,使产品帖子草稿

function make_product_draft() { 
    global $wpdb; 
    $sql = " 
    UPDATE $wpdb->posts 
    INNERJOIN $wpdb->postmeta on $wpdb->posts.ID = $wpdb->postmeta.post_id 
    SET $wpdb->posts.post_status = 'draft' 
    WHERE $wpdb->posts.post_type = 'product' AND $wpdb->posts.post_status = 'publish' AND $wpdb->postmeta.post_type = 'expired' 
    "; 
    $wpdb->query($sql); 
} 

我想我要去的地方错的是当我这样做:$ wpdb-> posts.ID?我不确定什么是正确的语法。您的帮助是非常感谢:)

+1

你要“INNERJOIN”拆分为“INNER JOIN”,另外,我会建议使用前缀,而不是调用的属性值$ wpdb,所以而不是$ wpdb-> posts,你可以使用{$ wpdb-> prefix}帖子等等。 – niklaz

+0

非常感谢niklaz我会检查这一点,如果它有效,我会报告回答。谢谢 :) – user1190132

回答

0

我的要求改变,因为我发了帖子,但下面的代码为我工作。感谢Niklaz的评论,你的援助是在得到它举足轻重的工作吧:)

function make_product_draft() { 
global $wpdb; 
$sql = "UPDATE {$wpdb->posts} 
INNER JOIN {$wpdb->postmeta} on {$wpdb->posts}.ID = {$wpdb->postmeta}.post_id 
SET {$wpdb->posts}.post_status = 'draft' 
WHERE {$wpdb->posts}.post_type = 'product' AND {$wpdb->posts}.post_status = 'publish' AND {$wpdb->postmeta}.meta_key = '_product_expiry' AND {$wpdb->postmeta}.meta_value < CURDATE() 
"; 
$wpdb->query($sql); 
}