WordPress get_posts is een handige functie waarmee ontwikkelaars content uit de WordPress-database kunnen ophalen. Je kunt op gedetailleerd niveau aangeven naar welke berichten, pagina’s en aangepaste berichtentypes je op zoek bent, je eigen set aan resultaten krijgen en vervolgens de items filteren en ordenen zoals een echte PHP/MySQL-expert.

Maar laat dit je niet afschrikken als je geen PHP professional bent. Er zijn honderden PHP tutorials die je kan kijken of lezen om de taal te leren. Het enige wat je nodig hebt is basale kennis van PHP om op maat gemaakte lijsten met berichten te maken die op je website worden weergegeven. De functie get_posts houdt namelijk een reeks parameters bij die het mogelijk maken om eenvoudige of geavanceerde zoekopdrachten te bouwen.

Het gebruik van WordPress get_posts is een proces bestande uit twee stappen:

  • Je moet eerst je eigen zoekopdracht bouwen. Deze zal er trouwens niet uitzien als een MySQL-query en je hoeft geen SELECT-verklaring te gebruiken. Je moet alleen een reeks parameters definiëren en deze doorgeven aan de get_posts-functie. WordPress zet die reeks om in een echte en veilige MySQL-query, vergelijkt deze met de database en stuurt een reeks berichten terug.
  • Ten tweede moet je het resultaat doorkruisen (in het Engels: traverse) dat door get_posts in een foreach cycle wordt teruggestuurd.

Dat gezegd hebbende, zullen we in dit artikel eerst de belangrijkste onderdelen van deze functie bekijken, in het bijzonder hoe get_posts werkt, hoe we een aangepaste zoekopdracht kunnen bouwen en hoe we de gegevens op de front-end van de site kunnen laten zien.
Vervolgens zal ik een voorbeeld uit de praktijk geven met code die je kunt kopiëren, bewerken en gebruiken in je testomgeving voor tests en ontwikkeling.

Opmerking: We maken meestal onderscheid tussen berichten, pagina’s en aangepaste berichttypes. In dit artikel gebruiken we de term ‘berichten’ voor reguliere blogberichten, maar ook voor pagina’s en aangepaste berichttypes. Al deze soorten berichten worden opgeslagen in de tabel ‘wp_posts’ van de database. Het belangrijkste verschil tussen de berichttypes zit in de waarde van het veld ‘post_type’. Vanuit het perspectief van een ontwikkelaar zijn berichten, pagina’s en aangepaste berichttypes allemaal berichten.

Inleiding tot de get_posts-functie in WordPress

De Codex beschrijft de get_posts functie als volgt:

Haalt een reeks van de meest recente berichten op of berichten die aan de opgegeven criteria voldoen.

We kunnen get_posts deze manier gebruiken:

$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>';
}

De functie hierboven haalt de laatste 20 blogberichten op in de specifieke categorie (standaard is 'post' het 'post_type') en geeft een reeks van $post-objecten terug. Je kan de reeks itereren om de berichten op het scherm weer te geven. Vrij simpel toch?

get_posts gebruikt WP_Query om berichtenitems op te halen en houdt een reeks van dezelfde parameters beschikbaar in WP_Query (op enkele uitzonderingen na). We hebben dus een enorme lijst van variabelen tot onze beschikking om onze op maat gemaakte query’s op te stellen. Deze parameters zijn gegroepeerd in de volgende 15 categorieën:

  • Auteurparameters
  • Categorieparameters
  • Tag-parameters
  • Taxonomieparameters
  • Zoekparameters
  • Bericht- & paginaparameters
  • Wachtwoordparameters
  • Berichttype-parameters
  • Sorteer- & sorteer op-parameters
  • Datumparameters
  • Aangepast veld (post meta)-parameters
  • Toestemmingparameters
  • Mimetype-parameters
  • Caching-parameters
  • Retourvelden-parameter

Als je deze bovenstaande lijst zo bekijkt, krijg je een idee van de verscheidenheid van aangepaste reeksen die je kunt bouwen en draaien in de WordPress-database. Laten we dieper in deze zoekparameters duiken en onze berichtenlijsten gaan bouwen.

Hoe je Reeksen Bouwt met get_posts-parameters

Elke categorie van parameters heeft betrekking tot dezelfde informatie. We kunnen bijvoorbeeld een zoekopdracht bouwen om berichten van een specifieke auteur(s) op te halen of om specifieke auteur(s) uit te sluiten, waarbij we de auteur definiëren op ID of nicename. Op dezelfde manier kunnen we reeksen bouwen die berichten ophalen per categorie, tag, taxonomie, datum, aangepaste velden en nog meer.

