Heb je een WordPress multisite en wil je op één (of meerdere) sites posts van een andere site binnen het multisite-netwerk tonen? Met onderstaande code kan je dit voor elkaar krijgen.

Posts van een subsite tonen met een loop

Met onderstaande code maak je een get_posts loop, welke je met parameters aan kan passen naar eigen wens. Dit voorbeeld is vrij basic, maar als je de loop meer wilt customizen, bekijk dan eens de WordPress documentatie.

Site ID achterhalen

Om posts van een subsite te kunnen tonen moet WordPress eerst weten van welke subsite je de posts wil ophalen. Dit doen we aan de hand van een blog ID (blog_id). In onderstaand voorbeeld wordt een loop gemaakt van posts die zijn gemaakt in de website met blog_id 2. Dit is doorgaans de eerste subsite die je aanmaakt in een multisite netwerk.

De ID van de site waar je de posts van wilt tonen kan je achterhalen door te gaan naar jouwsite.nl/wp-admin/network/sites.php. Klik vervolgens de site aan in de lijst, en in de adresbalk verschijnt dan achter de URL, bijvoorbeeld: /site-info.php?id=2. De ID van de site is in dit geval dus 2.

De ID van een site in een WordPress multisite achterhalen

Deze code kan je plaatsen in de paginatemplate(s) waar je wil dat deze posts verschijnen, bijvoorbeeld in index.php of page.php.

<?php
/**
 * Get posts from a single multisite subsite.
 */
global $switched;
switch_to_blog(2); //switched to blog id 2
 
// Get latest Post
$args = array(
	'posts_per_page'   => -1, // Show all posts
	'orderby'          => 'date', // Order posts by date
	'order'            => 'DESC', // Show newest posts to oldest
	'post_type'        => 'post', // Default set to post
);
$latest_posts = get_posts( $args );
$cnt = 0;
?>
	<ul>
		<?php foreach($latest_posts as $post) : setup_postdata($post);?>
			<li>
				<a href="<?php echo get_page_link($post->ID); ?>" title="<?php echo $post->post_title; ?>"><?php echo $post->post_title; ?></a>
			</li>                                
 		<?php endforeach ; ?>
	</ul>
<?php restore_current_blog(); //switched back to main site ?>

Een functie gebruiken voor de query

Je kan deze loop ook in een functie verwerken in je functions.php bestand of een site-specifieke plugin, zodat je in je pagina-template de posts kan tonen door de functie in je template te plaatsen. Bijvoorbeeld:

<?php
/**
 * Get posts from a single multisite subsite.
 *
 * This goes in your theme's functions.php
 * or your site-specific plugin.
 */
function wpsimpel_subsite_posts() {
	// The code from the above snippet goes here
}

In je template-bestand (bijvoorbeeld home.php, index.php of je eigen paginatemplate) plaats je vervolgens de functie:

<?php wpsimpel_subsite_posts(); ?>

Posts van alle subsites tonen met een loop

Het is ook mogelijk om alle posts van alle subsites op te halen met een WP_Query en deze te tonen in een loop. In onderstaand voorbeeld haal ik eerst alle subsites op, en toon ik vervolgens de posts geordend per subsite.

<?php
/**
 * Get posts from all multisite subsites.
 */
// First we query all subsites
$subsites = get_sites();

// Then we loop through subsites
foreach( $subsites as $subsite ) {
	
	// Get the ID per subsite
	$subsite_id = get_current_blog_id();

	// Switch to subsites
	switch_to_blog( $subsite_id );

	// Get the subsite name in case we want to separate posts by subsite
	$subsite_name = get_blog_details( $subsite_id )->blogname;
		
	// Echo the subsite name 
	echo '<h2>' . $subsite_name . '</h2>';
	
	// Arguments for our query
	$args = array(
		'posts_per_page'   => -1,       // Show all posts
		'orderby'          => 'date',   // Order posts by date
		'order'            => 'DESC',   // Show newest posts to oldest
		'post_type'        => 'post',   // Default set to post
	);
	
	// The query variable
	$query = new WP_Query($args);
	
	// The actual query
	if ( $query->have_posts() ) {
		
		while ( $query->have_posts() ) : $query->the_post();
			
			// Setting some variables to use in the template
			$post_id = get_the_ID() . '-' . $subsite_id;
			$post_date = get_the_date();
			$post_thumbnail = get_the_post_thumbnail();
			$post_excerpt = get_the_excerpt();
			
			?>
			
			<article id="post-<?php echo $post_id; ?>" <?php post_class(); ?>>
				<header class="entry-header">
					<?php the_title( sprintf( '<h2 class="entry-title"><a href="%s" rel="bookmark">', esc_url( get_permalink() ) ), '</a></h2>' ) ?>
					<span class="entry-meta"><?php echo $post_date; ?></span>
				</header>
				<?php if( $post_thumbnail ) :?>
					<figure class="post-thumbnail">
						<?php echo $post_thumbnail; ?>
					</figure><!-- .post-thumbnail -->
				<?php endif; ?>
				<div class="entry-content">
					<?php echo $post_excerpt; ?>
				</div>
			</article>
			
		<?php endwhile;
		
		restore_current_blog();
	}
}

Een functie gebruiken voor de query

Net als het eerste voorbeeld kan je ook deze loop in een functie verwerken in je functions.php bestand of een site-specifieke plugin. Bijvoorbeeld:

<?php
/**
 * Get posts from all multisite subsites.
 *
 * This goes in your theme's functions.php
 * or your site-specific plugin.
 */
function wpsimpel_all_multisite_posts() {
	// The code from the above snippet goes here
}

In je template-bestand (bijvoorbeeld home.php, index.php of je eigen paginatemplate) plaats je vervolgens de functie:

<?php wpsimpel_all_multisite_posts(); ?>

Beoordeel deze post:

Gemiddeld: 4 / 5. Aantal beoordelingen: 1

Nog geen beoordelingen

Whoops! 😔

Zou je ons willen laten weten hoe we (deze post) kunnen verbeteren?

Reacties

2 reacties op "Posts van een andere site in een WordPress Multisite tonen"

  1. Dank je voor de code snippet.

    Je kiest er hier voor om van één subsite de posts op te halen. Wat als je van alle subsites de posts wilt ophalen?
    Hoe zou de code er dan uit zien?

    Je site kende ik nog niet en ik zie meer interessante blogposts. Dus ik kom hier zeker nog eens terug.
    Groet

    1. Hoi Edwin,

      Bedankt voor het compliment!

      Ik heb de post bijgewerkt met een extra snippet waarmee je posts van alle subsites kan ophalen (geordend per site). De permalinks van de posts verwijzen naar de post op de originele subsite. Je kan natuurlijk in de loop zelf post-onderdelen toevoegen of verwijderen.

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *

This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.