Cambiar el estado de la publicación según el valor meta

4

Tengo este cron configurado para trash posts x días después de su publicación. Esto funciona. Editar: Agregué mi respuesta a mi pregunta.

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 );
    }
}  
  

Lo que me gustaría hacer : incluir las publicaciones en la función anterior que se basan en un valor de campo de metadatos (el valor predeterminado es 21 días, pero un usuario puede seleccionar una fecha anterior).

Configuré un segundo cron para hacer esto.

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 );
           }
        }
    }
}

No sé si este es el mejor método pero está funcionando.

    
pregunta Michael B 11.03.2013 - 00:03

1 respuesta

1

Su código se ve bien, y teniendo en cuenta que no está enviando datos ingresados por el usuario, no se requiere el método prepare (), pero como práctica recomendada es bueno aprender cómo funciona y usarlo de manera consistente.

Dicho esto, utilizando el método prepare (), su código se vería así:

$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 );

Además, podría acortar su declaración if de:

if ( $expiration_date > $today )
           { 

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

               wp_update_post( $my_post );
           }

a:

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

Lea otras preguntas en las etiquetas