Hoe je Parameters Gebruikt om Eenvoudige Zoekopdrachten te bouwen

Veel parameters kunnen op een vergelijkbare manier worden gebruikt, ongeacht de categorie waartoe ze behoren. Zo vragen de volgende parameters de database om een zoekopdracht van auteur(s) van de post:

  • author (int) – auteur ID
  • author_name (string) – user_nicename van de auteur
  • author__in (array) – een reeks van meerdere auteurs-ID’s
  • author__not_in (array) – een reeks van meerdere auteurs-ID’s die moeten worden uitgesloten van het resultaat.

Hoe kunnen we deze parameters gebruiken?

In het volgende voorbeeld geeft de parameter 'author' aan dat we de meest recente blogberichten van de auteur met ID = 1 willen hebben:

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

Dezelfde ‘auteur’-parameter maakt het mogelijk om de database te laten zoeken op verschillende manieren:

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

Dus, afhankelijk van de waarde van de parameter, heb je een resultaat dat is ingesteld met berichten van één enkele auteur (integer/geheel getal), van meerdere auteurs (een lijst van komma-gescheiden waarden) of exclusief een auteur (negatieve waarden).

Andere parameters zorgen voor extra flexibiliteit. Zo geeft de volgende query voor get_posts een reeks van de laatste blogberichten van meerdere auteurs:

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

En we kunnen ook meerdere auteurs uitsluiten:

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

Ook kunnen we de categorie params, tag params, posttype params, met specifieke verschillen gebruiken. Zie, als voorbeeld, categorie params:

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

Niet alle parameters zijn zo eenvoudig te gebruiken als deze parameters. Verder kunnen we params van categorie, posttype, mime-type, etc. allemaal gebruiken in één zoekopdracht. Dit betekent dat we de items in de set resultaten op gedetailleerd niveau kunnen beheren en dat we meer geavanceerde reeksen kunnen bouwen op basis van berichttypes, aangepaste taxonomieën en aangepaste velden in zijn geheel.

Duidelijk? Laten we eens kijken naar geavanceerde reeksen.

Hoe je Geavanceerde Reeksen Bouwt in WordPress

Laten we een stap verder gaan met meer geavanceerde zoekopdrachten op basis van aangepaste berichttypen en aangepaste taxonomieën. We hebben bijvoorbeeld het volgende berichttype:

name: book
taxonomy name: book_category, book_author
support for: title, editor, thumbnail, excerpt, custom-fields

Aangepaste Berichttypen en Taxonomieën

Stel dat je een lijst wilt van de meest recente boeken in de gespecificeerde aangepaste taxonomie book_category. Hier is de reeks van argumenten:

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

Bovenstaande argumenten vragen WordPress om alle boeken in 'sci-fi' 'book_category' op te halen.

De 'tax_query'-parameter neemt een reeks van argumentreeksen (d.w.z. een reeks van reeksen). Deze genestelde reeksen maken het mogelijk om zeer complexe reeksen te bouwen op basis van meerdere taxonomieën, zoals bijvoorbeeld hieronder is te zien:

$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
		)
	)
);

Deze parameters stellen ons in staat om een lijst op te halen van de laatste 10 'book'-berichtttypes in de 'sci-fi' 'book_category', geschreven door de 'book_author' met ID #22.
De 'relation'-parameter bepaalt de logische relatie tussen elke taxonomie die in 'tax_query' staat. We zetten hierboven de waarde ervan op AND omdat we alle boeken moeten terugvinden die behoren tot de 'sci-fi'-categorie EN geschreven door auteur #22.

Hoe je Metazoekopdrachten Bouwt met Aangepaste Veldparameters

Soms kan het nodig zijn om lijsten met berichten te maken op basis van een aangepaste sleutel en/of waarde in het veld.

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

Deze parameters stellen ons in staat om alle berichten op te halen op basis van de sleutel en waarde van het veld. 'meta_compare' stelt de operator in die nodig is om de waarde van de parameter 'meta_value' te testen. Hier is 'meta_value' dus '=', wat ook de standaardwaarde is.

De beschikbare waarden zijn '=', '!=', '>', '>=', '<', '<=', 'LIKE', 'NOT LIKE', 'IN', 'NOT IN', 'BETWEEN', 'NOT BETWEEN', 'NOT EXISTS', 'REGEXP', 'NOT REGEXP' or 'RLIKE'.

Dit is een vrij eenvoudig voorbeeld, maar we kunnen meer geavanceerde reeksen bouwen. In het volgende voorbeeld vragen we de database om reeksen van fantasieboeken gepubliceerd na 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'
		)
	)
);

