WordPress get_posts är en kraftfull funktion som gör det möjligt för utvecklare att hämta bitar av innehåll från WordPress-databasen. Du kan ange i minsta detalj vilka inlägg, sidor och anpassade inläggstyper du letar efter, få din anpassade resultatuppsättning, filtrera och anordna objekten som en PHP/MySQL-ninja.

Men bli inte nervös bara för att du inte är ett proffs på PHP, det finns otaliga PHP-tutorials som du kan titta på eller läsa för att lära dig språket. Du behöver endast lite  kunskap om PHP för att skapa anpassade listor över inlägg som du kan visa på din webbplats. get_posts– funktionen har nämligen en rad parametrar som gör det möjligt att bygga enkla eller avancerade frågeställningar.

Att använda WordPress get_posts är en tvåstegsprocess:

Med det sagt, i det här inlägget kommer vi först att dyka in i de nyckelbegrepp som nämns ovan, specifikt hur get_posts fungerar, hur man bygger en anpassad förfrågan och hur man visar data på frontenden.
Sedan kommer jag att ge ett verkligt exempel med ett kodavsnitt som du kan kopiera, redigera och använda på din staging-miljö för dina tester och utveckling.

Observera: Vi skiljer vanligtvis mellan inlägg, sidor och anpassade inläggstyper. I den här artikeln använder vi termen ”inlägg” för vanliga blogginlägg samt för sidor och anpassade inläggstyper. Alla dessa inläggstyper lagras i tabellen ”wp_posts” i databasen. Huvudskillnaden mellan inläggstyper ligger i värdet för fältet post_type. Från en utvecklares perspektiv är inlägg, sidor och anpassade inläggstyper, inlägg allihop.

Introduktion till WordPress get_posts-funktion

Kodexen beskriver get_posts-funktionen enligt följande:

Hämtar en array av de senaste inläggen, eller inlägg som matchar de angivna kriterierna.

Vi kan använda get_posts på detta sätt:

$args = array(
	'numberposts'	=> 20,
	'category'		=> 4
);
$my_posts = get_posts( $args );

if( ! empty( $my_posts ) ){
	$output = '<ul>';
	foreach ( $my_posts as $p ){
		$output .= '<li><a href="' . get_permalink( $p->ID ) . '">' 
		. $p->post_title . '</a></li>';
	}
	$output .= '<ul>';
}

Funktionen ovan hämtar de senaste 20 blogginläggen i den angivna kategorin (som standard är 'post_type' 'post'[inlägg]) och returnerar en array med $post-objekt. Du kan iterera över arrayen för att visa inläggen på skärmen. Det är ganska lätt, eller hur?

get_posts använder WP_Query för att hämta inläggsobjekt och det innehåller en array av samma parametrar som finns i WP_Query (med få undantag). Så vi har en enorm lista med variabler som vi kan använda för att bygga våra egna förfrågningar. Dessa parametrar är grupperade i följande 15 kategorier:

En snabb titt på listan ovan kan ge dig en uppfattning om de olika anpassade förfrågningar du kan bygga och köra mot WordPress-databasen. Så, låt oss dyka djupare in i förfrågningsparametrar och börja bygga våra listor över inlägg.

Så Bygger du Förfrågningar med get_posts

Varje kategori av parametrar avser samma information. Till exempel kan vi bygga en förfrågning för att hämta inlägg från en eller flera angivna författare eller exklusive de angivna författarna, genom att definiera författaren med ID eller smeknamn. På samma sätt kan vi bygga förfrågningar som hämtar inlägg efter kategori, tagg, taxonomi, datum, anpassade fält och ännu mer.

Så Använder du Parametrar för att Bygga Enkla Förfrågningar

Många parametrar kan användas på ett ganska liknande sätt, oavsett vilken kategori de tillhör. Till exempel tillåter följande parametrar att förfråga databasen efter inläggsförfattare:

Hur kan vi använda dessa parametrar?

I följande exempel anger parametern 'author' att vi vill ha de senaste blogginläggen skrivna av författaren med ID = 1:

$my_posts = get_posts( array( 'author' => 1 ) );

Samma ”author”-parameter gör det möjligt att fråga databasen på olika sätt:

// return an array of posts from specific authors
$my_posts = get_posts( array( 'author' => '1,5,12' ) );
// return an array of posts excluding the specified author
$my_posts = get_posts( array( 'author' => -1 ) );

