it-swarm.com.de

Erhalten Sie aktuelle Beiträge nach Datum in Multisite

Alles in der Erklärung handelt vonCDTuts

Ich habe ein WordPress-Netzwerk erstellt und möchte die neuesten Beiträge aus allen ausgewählten Subdomain-Blogs erhalten. Ich muss das neueste Alle nach Datum und nicht nach Blog-ID organisieren.

Ich möchte switch_to_blog daher nicht mit foreach verwenden, da ich nur Posts innerhalb der nächsten Blogs schleife, die ich wechsle. Ich möchte die Beiträge tatsächlich kombinieren und sie alle nach Datum sortieren lassen. Ich würde mir vorstellen, dass Sie dies tun müssten, indem Sie mysql abfragen, anstatt WP_Query zu verwenden. Aber ich hoffte auf eine einheimischere Art und Weise, dies zu tun. Dies ist die Liste der Posts, die am Ende der Titelseite erstellt werden sollen, wie Sie sehen können, wenn die Zeitstempel nicht um die Zahl größer oder kleiner auf- oder absteigend sind.

Ich habe sogar versucht, so etwas zu tun, aber das würde auch nicht funktionieren. Sortieren des Posts nach Unix-Zeitstempel, um nur zu erkennen, dass die Posts immer noch von switch_to_blog organisiert werden, anstatt zeitnah.

<?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 }         
?>

Ich habe auch eine Funktion erstellt, mit der ich die ID des Blogs mit switch_to_blog auswählen kann. Dies funktioniert nur auf den Kacheln oben auf der Startseite. Aber ich versuche auch, dasselbe für die neuesten Posts unten zu tun. Ich kann keinen Versatz erstellen, um das Kacheldesign beizubehalten, während die 6 neuesten Beiträge beibehalten werden.

Dies basierte auf einer vorherigen Antwort auf 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

Da wordpress multisite für alle Blogs unterschiedliche Tabellen verwendet, ist es sehr ineffizient, alle aktuellen Artikel aller Blogs (Inhaltsaggregation) zur Anzeigezeit abzurufen, da Sie alle Blogs abfragen, die Artikel nach Datum sortieren und die benötigte Menge anzeigen müssen.

Plugins wie WordPress Post Indexer ( https://premium.wpmudev.org/project/post-indexer ) schreiben zusätzlich alle Posts in eine zentrale DB-Tabelle, sobald Sie sie einfügen oder aktualisieren. Von dort aus können Sie sie sehr effizient abfragen.

Ich habe das Plugin selbst benutzt - es lohnt sich zu versuchen. Ich bin nicht mit dem Schöpfer verbunden.

Es gibt auch einige Dinge zu beachten: Zum Beispiel: Wenn Sie benutzerdefinierte Post-Metafelder anzeigen möchten, müssen Sie switch_to_blog verwenden.

1
jjarolim

Überprüfen Sie meine Antwort in Holen Sie sich Beiträge von Network (Multisite) . Mein "Multisite Post Reader" -Plugin (kostenlos, Open Source) erfasst alle Posts aus allen Unterwebsites mit Optionen zum Begrenzen der Anzahl, des Datums usw.

Es ist wahrscheinlich ein bisschen "schwer" (ineffizient), wie von @jjarolim erwähnt, aber vielleicht hilft Ihnen der Code bei Ihren Bemühungen.

0
Rick Hellewell

Mir ist klar, dass diese Frage ziemlich "alt" ist, aber ich habe eine Lösung gefunden.

Es ist möglich, Beiträge von anderen Blogs im Netzwerk mit mehreren Sites abzurufen, ohne switch_to_blog(); oder restore_current_blog(); verwenden zu müssen.

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

}

Ich hielt es kurz und auf den Punkt. Sie können dies jedoch erweitern, indem Sie mehrere Beitragstypen oder Beitragsstatus usw. zulassen.

Derzeit können Sie mit dieser Funktion oben den Beitragstyp, den Beitragsstatus und die Sortierung nach folgenden Kriterien steuern:

Sortierbare Optionen:

  • Beitrags-ID
  • Post-Titel
  • Post Slug
  • Veröffentlichungsdatum veröffentlichen
  • Änderungsdatum
  • Beitragsautor-ID
  • Blog ID

Schauen Sie sich die Standardargumente an, um eine Liste der Argumente zu erhalten, die Sie überschreiben können, um sie Ihren spezifischen Anforderungen anzupassen.

Ich dachte nur, ich würde dies als mögliche Lösung für jemanden empfehlen, der eine Basis für jede Situation verwendet, in der Sie möglicherweise Beiträge im gesamten Netzwerk abrufen müssen.

Sie können es auch so ändern, dass anstelle von allem die Post-IDs zurückgegeben werden. Dann können Sie die Beitrags-IDs in einer new WP_Query(); für komplexere Aufgaben wie Meta-Abfragen und/oder Taxonomie-Abfragen usw. verwenden.

Hoffe, jemand findet das nützlich.

0
Michael Ecklund