O que seria um comando PHP para apagar todas as mensagens da categoria X do último mês?

3

Desejo executar uma tarefa do cron que apague permanentemente todas as postagens pertencentes a alguma categoria dos últimos X dias (digamos, semana). Isso é provavelmente muito básico, mas eu gostaria de receber alguns apontamentos. Obrigado.

    
por Tal Galili 18.04.2017 / 12:09

2 respostas

6

O primeiro passo é configurar o cron job.

A segunda parte requer a consulta do banco de dados para um tipo de postagem específico em que a entrada tenha mais de uma semana. Podemos fazer isso com get_posts () e especificando o argumento category e o argumento date_query.

//* If the scheduled event got removed from the cron schedule, re-add it
if( ! wp_next_scheduled( 'wpse_263953_remove_old_entries' ) ) {
  wp_schedule_event( time(), 'daily', 'wpse_263953_remove_old_entries' );
}

//* Add action to hook fired by cron event
add_action( 'wpse_263953_remove_old_entries', 'wpse_263953_remove_old_entries' );
function wpse_263953_remove_old_entries() {
  //* Get all posts older than 7 days...
  $posts = get_posts( [
    'numberposts' => -1,
    //* Use 'cat' to query the category ID
    //* 'cat' => 'wpse_263953_category_id',
    //* Use 'category_name' to query the category slug
    'category_name' => 'wpse_263953_category',
    'date_query' => [
      'after' => date( "Y-m-d H:i:s", strtotime( '-7 days', current_time( 'timestamp' ) ) ),
      //* For posts older than a month, use '-1 months' in strtotime()
    ],
  ]);
  //* ...and delete them
  foreach( $posts as $post ) {
    wp_delete_post( $post->ID );
  }
}
    
por Nathan Johnson 20.04.2017 / 21:24
2

Após a Consulta, você receberá uma lista de ID da postagem com mais de 30 dias para determinada ID da categoria.

SELECT  
    p.ID as post_id, 
    term.term_id as category_id
FROM wp_posts as p 
LEFT JOIN wp_term_relationships as tr ON tr.object_id = p.ID
LEFT JOIN wp_terms as term ON tr.term_taxonomy_id = term.term_id
WHERE term.term_id = "CATEGORY ID HERE" 
    AND DATEDIFF(NOW(), p.post_date) > 30

Depois de obter a lista, você pode decidir o tempo que deseja excluir ou não publicar.

Para excluir a função pós-uso seguinte, o segundo parâmetro (VERDADEIRO) excluirá a postagem permanentemente. Se você quiser manter a postagem no lixo (FALSE)

wp_delete_post( 'YOUR_POST_ID_HERE', TRUE);

Não se esqueça de alterar o prefixo da tabela se não for 'wp _'

    
por JItendra Rana 18.04.2017 / 12:33