Så, beroende på parameterns värde, har du en resultatuppsättning med inlägg från en enda författare (heltal), från flera författare (en lista med kommaseparerade värden) eller exklusive en författare (negativa värden).

Andra parametrar ger ytterligare flexibilitet. Till exempel returnerar följande anrop till get_posts en array med de senaste blogginläggen från flera författare:

// return an array of posts from multiple authors
$my_posts = get_posts( array( 'author__in' => array( 1, 5, 12 ) ) );

Och vi kan också utesluta flera författare:

// return an array of posts from multiple authors
$my_posts = get_posts( array( 'author__not_in' => array( 1, 5, 12 ) ) );

På samma sätt kan vi använda kategori-parametrar, tagg-parametrar, inläggstyp-parametrar, med vissa specifika skillnader. Se, som ett exempel, kategoriparametrar:

Hur som helst är inte alla parametrar lika lätta att använda som dessa parametrar. Dessutom kan vi använda kategoriparametrar, inläggstypparametrar, mime typ-parametrar, etc. allt i en enda förfrågan. Det innebär att vi har detaljerad kontroll över objekten i resultatuppsättningen, och vi kan bygga mer avancerade förfrågningar baserat på inläggstyp, anpassade taxonomier och anpassade fält helt och hållet.

Så, låt oss dyka djupare!

Så Bygger du Avancerade Förfrågningar i WordPress

Låt oss hoppa ett steg framåt med en mer avancerad förfrågan baserad på anpassade inläggstyper och anpassade taxonomier. Säg att du har följande inläggstyp:

namn: book
taxonominamn: book_category, book_author
stöd för: title, editor, thumbnail, excerpt, custom-fields

Anpassade inläggstyper och Anpassade Taxonomier

Antag att du vill ha en lista över de senaste böckerna i den angivna anpassade taxonomin book_category. Här är en array med argument:

$args = array(
	'post_type'		=> 'book',
	'tax_query'		=> array(
		array(
			'taxonomy'	=> 'book_category',
			'field'		=> 'slug',
			'terms'		=> 'sci-fi'
		)
	),
);

Argumenten ovan säger helt enkelt till WordPress att hämta alla böcker i den 'book_category' som heter 'sci-fi'.

Parametern 'tax_query' tar en array med argument-arrayer (dvs. en array med arrayer). Dessa kapslade arrayer gör det möjligt att bygga mycket komplexa förfrågningar baserade på flera taxonomier, som visas i exemplet nedan:

$args = array(
	'numberposts'	=> 10,
	'post_type'		=> 'book',
	'relation'		=> 'AND',
	'tax_query'		=> array(
		array(
			'taxonomy'	=> 'book_category',
			'field'		=> 'slug',
			'terms'		=> 'sci-fi'
		),
		array(
			'taxonomy'	=> 'book_author',
			'field'		=> 'term_id',
			'terms'		=> 22
		)
	)
);

Dessa parametrar tillåter oss att hämta en lista över de senaste 10 'book' inläggstyperna i 'book_category' vid namn 'sci-fi', skriven av 'book_author' med ID #22. Parametern 'relation' anger det logiska förhållandet mellan varje taxonomi som anges i 'tax_query'. Ovan sätter vi dess värde till AND eftersom vi behöver hämta alla böcker som tillhör kategorin 'sci-fi' AND är skrivna av författare #22.

Så Bygger du Metaförfrågningar med aAnpassade Fältparametrar

Ibland kan du behöva bygga listor över inlägg baserat på ett specifikt anpassat fält-nyckel och/eller värde.

$args = array(
	'meta_key'		=> 'cover',
	'meta_value'	=> 'paperback',
	'meta_compare'	=> '='
);

Med dessa parametrar kan vi hämta alla inlägg med anpassat fält-nyckel och värde. 'meta_compare' anger den operatör som krävs för att testa värdet för parametern 'meta_value'. Här är 'meta_value' is '=', vilket också är standardvärdet.

Tillgängliga värden är '=', '!=', '>', '>=', '<', '<=', 'LIKE', 'NOT LIKE', 'IN', 'NOT IN', 'BETWEEN', 'NOT BETWEEN', 'NOT EXISTS', 'REGEXP', 'NOT REGEXP' eller 'RLIKE'.