En we kunnen nog verder gaan. In dit voorbeeld combineren we een berichttype met een aangepaste taxonomie en twee aangepaste velden:

$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',
		)
	)
);

Hier stellen we een reeks van parameters in om een lijst van fantasieboeken op te halen die na 2010 gepubliceerd zijn en die BETWEEN (tussen) $10 en $25 kosten.

Je ziet dat de 'meta_query'-parameter werkt zoals de 'tax_query'-parameter. Het houdt een reeks van reeksen bij, waardoor we geavanceerde reeksen kunnen maken op basis van meerdere metasleutel/waarde-paren. Voor een grote lijst zoekopdrachtparameters en een mooi aantal voorbeelden, zie de WP_Query documentatie.

Waarom is get_posts Beperkt tot vijf WordPress-berichten?

De functie get_posts neemt dezelfde argumenten als WP_Query::parse_query() (ze de Codex), maar sommige specifieke parameters zorgen ervoor dat het iets anders werkt dan een WP_Query object.

Misschien heb je de 'numberposts' -parameter niet gebruikt in je reeksen en vraag je je af waarom je maar vijf items in je lijst ziet.

Standaard bepaalt het aantal berichten dat je instelt in de beheerderspagina Instellingen → Lezen het aantal berichten dat moet worden opgehaald door een WordPress-zoekopdracht. Hoe dan ook, als je geen aangepaste waarde specificeert voor 'numberposts' of 'posts_per_page', geeft get_posts een ander aantal posts terug.

  • 'Numberposts' is het totale aantal berichten dat moet worden opgehaald. Het is een alias van 'posts_per_page' in WP_Query, maar er is een verschil: standaard is het aantal berichten dat je moet ophalen bij gebruik van get_posts vijf, terwijl 'posts_per_page' in WP_Query standaard het aantal berichten per pagina van je WordPress-blog is. Je kunt de standaardwaarde overschrijven door een aangepaste waarde in te stellen voor 'numberposts' of 'posts_per_page' in de reeks van argumenten.

Naast 'numberposts' zijn de volgende parameters specifiek voor get_posts:

  • 'category' is een door komma’s gescheiden lijst van categorie-ID’s. Het is een alias van de ‘cat’-parameter in WP_Query.
  • 'include' is een door komma’s gescheiden lijst van bericht-ID’s. Dit is een alias van dd'post__in' parameter in WP_Query.
  • 'exclude' is een door komma’s gescheiden lijst van bericht-ID’s.
  • 'suppress_filters' geeft aan of filters moeten worden onderdrukt. Deze parameter staat standaard op true in get_posts, terwijl het standaard op false in WP_Query staat (lees meer op Track).

De functie get_posts is gedefinieerd in wp-includes/post.php. Je kunt meer lezen over de werking van get_posts door de broncode te controleren op Track (WordPress 5.2) of in je lokale WordPress-installatie.

Artikelen Sorteren

Met 'orderby' en 'order' kun je de items van de set met resultaten sorteren. Je kunt de berichten sorteren op 'ID', 'author', 'title', 'name', 'type', 'date', 'modified', 'parent', 'rand', 'comment_count' en op vele andere manieren, in oplopende of aflopende volgorde.

Als je een eenvoudige zoekopdracht hebt, hoef je alleen maar een waarde in te stellen voor 'order' en 'orderby'. In het volgende voorbeeld worden de berichten gesorteerd op berichtnaam in oplopende volgorde:

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

Dat is vrij makkelijk. Maar wat als je een geavanceerde zoekopdracht hebt? Kunnen we items dan sorteren op een of meer aangepaste veldwaarden in een geavanceerde metazoekopdracht?

WordPress 4.0 en WordPress 4.2 brachten belangrijke verbeteringen in de 'orderby' en 'meta_query' parameters. We hebben nu een nieuwe syntax voor het sorteren door middel van specifieke clausules van een metazoekopdracht. Dankzij de nieuwe syntax kunnen we indexen gebruiken om verwijzingen naar de specifieke clausules van de metazoekopdracht te maken vanuit de 'orderby'-parameter.

Dankzij deze verbeteringen kan de metazoekopdracht in het bovenstaande voorbeeld als volgt worden geschreven:

$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',
);

In bovenstaand voorbeeld zijn de elementen gesorteerd op 'price_clause'.

En we kunnen nog meer doen. Sinds WordPress 4.0 kunnen we voor get_posts een reeks indexen van metazoekopdrachten in plaats van een enkele index doorgeven, zoals in onderstaand voorbeeld:

