web-dev-qa-db-fra.com

Obtenir les messages récents par Date in Multisite

Tout dans l'explication concerneCDTuts

J'ai créé un Réseau WordPress et je souhaite obtenir les publications récentes de tous les blogs de sous-domaines sélectionnés. Je dois obtenir le dernier All organisé par date et non par ID du blog.

Je ne veux pas utiliser switch_to_blog donc, en utilisant foreach, parce que je ne fais que boucler des posts dans les prochains blogs que je change. Je veux réellement combiner les messages et les avoir tous organisés par date. J'imagine que vous devriez le faire en interrogeant mysql au lieu d'utiliser WP_Query. Mais j'espérais une façon plus autochtone de faire cela. Ceci est pour la liste des publications à faire en bas de la page de couverture comme vous pouvez le voir avec des horodatages qui ne sont ni ascendants ni descendants.

J'ai même essayé de faire quelque chose comme ça, mais ça ne marcherait pas non plus. Triez la publication par timestamp Unix, pour vous rendre compte que les publications sont toujours organisées par switch_to_blog au lieu d’une manière opportune.

<?php           
    switch_to_blog(1);
    $main_posts = get_posts();
    switch_to_blog(2);
    $php_posts = get_posts();
    switch_to_blog(3);
    $wp_posts = get_posts();
    switch_to_blog(4);
    $mac_posts = get_posts();
    switch_to_blog(4);
    $psd_posts = get_posts();
    switch_to_blog(1);

    $posts = array_merge($main_posts, $php_posts, $wp_posts, $mac_posts, $psd_posts);
    usort($post, get_post_time);

    foreach($posts as $post){
    ?>
        <li class="thumb"><a href="<?php echo the_permalink(); ?>">
            <div class="site-name">
            </div>
            <div class="title">
                <?php echo the_title(); ?><br> <?php echo get_post_time(); ?>
            </div>
        </a></li>
    <?php }         
?>

J'ai également créé une fonction permettant de sélectionner l'ID du blog à l'aide de switch_to_blog . Cela ne fonctionnera que sur les carreaux en haut de la page de couverture. Mais j'essaie aussi de faire la même chose pour les derniers messages en bas. Je ne pourrai pas créer de décalage pour pouvoir conserver la conception des carreaux tout en conservant les 6 derniers messages.

Ceci était basé sur une réponse précédente sur StackExchange

function global_latest_post($LatestBlogNumber,$LatestPostNumber, $LatestThumbSize, $LatestThumbNumber) {
    $original_blog_id = get_current_blog_id();
    $bids = array($LatestBlogNumber);    

    foreach($bids as $bid) {
        switch_to_blog($bid);
        $tiles = new WP_Query('posts_per_page=1');
        while ($tiles->have_posts()) : $tiles->the_post(); ?>
            <a href="<?php echo the_permalink(); ?>" class="<?php echo $LatestThumbSize; ?> thumb-<?php echo $LatestThumbNumber; ?>">
                <p class="cover">Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</p>
                <p class="bold bottom">Read More &rarr;</p>
                <h1><?php echo $LatestPostNumber; ?>. <?php echo the_title(); ?> in <?php bloginfo('name'); ?></h1>
            </a>
        <?php           
        endwhile;
    }
    switch_to_blog( $original_blog_id ); //switched back to current blog
}
5
Satan

Puisque wordpress multisite utilise des tables différentes pour tous les blogs, il est très inefficace d’afficher le temps d’affichage de tous les articles récents de tous les blogs (agrégation de contenu), car vous devez interroger tous les blogs, trier les articles par date et afficher le montant souhaité.