Detta är ett ganska enkelt exempel, men vi kan bygga mer avancerade förfrågningar. I nästa exempel frågar vi databasen efter fantasyböcker publicerade efter 2010:

$args = array(
	'post_type'		=> 'book',
	'meta_key'		=> 'year_published',
	'meta_value_num'	=> 2010,
	'meta_compare'	=> '>',
	'tax_query'		=> array(
		array(
			'taxonomy'	=> 'book_category',
			'field'		=> 'slug'
			'terms'		=> 'fantasy'
		)
	)
);

Och vi kan gå ännu längre. I nästa exempel blandar vi en inläggstyp med en anpassad taxonomi och två anpassade fält:

$args = array(
	'post_type'		=> 'book',
	'tax_query'		=> array(
		array(
			'taxonomy'	=> 'book_category',
			'field'		=> 'slug'
			'terms'		=> array( 'fantasy' )
		)
	),
	'meta_query'	=> array(
		'relation'		=> 'AND',
		array(
			'key'		=> 'year_published',
			'value'		=> 2010,
			'type'		=> 'numeric',
			'compare'	=> '>',
		),
		array(
			'key'		=> 'price',
			'value'		=> array( 10, 25 ),
			'type'		=> 'numeric',
			'compare'	=> 'BETWEEN',
		)
	)
);

Här ställer vi in en array med parametrar för att hämta en lista över fantasyböcker publicerade efter 2010 som kostar mellan BETWEEN $10 och $25.

Du kan se att parametern 'meta_query' fungerar ungefär som parametern 'tax_query'. Det håller en array med arrayer så att vi kan bygga avancerade förfrågningar baserade på flera meta-nyckel/värdepar. För en omfattande lista över frågeparametrar och ett stort antal exempel, se WP_Query-dokumentationen.

Varför är get_posts Begränsad till 5 WordPressinlägg?

get_posts-funktionen tar samma argument som WP_Query::parse_query() (se Codex), men vissa specifika parametrar gör att den fungerar något annorlunda än ett WP_Query-objekt.

Kanske använde du inte parametern 'numberposts' i dina förfrågningar och du undrar varför du bara ser 5 objekt i din lista.

Som standard bestäms hur många inlägg som ska hämtas av en WordPress-förfrågning av det antalet inlägg du ställt in i adminsidan Inställningar → Läsning. Hur som helst, om du inte anger ett anpassat värde för 'numberposts' eller 'posts_per_page', returnerar get_posts ett annat antal inlägg.

Förutom 'numberposts' är följande parametrar specifika för get_posts:

get_posts-funktionen definieras i wp-includes/post.php. Du kan djupdyka in i hur get_posts fungerar genom att kontrollera källkoden antingen på Track (WordPress 5.2) eller i din lokala WordPress-installation.

Ordna Objekt

'orderby' och 'order' sorterar resultaten. Du kan sortera inlägg efter 'ID', 'author', 'title', 'name', 'type', 'date', 'modified', 'parent', 'rand', 'comment_count' och på många andra sätt, i stigande eller fallande ordning.

Om du har en enkel förfrågning behöver du bara ange ett värde för 'order' och 'orderby'. I följande exempel sorteras inlägg efter inläggsnamn i stigande ordning:

$args = array(
	'author'	=> '1,5,12',
	'orderby'	=> 'name',
	'order'		=> 'ASC'
);

Det är ganska enkelt. Men vad händer om du hade en avancerad förfrågning? t.ex. Kan vi sortera objekt efter ett eller flera anpassade fältvärden i en avancerad metaförfrågan?

WordPress 4.0 och WordPress 4.2 medförde viktiga förbättringar av parametrarna 'orderby' och 'meta_query'. Vi har nu en ny syntax för beställning av specifika klausuler i en metaförfrågan. Tack vare den nya syntaxen kan vi använda index för att skapa referenser till de specifika klausulerna i metaförfrågan från parametern 'orderby'.

Tack vare dessa förbättringar kan metaförfrågan i exemplet ovan skrivas enligt följande:

$args = array(
	'meta_query'	=> array(
		'relation'		=> 'AND',
		'year_clause' => array(
			'key'		=> 'year_published',
			'value'		=> 2010,
			'type'		=> 'numeric',
			'compare'	=> '>',
		),
		'price_clause' => array(
			'key'		=> 'price',
			'value'		=> array( 10, 25 ),
			'type'		=> 'numeric',
			'compare'	=> 'BETWEEN',
		)
	),
	'orderby' => 'price_clause',
);