$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' ),
);

Gefeliciteerd, je hebt een geavanceerde metazoekopdacht gebouwd en je hebt de resultaten eerst gesorteerd op 'price_clause' in oplopende volgorde en daarna op 'year_clause' in aflopende volgorde.

Ze de volledige lijst met sorteermogelijkheden in de Codex.

Het is tijd om de gegevens op de front-end weer te geven.

Voorgestelde lezing: Hoe gemakkelijk een phpinfo-pagina te maken en te gebruiken.

Hoe je get_posts-gegevens Weergeeft

WordPress get_posts geeft een reeks terug van WP_Post-objecten die ons toegang geeft tot een aantal variabelen voor elk geselecteerd bericht dat is opgeslagen in de wp_posts-databasetabel:

  • 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-tabelstructuur in phpMyAdmin
wp_posts-tabelstructuur in phpMyAdmin

Je kunt makkelijk toegang krijgen tot deze gegevens met een foreach-cycle zoals de volgende:

$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>';

Alsget_posts minstens één bericht heeft gevonden, dan geeft het een reeks van items die we kunnen traversen om de titel van het bericht en een link naar het originele bericht te tonen. We hebben de get_permalink functie gebruikt om de permalink van het bericht op te halen, omdat we geen overeenkomstige WP_Post-variabele hebben.

Dat is vrij eenvoudig, maar hoe kunnen we die code implementeren en onze berichtenlijsten bouwen met behulp van WordPress get_posts?

Je kunt deze lijsten op je pagina’s op verschillende manieren tonen.

Voorbeeld uit de Praktijk: een Aangepaste Berichtenlijst met een Shortcode Weergeven

Ik zal je laten zien hoe je snel en eenvoudig een shortcode kunt maken die je in je content kunt opnemen. Ik zal niet teveel over de werking van shortcodes vertellen, omdat we dat onderwerp al in een eerder artikel hebben behandeld.

Maak eerst een nieuw pad aan in de wp-content/plugins-map van je lokale WordPress-installatie of in een testomgeving. In dit voorbeeld heb ik het pad de naam kinsta-shortcodes gegeven.

Maak in wp-content/plugins/kinsta-shortcodes/ een .php-bestand aan met dezelfde naam als het nieuwe pad: kinsta-shortcodes.php.

Open het nieuwe bestand in je favoriete teksteditor en voeg het volgende kopje toe:

<?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 hebben we een gloednieuwe plugin, maar die doet nog steeds niets. Ga naar de pagina Plugins in je WordPress dashboard en activeer de nieuwe plugin om ervoor te zorgen dat WP_DEBUG is ingesteld op true in je wp-config.php bestand.

Je sandbox is nu klaar voor jouw ‘hacks’. De volgende stap is het registreren van een hook voor een aangepaste shortcode:

/**
 * 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 is de naam van de shortcode e kinsta_get_posts_cb is de hieronder gedefinieerde callback:

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

We stellen zes shortcode-attributes in die we gebruiken om een reeks aan parameters te definiëren en uiteindelijk wordt doorgegeven aan de get_posts-functie in WordPress. Als $custom_posts niet leeg is, dan genereert een foreach-cyclus de HTML van een ongesorteerde lijst van items. Nu kunnen jij en je auteurs van je berichtlijsten de berichten opnemen met behulp van een shortcode zoals hieronder:

Nu kunnen jij en je auteurs van je berichtlijsten de berichten opnemen met behulp van een shortcode zoals hieronder:

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

Natuurlijk kun je de reeks van argumenten naar eigen voorkeur wijzigen en tests uitvoeren in elk bericht of pagina van je ontwikkelingswebsite.

WordPress get_posts
Een geavanceerde berichtenlijst die gebouwd is met de get_posts-functie

Samenvatting

WordPress get_posts is een krachtige functie waarmee ontwikkelaars overal op de front-end van je WordPress-website berichtenlijsten kunnen opnemen. Het gebruikt WP_Query, maar het is makkelijker te gebruiken en te verkiezen boven WP_Query als je alleen berichtenlijsten nodig hebt. Een directe verwijzing naar WP_Query wordt aanbevolen wanneer je berichten in een Loop moet weergeven.

Dus bouw je lijsten, test je code, en als je er zeker weet dat het goed werkt, zet het dan (en alleen dan) live op je site (maar voer eerst een back-up uit).

Nu willen we graag meer van jou horen. Wat is jouw ervaring met de WordPress- get_posts-functie? Heb je nog nuttige dingen om met ons te delen? Laat het weten in de reacties hieronder!

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.