Alterar o status da postagem com base no valor de meta

4

Eu tenho este cron configurado para lixeira x dias depois que ele é postado. Isso funciona. Editar: adicionada minha resposta à minha pergunta.

add_action( 'wp', 'do_trash_ads' );
function do_trash_ads()
{
    if ( ! wp_next_scheduled( 'delete_classifieds' ) )
        wp_schedule_event( time(), 'daily', 'delete_classifieds' );
}

add_action( 'delete_classifieds', 'expire_posts' );
function expire_posts()
{
    global $wpdb;
    $daystogo = "14";

    $post_ids = $wpdb->get_results( "
        SELECT ID 
        FROM {$wpdb->posts}
        WHERE post_type ='classifieds' 
        AND post_status = 'publish' 
        AND DATEDIFF(NOW(), post_date) > '{$daystogo}'
    " );
    foreach( $post_ids as $id )
    {
        $postid =  $id->ID;

        $my_post = array();
        $my_post['ID'] = $postid;
        $my_post['post_status'] = 'trash';
        wp_update_post( $my_post );
    }
}  
  

O que eu gostaria de fazer : incluir postagens na função acima com base em um valor de meta-campo (21 dias é o padrão, mas um usuário pode selecionar uma data anterior).

Eu configurei um segundo cron para fazer isso.

add_action( 'wp', 'do_trash_ads_user' );
function do_trash_ads_user()
{
    if ( ! wp_next_scheduled( 'delete_ads_user' ) )
        wp_schedule_event( time(), 'daily', 'delete_ads_user' );
}

add_action( 'delete_ads_user', 'expire_posts_user' );
function expire_posts_user()
{
   global $wpdb;

   $post_ids = $wpdb->get_results( "
      SELECT ID 
      FROM {$wpdb->posts}
      WHERE post_type ='classifieds' 
      AND post_status ='publish'
   " );

   foreach( $post_ids as $id )
   {
       $postid =  $id->ID;
       $expiration_value = get_post_meta( $postid, 'ecpt_ad-expire-date', true );

       if( $expiration_value )
       {
           $todays_date = date( "Y-m-d" );
           $today = strtotime( $todays_date );
           $expiration_date = strtotime( $expiration_value );
           if ( $expiration_date > $today )
           { 

           }
           else
           { 
               $my_post = array();
               $my_post['ID'] = $postid;
               $my_post['post_status'] = 'trash';

               wp_update_post( $my_post );
           }
        }
    }
}

Eu não sei se esse é o melhor método, mas está funcionando.

    
por Michael B 11.03.2013 / 00:03

1 resposta

1

Seu código parece bem, e considerando que você não está enviando dados inseridos pelo usuário, o método prepare () não é obrigatório, mas como uma boa prática, é bom aprender como funciona e usá-lo consistentemente.

Com isso dito, usando o método prepare (), seu código ficaria assim:

$sql = $wpdb->prepare( "
  SELECT ID
  FROM %s
  WHERE post_type = 'classifieds' 
  AND post_status = 'publish'
  ", $wpdb->posts );

 $post_ids = $wpdb->get_results( $sql, ARRAY_A );

Além disso, você pode encurtar sua declaração if de:

if ( $expiration_date > $today )
           { 

           }
           else
           { 
               $my_post = array();
               $my_post['ID'] = $postid;
               $my_post['post_status'] = 'trash';

               wp_update_post( $my_post );
           }

para:

if ( $expiration_date < $today )
           { 
               $my_post = array();
               $my_post['ID'] = $postid;
               $my_post['post_status'] = 'trash';
               wp_update_post( $my_post );
           }
    
por Tim Hallman 21.09.2013 / 07:55

Tags