I exemplet ovan sorterade vi element efter 'price_clause'.

Och vi kan göra ännu mer. Från och med WordPress 4.0 kan vi skicka en array av metaförfrågeindex till get_posts istället för ett enda index, vilket ses i exemplet nedan:

Är du trött på en långsam värd för din WordPress-webbplats? Vi erbjuder brinner-snabba servrar och världklass support tillgängligt dygnet runt från WordPress-experter. Kolla in våra planer

$args = array(
	'meta_query'	=> array(
		'relation'		=> 'AND',
		'year_clause' => array(
			'key'		=> 'year_published',
			'value'		=> 2010,
			'type'		=> 'numeric',
			'compare'	=> '>',
		),
		'price_clause' => array(
			'key'		=> 'price',
			'value'		=> array( 10, 25 ),
			'type'		=> 'numeric',
			'compare'	=> 'BETWEEN',
		)
	),
	'orderby' => array( 'price_clause' => 'ASC', 'year_clause' => 'DESC' ),
);

Grattis, du har byggt en avancerad metaförfråga och sorterat resultat först enligt 'price_clause' i stigande ordning, sedan efter 'year_clause' i fallande ordning.

Se hela listan med sorteringsalternativ i Codex.

Det är dags för oss att visa data på frontenden

Föreslagen läsning: How to Easily Create and Use a phpinfo Page.

Så Här Visar du get_posts Returnerade Data

WordPress get_posts returnerar en array med wp_post-objekt som ger oss tillgång till ett antal variabler för varje valt inlägg som lagras i wp_posts databastabell:

wp_posts tabellstruktur i phpMyAdmin

wp_posts tabellstruktur i phpMyAdmin

Du kan enkelt komma åt dessa data med en foreach-cykel som följande:

$custom_posts = get_posts( $args );

if( ! empty( $custom_posts ) ){
	$output = '<ul>';
	foreach ( $custom_posts as $p ){

		$output .= '<li><a href="' 
		. get_permalink( $p->ID ) . '">' 
		. $p->post_title . '</a></li>';
	}

	$output .= '</ul>';
}

return $output ?? '<strong>Sorry. No posts matching your criteria!</strong>';

Om get_posts hittade minst ett inlägg returnerar det en array av objekt som vi kan gå igenom för att visa inläggstiteln och en länk till det ursprungliga inlägget. Vi använde get_permalink-funktionen för att hämta inläggets permalänk, eftersom vi inte har en motsvarande wp_post-variabel.

Det är ganska enkelt, men hur kan vi implementera den koden och bygga våra egna listor över inlägg med WordPress get_posts?

Du kan visa listor över inlägg på dina sidor på flera sätt.

Verkliga Exempel: Så Här Visar du en Anpassad Lista med Objekt med en Kortkod

Jag kommer att visa dig hur man bygger en snabb och enkel kortkod som du kan inkludera i ditt innehåll. Jag kommer dock inte gå in på kortkoder i detalj, eftersom vi redan täckt det ämnet i ett tidigare blogginlägg.

Först och främst, skapa en ny katalog i wp-content/plugins-mappen på din lokala WordPress-installation eller i en staging-miljö. I det här exemplet kallar jag katalogen kinsta-shortcodes.

I wp-content/plugins/kinsta-shortcodes/ skapar du en .php-fil med samma namn som den nya katalogen: kinsta-shortcodes.php.

Öppna den nya filen i din favorit-textredigerare och inkludera följande rubrik:

<?php
/**
 * @package Kinsta_shortcodes
 * @version 1.0
 */
/*
Plugin Name: Kinsta shortcodes
Plugin URI: http://wordpress.org/extend/plugins/#
Description: This is an example plugin 
Author: Your Name
Version: 1.0
Author URI: https://yourwebsite.com/
*/

Nu har vi ett helt nytt plugin, men det gör fortfarande ingenting. Bläddra till adminskärmen Plugins i din WordPress-panel och aktivera det nya pluginet. Se till att du har WP_DEBUG inställd på true i din wp-config.php-fil.

Din sandlåda är nu redo för dina hack. Nästa steg är att registrera en krok för en anpassad kortkod:

/**
 * Add a hook for a shortcode tag
 */
function kinsta_shortcodes_init(){
	add_shortcode( 'kinsta_get_posts', 'kinsta_get_posts_cb' );
}
add_action('init', 'kinsta_shortcodes_init');

kinsta_get_posts är kortkodsnamnet och kinsta_get_posts_cb är den callback som definieras nedan:

/**
 * Register a shortcode
 *
 * @param array $atts Array of shortcode attributes
 */
function kinsta_get_posts_cb( $atts ){

	// safely extract custom arguments and set default values
	extract( shortcode_atts(
			array(
				'numberposts'		=> 3,
				'post_type'			=> 'post',
				'book_category'		=> 'fantasy',
				'year_published'	=> 1900,
				'price_min'			=> 0,
				'price_max'			=> 50
			),
			$atts,
			'kinsta_get_posts'
		) );

	// define the array of query arguments
	$args = array(
		'numberposts'	=> $numberposts,
		'post_type'		=> $post_type,
		'tax_query'		=> array(
			array(
				'taxonomy'	=> 'book_category',
				'field'		=> 'slug',
				'terms'		=> $book_category,
			)
		),
		'meta_query'	=> array(
			'relation'		=> 'AND',
			'year_clause'	=> array(
				'key'		=> 'year_published',
				'value'		=> $year_published,
				'type'		=> 'numeric',
				'compare'	=> '>',
			),
			'price_clause'	=> array(
				'key'		=> 'price',
				'value'		=> array( $price_min, $price_max ),
				'type'		=> 'numeric',
				'compare'	=> 'BETWEEN',
			)
		),
		'orderby' => array( 'price_clause' => 'ASC' )
	);

	$custom_posts = get_posts( $args );

	if( ! empty( $custom_posts ) ){
		$output = '<ul>';
		foreach ( $custom_posts as $p ){

			$output .= '<li><a href="' 
			. get_permalink( $p->ID ) . '">' 
			. $p->post_title . '</a> (' 
			. get_post_meta( $p->ID, 'year_published', true ) 
			. ') - Price: ' . get_post_meta( $p->ID, 'price', true ) . '</li>';
		}

		$output .= '</ul>';
	}

return $output ?? '<strong>Sorry. No posts matching your criteria!</strong>';

Vi ställer in sex kortkodsattribut som vi använder för att definiera en array av parametrar, som slutligen skickas till WordPress get_posts-funktionen. Om $custom_posts inte är tom genererar en foreach-cykel HTML för en oordnad lista med objekt.

Nu kan du och författarna på din blogg inkludera listor över inlägg med hjälp av en kortkod som följande:

[kinsta_get_posts post_type="book" book_category="sci-fi" numberposts="4" price_min=1 price_max=250]

Naturligtvis kan du ändra arrayen av argument som du vill och köra dina tester i ett inlägg eller sida på din utvecklingswebbplats.

En avancerad lista över inlägg byggda med get_posts-funktionen

En avancerad lista över inlägg byggda med get_posts-funktionen

Behöver du skapa listor över inlägg, sidor eller anpassade inläggstyper i WordPress? Lär dig hur du gör det med get_posts-funktionen! 📌👨‍💻👩‍💻Click to Tweet

Sammanfattning

WordPress get_posts är en kraftfull funktion som gör det möjligt för utvecklare att inkludera listor över inlägg var som helst på frontenden på din WordPress-webbplats. Den använder WP_Query men är lättare att använda och är att föredra över WP_Query när du bara behöver listor över inlägg. Hur som helst, rekommenderas en direkt hänvisning till WP_Query när du behöver visa inlägg i en loop.

Så, bygg dina listor, testa din kod, och när du är säker på att det fungerar bra, då (och först då) tar du din ändring till din live-webbplats (men gör en säkerhetskopia först).

Nu vill vi höra från dig. Vad är din erfarenhet med WordPress get_posts-funktion? Har du några användningsområden att dela med oss? Gör det i kommentarerna nedan!


Om du tyckte om den här artikeln, då kommer du att älska Kinsta´s hosting-plattform. Effektivisera din hemsida och få support dygnet runt från vårt rutinerade team på WordPress. Vår Google Cloud-drivna infrastruktur fokuserar på auto-skalning, prestanda och säkerhet. Lås oss visa dig skillnaden med Kinsta! Kolla in våra paket