Des plugins tels que WordPress Post Indexer ( https://premium.wpmudev.org/project/post-indexer ) permettent d’écrire toutes les publications dans une seule table centrale au moment de les insérer ou de les mettre à jour. À partir de là, vous pouvez les interroger très efficacement.

J'ai utilisé le plugin mentionné par moi-même - ça vaut le coup d'essayer. Je ne suis pas associé au créateur.

Par exemple, si vous souhaitez afficher des champs de méta de publication personnalisés, vous devez utiliser switch_to_blog.

1
jjarolim

Découvrez ma réponse dans Obtenez des messages de Réseau (Multisite) . Mon plugin 'Multisite Post Reader' (gratuit, open source) récupère toutes les publications de tous les sous-sites avec des options permettant de limiter le nombre, la date, etc.

C'est probablement un peu 'lourd' (inefficace), comme mentionné par @jjarolim, mais peut-être que le code vous aidera dans vos efforts.

0
Rick Hellewell

Je me rends compte que cette question est plutôt "ancienne", cependant, j'ai trouvé une solution.

Il est possible de récupérer des publications d'autres blogs du réseau multisite sans avoir besoin d'utiliser switch_to_blog(); ou restore_current_blog();.

/**
 * This is an example of retrieving posts from multiple blogs in Multisite.
 *
 * @author Michael Ecklund
 * @author_url https://www.michaelbrentecklund.com
 *
 * @param array $user_args
 *
 * @return array|bool|null|object
 */
function mbe_get_network_posts( Array $user_args = Array() ) {

    if ( ! is_multisite() ) {
        return false;
    }

    $default_args = array(
        'post_type'   => 'post',
        'post_status' => 'publish',
        'limit'       => absint( get_option( 'posts_per_page' ) ),
        'orderby'     => 'post_date',
        'order'       => 'DESC'
    );

    $args = wp_parse_args( $user_args, $default_args );

    $args['orderby'] = strtolower( $args['orderby'] );
    $args['order']   = strtoupper( $args['order'] );

    if ( ! in_array( $args['orderby'], array(
        'id',
        'post_title',
        'post_name',
        'post_date',
        'post_modified',
        'post_author',
        'blog_id'
    ) ) ) {
        return false;
    }

    if ( ! in_array( $args['order'], array(
        'ASC',
        'DESC'
    ) ) ) {
        return false;
    }

    global $wpdb;

    if ( ! $blog_ids = $wpdb->get_col( "SELECT DISTINCT blog_id FROM {$wpdb->blogs}" ) ) {
        return false;
    }

    $queries = array();

    $where = array(
        'post_type'   => $wpdb->prepare( "AND post_type = %s", $args['post_type'] ),
        'post_status' => $wpdb->prepare( "AND post_status = %s", $args['post_status'] ),
    );

    foreach ( $blog_ids as $blog_id ) {

        if ( $blog_id == 1 ) {
            $prefix = substr( $wpdb->base_prefix, 0, - 1 );
        } else {
            $prefix = $wpdb->base_prefix . $blog_id;
        }

        $queries[] = $wpdb->prepare(
            "
            ( 
                SELECT *, {$blog_id} AS blog_id
                FROM {$prefix}_posts
                WHERE 1=1 " . join( " ", $where ) . "
                ORDER BY {$args['orderby']}
                {$args['order']}
                LIMIT %d
            )
            ",
            absint( $args['limit'] )
        );

    }

    $query = join( "UNION", $queries ) . "ORDER BY {$args['orderby']} {$args['order']}";

    return $wpdb->get_results( $query );

}

Je l'ai gardé court et au point. Cependant, vous pouvez développer ceci en autorisant plusieurs types ou statuts de publication, etc.

Actuellement, avec cette fonction ci-dessus, vous pouvez contrôler le type et le statut de la publication et trier par:

Options de tri:

  • Post ID
  • Titre de l'article
  • Potasse
  • Date de publication
  • Date de modification
  • Auteur Post ID
  • ID de blog

Examinez les arguments par défaut pour obtenir une liste d’arguments à remplacer pour répondre à vos besoins spécifiques.

Je pensais juste que je partagerais cette solution en tant que solution permettant à quelqu'un d'utiliser une base pour toute situation dans laquelle vous pourriez avoir besoin de récupérer des publications sur l'ensemble du réseau.

En outre, vous pouvez le modifier pour renvoyer les ID de poste, au lieu de tout. Ensuite, vous pouvez utiliser l'ID de publication dans new WP_Query(); pour quelque chose de plus complexe, comme les requêtes Meta et/ou Taxonomy, etc.

J'espère que quelqu'un trouve cela utile.

0
Michael Ecklund