web-dev-qa-db-fra.com

Modifier la catégorie de publication en fonction des dernières publications

J'ai un champ personnalisé appelé post_views_count qui stocke les vues de chaque message sur mon blog. J'aimerais utiliser ces vues pour décider à quelle catégorie appartiennent les messages. Voici ce que je voudrais arriver:

  1. Mettez les 50 derniers messages en groupes de 10.
  2. Recherchez quelle publication dans chaque groupe a les vues les plus hautes et déplacez-les dans la catégorie large .
  3. Trouvez la moyenne des 9 postes restants dans chaque groupe.
  4. Les postes inférieurs à la moyenne de chaque groupe sont déplacés vers la catégorie petite et les postes supérieurs à la moyenne sont déplacés vers la catégorie moyenne .

Cela devrait donner lieu à 1 grand poste, 4 ou 5 moyens et 4 ou 5 petits postes par groupe. Ce processus s’exécuterait toutes les heures sur un cron pour actualiser les catégories et s’exécuter à chaque nouvelle publication. Lorsqu'un message quitte les 50 derniers messages, il ne reste que la catégorie à laquelle il a été attribué.

J'ai cherché des solutions similaires et je n'ai pas trouvé grand chose. Toute aide serait très appréciée.

2
mastercoeurl

J'ai pris la liberté d'ignorer les étapes 1 et 3, car elles semblent faire partie de votre approche principale pour atteindre votre objectif et ne pas être votre objectif lui-même. Je crois que vous pouvez atteindre votre objectif d'une manière plus simple.

function assign_last_posts_cat_by_views( $posts_number = 50, $delete_last_posts_transient = true ) {
    if ( true === $delete_last_posts_transient ) {
        delete_transient( 'last_posts' );
    }

    if ( ! $posts = get_transient( 'last_posts' ) ) {
        $args = array(
            'numberposts' => $posts_number
        );

        $posts = get_posts( $args ); // Gets your posts...

        set_transient( 'last_posts', $posts, 60*60*24 ); // Caches the result...
    }

    $post_views = array();

    foreach ( $posts as $post ) {
        $post_views[ $post->ID ] = get_post_meta( $post->ID, 'post_views_count', true ); // Gets each post views count...
    }

    arsort( $post_views, SORT_NUMERIC ); // Sorts views in desc order...

    $post_number = 0;

    foreach ( $post_views as $post_id => $views ) {
        if ( $post_number < 5 ) {
            $term_slug = 'large';

        } elseif ( $post_number < 30 ) {
            $term_slug = 'medium';

        } else {
            $term_slug = 'small';
        }

        $term = get_term_by( 'slug', $term_slug, 'category' ); // Gets term and caches it...

        wp_set_post_terms( $post_id, array( $term->term_id ), 'category' ); // Programatically assignes the category to the post...

        $post_number++;
    }
}

Maintenant, en tant que tâche CRON, pour actualiser les catégories de vos dernières publications toutes les heures sans exécuter de nouvelle requête, vous pouvez procéder de la manière suivante:.

add_action( 'hourly_process', 'assign_last_posts_cat_by_views', 10, 2 );
wp_schedule_event( time(), 'hourly', 'hourly_process', array( 50, false ) );

Et pour lancer le processus quand un message est sauvegardé ...

add_action( 'save_post', 'assign_last_posts_cat_by_views' );
2
ClemC