expire les messages utilisateurs de wordpress

4

J'essaie de faire 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.

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

Mise à jour: Selon les réponses apportées à cette question jusqu'à présent, je dois dire que donner une date d'expiration aux types de message par méta-courrier 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) post définitivement être supprimé et la date ajouter automatiquement à la poste en back-end pas manuellement avec admin ou auteur. J'espère que ma moyenne sera plus claire maintenant.

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

    
posée Scott Wolter 21.05.2015 - 02:24

1 réponse

6

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

Voir update_post_meta () et get_post_meta ()

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

  • Cron

Vous pouvez utiliser wordpress cron pour s’exécuter à un intervalle de temps afin de vérifier quelle publication a expiré et pour supprimer / définir en tant que 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énalisant.

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

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

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

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

Selon moi, une meilleure option consiste à vérifier la date de post-expiration dans votre single.php et à afficher un message de vérification de la date d'expiration. 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 pour une visite ultérieure.

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

Avantages

  1. Date d'expiration exacte.
  2. Contrôle total sur ce que vous voulez faire.
  3. Pénétration négligeable des performances.

Inconvénients:

  1. Juste un peu plus de travail.

(Compte tenu des avantages, ce n'est pas beaucoup de travail supplémentaire. 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.

MODIFIER

  

J'essaie de faire 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 ?

  

D'après les réponses apportées à cette question jusqu'à présent, je dois dire que donner une date d'expiration aux types de publication par méta-publication n'est pas ce que je veux, car les utilisateurs pourraient changer pour que je veuille la date de 30 jours (signifie 30 jours après la publication de leur date de publication). post) le post sera définitivement supprimé et la date sera automatiquement ajoutée au post en back-end, pas manuellement avec admin ou author.

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 sera préférable d’utiliser le save_post et d’actualiser 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 fonctionne uniquement 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 remove_expired_post_from_main_query , que j'ai mentionnée, afin que la requête principale ne soit pas modifiée pour un autre message. tapez comme 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 vous aidera.

    
réponse donnée sakibmoon 21.05.2015 - 06:16

Lire d'autres questions sur les étiquettes