expira postagens de usuários do wordpress

4

Estou tentando criar um tema WordPress classificado e preciso fazer com que as postagens dos usuários expirem, além de mostrar essa data na postagem. Os usuários só podem publicar suas postagens em post-types, não como postagens ordinárias do WordPress.

Alguém sabe como posso fazer isso?

Atualização: De acordo com as respostas dadas a esta pergunta até agora eu tenho que dizer dar data de validade para os tipos de post por meta post não é o que eu quero causar usuários poderiam mudar que eu quero a data de 30 dias (significa 30 dias após publicar seu post) post permanentemente ser excluído e a data automaticamente adicionar à postagem no back-end não manualmente com admin ou autor. Espero que minha média seja mais clara agora.

Agradecimentos especiais a: @sakibmoon. Obrigado.

    
por Scott Wolter 21.05.2015 / 02:24

1 resposta

6

Você pode definir a data de expiração como pós meta valor. Em single.php você pode facilmente mostrar essa data consultando o post meta.

Veja update_post_meta () e get_post_meta ()

Agora, a segunda parte da sua pergunta é bem complicada. Posso pensar em 2 soluções.

  • Cron

Você pode usar o wordpress cron para executar em um intervalo de tempo para verificar qual postagem foi expirada e excluir / definir como draft / o que você não quer fazer com essas postagens. Veja wp_cron ()

Prós:

  1. Muito fácil de implementar.

Contras:

  1. A tarefa cron não será disparada se ninguém visitar o seu site (para sites ocupados com usuários frequentes, isso não é um problema)

  2. Se você tiver muito post, verificar cada postagem em um intervalo de tempo terá uma penalidade de desempenho.

  3. Não confiável em tudo. A postagem não expirará exatamente no horário especificado.

(Eu sempre odiei o wp_cron () e nunca uso ele mesmo)

Uma opção um pouco melhor é usar a tarefa Cron do seu servidor. Mas mesmo isso não garantirá a expiração do post no momento exato, já que você precisa executar o cron em um intervalo de tempo e também há uma penalidade de desempenho.

  • Modifique o arquivo Single.php e publique a consulta

A melhor opção, na minha opinião, é verificar a data de expiração da postagem no seu single.php e exibir uma mensagem verificando expiration_date. Você também pode excluir / definir como draft , a primeira vez que essa página é solicitada por um usuário após a data de expiração, causando 404 para uma visita posterior.

Para remover as páginas expiradas das páginas de arquivo, você pode usar o gancho de ação pre_get_post para modificar a consulta com base em o post meta.

Prós

  1. Data de validade exata.
  2. Controle total sobre o que você deseja fazer.
  3. Pena de desempenho insignificante.

Contras:

  1. Mais um pouco de trabalho.

(Considerando as vantagens, não é muito mais trabalho. Se eu fosse você, escolheria essa opção)

  • Use um plug-in

Existem muitos plugins que parecem fazer exatamente isso. Mas eu não sei como eles funcionam ou se podem atender às suas necessidades. Você tem que verificar isso sozinho.

EDITAR

  

Estou tentando criar um tema WordPress classificado e preciso fazer com que as postagens dos usuários expirem, além de mostrar essa data na postagem. Os usuários só podem publicar suas postagens em post-types, não como postagens ordinárias do WordPress.

Você precisa usar register_post_type () para criar um tipo de postagem personalizado. Você também precisará criar uma taxonomia personalizada se quiser classificá-las. Use register_taxonomy () para isso.

Veja também Existe uma diferença entre taxonomias e categorias

  

De acordo com as respostas dadas a esta questão até agora eu tenho que dizer que dar data de validade para os tipos de postagem por meta-postagem não é o que eu quero porque os usuários podem alterar a data de 30 dias. postar) a postagem ser permanentemente excluída e a data adicionar automaticamente à postagem no back-end não manualmente com o administrador ou autor.

Veja o que você está errado. Salvando pós meta não é feito por back-end. Como você vai criar e atualizar o post meta é com você. Para o seu caso, será melhor usar o gancho de ação save_post e atualizar o expire_date de lá. Um exemplo de exemplo seria

//This hook will fire when a post is created or updated.
add_action('save_post', 'set_expire_date_meta')

function set_expire_date_meta( $post_id ) {
    //We are checking if the saved post belongs to the CPT
    if( 'custom-post-type-name-that-you-registered' == get_post_type( $post_id ) ) {
        $meta = $get_post_meta($post_id, 'expire_date', true);
        //If the meta already exists, the post is being updated and we don't need to save the meta again
        if( $meta == '' ) {
            $timestamp_30day = strtotime("+1 month");
            update_post_meta( $post_id, 'expire_date', $timestamp_30day);
        }
    }
}

Como você deseja que a data de expiração funcione apenas para o tipo de postagem personalizada, adicione uma condição extra à consulta principal, como is_post_type_archive( 'custom-post-type-name-that-you-registered' ) in remove_expired_post_from_main_query function que mencionei, para que a consulta principal não seja alterada para nenhuma outra postagem tipo como post / page etc.

Em expire_posts_to_404_redirect , altere is_single() para is_singular('custom-post-type-name-that-you-registered') , para que apenas esse tipo de postagem personalizada seja enviado para 404.

//This filter will show 404 page for expired posts for the cpt that you registered
add_filter('template_redirect', 'expire_posts_to_404_redirect' );
function expire_posts_to_404_redirect() {
    global $wp_query;
    global $post;

    if( is_singular('custom-post-type-name-that-you-registered') ) {
        $expire_date = get_post_meta($post->ID, 'expire_date', true);
        if( ($expire_date != '') && ($expire_date < time()) ) {
            $wp_query->set_404();
            status_header( 404 );
        }
    }
}

//This action will alter main query to remove expired posts from archive pages of the CPT that you registered
add_action('pre_get_posts', 'remove_expired_post_from_main_query');
function remove_expired_post_from_main_query($query) {
    if( $query->is_main_query() && !is_admin() && is_post_type_archive('custom-post-type-name-that-you-registered') ) {
        //We are comparing expiry date with current timestamp.
        //It will only keep the posts with expiry_date > current timestamp
        $meta_query = array(
            array(
                'key' => 'expire_date',
                'value' => time(),
                'compare' => '>'
            )
        );
        $query->set( 'meta_query', $meta_query );
    }
}

Espero que isso ajude.

    
por sakibmoon 21.05.2015 / 06:16