web-dev-qa-db-fra.com

expirer les messages utilisateur wordpress

J'essaie de faire un thème WordPress classifié et je dois faire en sorte que les messages des utilisateurs expirent le jour et qu'ils affichent cette date dans le message. Les utilisateurs ne sont autorisés à publier leurs articles que dans des types d'articles, pas comme des articles WordPress ordinaires.

Est-ce que quelqu'un sait comment puis-je le faire?

Mise à jour: Selon les réponses données à cette question jusqu'à présent, je dois dire que donner une date d'expiration aux types de messages par méta-post n'est pas ce que je veux car les utilisateurs pourraient changer pour que je veuille la date de 30 jours (signifie après publication de leur message), le message sera définitivement supprimé et la date sera automatiquement ajoutée au message dans le back-end, pas manuellement avec admin ou author. J'espère que mes paroles soient plus claires maintenant.

Un merci spécial à: @sakibmoon. Merci.

4
Scott Wolter

Vous pouvez définir la date d'expiration comme valeur post-méta. Dans single.php, vous pouvez facilement afficher cette date en interrogeant la méta de la publication.

Voir update_post_meta () et get_post_meta ()

Maintenant, la deuxième partie de votre question est assez délicate. Je peux penser à 2 solutions.

  • Cron

Vous pouvez utiliser wordpress cron pour s'exécuter à un intervalle de temps afin de vérifier quelle publication a expiré et supprimer/définir comme draft/quoi que vous ne vouliez pas faire avec ces publications. Voir wp_cron ()

Avantages:

  1. Très facile à mettre en œuvre.

Inconvénients:

  1. La tâche périodique ne se déclenche pas si personne ne visite votre site (ce n'est pas un problème pour un site occupé avec des utilisateurs fréquents).

  2. Si vous avez beaucoup de messages, vérifier chaque message à un intervalle de temps sera pénalisé en termes de performances.

  3. Pas fiable du tout. Le message n'expirera pas exactement à l'heure spécifiée.

(J'ai toujours détesté wp_cron () et ne l'utilise jamais moi-même)

Une option un peu meilleure consiste à utiliser la tâche périodique de votre serveur. Mais même cela ne garantira pas l'expiration post-heure exacte à l'heure exacte car vous devez exécuter cron à un intervalle de temps et cela entraîne également une pénalité de performance.

  • Modifier le fichier Single.php et publier une requête

Une meilleure option à mon avis est de vérifier la date de post-expiration dans votre single.php et d'afficher un message de vérification expiration_date. Vous pouvez également supprimer/définir comme draft, la première fois que cette page est demandée par un utilisateur après la date d'expiration, ce qui provoque 404 visite ultérieure.

Pour supprimer les pages expirées des pages d'archive, vous pouvez utiliser le crochet pre_get_post action pour modifier la requête en fonction du méta de publication.

Pros

  1. Date d'expiration exacte.
  2. Contrôle total sur ce que vous voulez faire.
  3. Pénalité de performance négligeable.

Inconvénients:

  1. Juste un peu plus de travail.

(Compte tenu des avantages, ce n’est pas beaucoup de travail. Si j'étais vous, je choisirais cette option)

  • Utiliser un plugin

Il y a beaucoup de plugins qui semblent le faire exactement. Mais je ne sais pas comment ils fonctionnent ni s'ils peuvent répondre à vos exigences. Vous devez les vérifier vous-même.

EDIT

J'essaie de créer un thème WordPress classifié et je dois faire en sorte que les messages des utilisateurs expirent le jour et les affiche dans le message. Les utilisateurs ne sont autorisés à publier leurs articles que dans des types d'articles, pas comme des articles WordPress ordinaires.

Vous devez utiliser register_post_type () pour créer un type de publication personnalisé. Vous devrez également créer une taxonomie personnalisée si vous souhaitez les classer. Utilisez register_taxonomy () pour cela.

Voir aussi Y a-t-il une différence entre les taxonomies et les catégories?

Selon les réponses données à cette question jusqu'à présent, je dois dire que donner la date d'expiration aux types de message par méta-message n'est pas ce que je veux, car les utilisateurs pourraient changer pour que je souhaite la date de 30 jours (signifie 30 jours après la publication de leur message) le post définitivement être supprimé et la date ajouter automatiquement à la poste en back-end pas manuellement avec admin ou auteur.

Voici ce que vous avez tort. L'enregistrement de la méta n'est pas effectué en bout de ligne. Comment vous allez créer et mettre à jour la méta post est à vous. Dans votre cas, il vaudra mieux utiliser save_post action hook et mettre à jour le expire_date à partir de là. Un exemple d'exemple serait

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

Si vous souhaitez que la date d'expiration ne fonctionne que pour le type de message personnalisé, ajoutez une condition supplémentaire à la requête principale telle que is_post_type_archive( 'custom-post-type-name-that-you-registered' ) dans la fonction remove_expired_post_from_main_query que j'ai mentionnée afin que la requête principale ne soit pas modifiée pour tout autre type de message tel que post/page, etc.

Dans expire_posts_to_404_redirect, remplacez is_single() par is_singular('custom-post-type-name-that-you-registered') afin que seul ce type de publication personnalisé passe à 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 );
    }
}

J'espère que cela t'aides.

6
sakibmoon