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:

  • Först måste du bygga en anpassad förfrågan. Egentligen kommer det inte att se ut som en MySQL-förfrågan och du kommer inte att skriva något SELECT-uttryck. Du behöver bara definiera en array av parametrar och skicka den till get_posts-funktionen. WordPress konverterar den arrayen till en riktig och säker MySQL-förfrågan, kör den mot databasen och returnerar en array med inlägg.
  • För det andra måste du gå igenom resultatuppsättningen som returneras av get_posts med en foreach-cykel.

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:

  • Författarparametrar
  • Kategoriparametrar
  • Taggparametrar
  • Taxonomiparametrar
  • Sökparametrar
  • Inläggs- & Sidparametrar
  • Lösenordsparametrar
  • Inläggstyp-parametrar
  • Sortera & Sorteraefter-parametrar
  • Datumparametrar
  • Anpassat fält (post meta)-parametrar
  • Behörighetsparametrar
  • Mime-Typ-parametrar
  • Cachningsparametrar
  • Returfälts-parametrar

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:

  • author (int) – författar-ID
  • author_name (string) – författares user_nicename
  • author__in (array) – en array med flera författares ID
  • author__not_in (array) – en array med flera författares ID som ska exkluderas från resultatuppsättningen

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:

  • cat (int)
  • category_name (string)
  • category__and (array)
  • category__in (array)
  • category__not_in (array)

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.

  • 'numberposts' är det totala antalet inlägg som ska hämtas. Det är ett alias för 'posts_per_page' i WP_Query, men det finns en skillnad mellan de två: som standard är antalet inlägg att hämta när du använder get_posts 5, medan 'posts_per_page' i WP_Query som standard sätter det till antalet inlägg per sida på din WordPress-blogg. Du kan åsidosätta standardvärdet genom att ange ett eget värde för 'numberposts' eller 'posts_per_page' i arrayen med argument.

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

  • 'category' är en kommaseparerad lista över kategori-ID. Det är ett alias för 'cat'-parametern i WP_Query.
  • 'include' är en kommaseparerad lista över inläggs-ID. Detta är ett alias för parametern 'post__in' i WP_Query.
  • 'exclude' är en kommaseparerad lista över inläggs-ID.
  • 'suppress_filters' anger om filter ska utelämnas. Denna parameter är som standard sann i get_posts, medan den som standard är falsk i WP_Query (se det på Track).

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:

$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:

  • ID
  • post_author
  • post_name
  • post_type
  • post_title
  • post_date
  • post_date_gmt
  • post_content
  • post_excerpt
  • post_status
  • comment_status
  • ping_status
  • post_password
  • post_parent
  • post_modified
  • post_modified_gmt
  • comment_count
  • menu_order
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

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!

Carlo Daniele Kinsta

Carlo is a passionate lover of webdesign and front-end development. He has been playing with WordPress for more than 20 years, also in collaboration with Italian and European universities and educational institutions. He has written hundreds of articles and guides about WordPress, published both on Italian and international websites, as well as on printed magazines. You can find him on LinkedIn.