WordPress biedt sinds versie 3.0 de mogelijkheid eigen custom post types te maken. Dit zijn post types die je zelf naast de ingebouwde post types (berichten, pagina’s, bijlagen, revisies en navigatiemenu’s) aan je WordPress website toe kan voegen. Voorbeelden van custom post types zijn Huizen, Films, Evenementen, Portfolio items etc. Er zijn in de WordPress repository talloze plugins beschikbaar waarmee je dit kan doen, maar die heb je niet per se nodig om custom post types te maken.

Waarom eigen custom post types maken?

Stel dat je een website hebt waarop je evenementen wil plaatsen. Je kan de evenementen aanmaken als normale “blogberichten”, maar het is overzichtelijker als je hiervoor een apart kopje hebt in je WordPress admin dat “Evenementen” heet. Je wil niet dat je blogberichten en evenementen op je website door elkaar komen te staan.

Door voor je evenemen een custom post type aan te maken houd je de evenementen netjes gescheiden van de blogberichten, en ben je een stuk flexibeler wat betreft de inhoud van je evenementen. Je kunt dan ook eigen paginatemplates en extra eigenschappen toevoegen aan de evenementen, zonder dat dit invloed heeft op je blogberichten. Denk hierbij aan de (begin- en eind)datum en de locatie per evenement.

Daarnaast kan je de evenementen ook categoriseren middels eigen ‘taxonomieën’, bijvoorbeeld: Evenement types. Taxonomieën zorgen ervoor dat je evenementen netjes worden ingedeeld op je website, en eenvoudig terug te vinden zijn op type. Hierover volgt binnenkort een apart artikel.

Een goed voorbeeld van een plugin waarin een custom post type de basis is, is WooCommerce. De custom post type is hier ‘producten’. WooCommerce maakt daarnaast gebruik van een aantal custom taxonomieën en custom velden waarmee je je webshop kunt organiseren, zoals productcategorieën en product tags. Deze zijn anders dan de categorieën en tags die je zou gebruiken voor je blogberichten of evenementen.

WooCommerce maakt een custom post type aan voor producten

Een custom post type maken

Voor het aanmaken van custom post types kan je het beste een eigen plugin aanmaken om te voorkomen dat je je custom post types kwijtraakt als je een ander thema installeert. De titel van dit artikel is dus niet helemaal waar; je gebruikt wel daadwerkelijk een plugin, alleen maak je die dus dit keer zelf, en is het niet van een andere ontwikkelaar.

De custom post type plugin maken

Hieronder nog even in het kort hoe je een eigen plugin maakt. Wil je meer informatie over het maken van een eigen plugin? Lees dan het artikel in bovenstaande link.

  1. Maak op je computer een map aan, genaamd my-post-type-plugin (of een andere naam naar keuze). Deze map upload je wanneer je klaar bent naar de plugins map van je website (wp-content/plugins). Heb je lokaal op je computer of op een testserver een testwebsite staan, dan kan je deze map direct in de plugins map plaatsen.
  2. In de zojuist aangemaakte map zet je een PHP-bestand met de naam my-post-type-plugin.php (of een andere naam naar keuze, als het maar eindigt op .php).

    In dat bestand plak je de volgende code:
<?php
/**
 * Plugin Name: wpsimpel custom post types plugin
 * Plugin URI:  https://wpsimpel.nl/
 * Description: Plugin to register the 'event' custom post type
 * Version:     1.0.0
 * Author:      wpsimpel
 * Author URI:  https://wpsimpel.nl/
 * License:     GPL2v2
 * License URI: https://www.gnu.org/licenses/gpl-2.0.html
 * Text Domain: wpsimpel
 * Domain Path: /languages

Nu heb je een werkende plugin en kan je deze in de WordPress admin activeren. Weet je niet hoe je dit doet? Dit artikel legt uit hoe je een WordPress plugin installeert.

De plugin doet verder nog niets, want er is verder nog geen code aan toegevoegd.

Custom post type aan WordPress toevoegen

Custom post types worden aangemaakt met de functie register_post_type(). Om dit te kunnen gebruiken moet er eerst een functie worden aangemaakt om alle labels en argumenten van je custom post type te definiëren. Vervolgens voeg je hier in een latere stap de register_post_type() functie aan toe. De custom post type functie ziet er zo uit:

/**
 * Add 'event' custom post type.
 */
add_action( 'init', 'wpsimpel_event_custom_post_type' );

function wpsimpel_event_custom_post_type() {

}

In deze functie plaatsen we vervolgens alle inhoud die nodig is om je custom post type te laten werken.

Labels toevoegen

Laten we eerst de ‘labels’ voor je custom post type toevoegen. Voeg onderstaande code binnen de accolades ({}) toe aan de functie:

// Define the labels for your custom post type
$labels = array(
	'name'                => _x( 'Events', 'Post Type General Name', 'your-text-domain' ),
	'singular_name'       => _x( 'Event', 'Post Type Singular Name', 'your-text-domain' ),
	'menu_name'           => __( 'Event', 'your-text-domain' ),
	'parent_item_colon'   => __( 'Parent Event:', 'your-text-domain' ),
	'all_items'           => __( 'All Events', 'your-text-domain' ),
	'view_item'           => __( 'View Event', 'your-text-domain' ),
	'add_new_item'        => __( 'Add New Event', 'your-text-domain' ),
	'add_new'             => __( 'Add New', 'your-text-domain' ),
	'edit_item'           => __( 'Edit Event', 'your-text-domain' ),
	'update_item'         => __( 'Update Event', 'your-text-domain' ),
	'search_items'        => __( 'Search Event', 'your-text-domain' ),
	'not_found'           => __( 'Not found', 'your-text-domain' ),
	'not_found_in_trash'  => __( 'Not found in Trash', 'your-text-domain' ),
);

Deze ‘labels’ zijn niet zichtbaar voor je websitebezoekers, maar zijn van toepassing op de bijbehorende menu-items en koppen in de WP admin. In deze tutorials maak ik een custom post type aan voor evenementen. Je kan de term Event natuurlijk aanpassen naar de naam van je eigen gewenste post type, bijvoorbeeld Book, Review etc.

Ook gebruiken we internationalisering in de labels door de ‘textdomain’ te definiëren, zodat de labels worden vertaald naar de voor de gebruiker lokale taal. Let er dan op dat je 'your-text-domain' vervangt door de in je thema of plugin gedefinieerde waarde.

Argumenten definiëren

De volgende stap is het definiëren van de argumenten voor je custom post type, waarvan één argument de $labels array is die je zojuist aan de functie hebt toegevoegd.

Voeg onder de labels maar nog steeds binnen die accolades ({}) het volgende toe:

// Define the arguments for your custom post type
$args = array(
	'labels'                => $labels,
	'description'           => __( 'Post Type for events', 'your-text-domain' ),
	'supports'              => array( 'title', 'editor', 'author', 'thumbnail', 'comments', 'custom-fields', ),
	'hierarchical'          => false,
	'public'                => true,
	'show_ui'               => true,
	'show_in_menu'          => true,
	'show_in_nav_menus'     => true,
	'show_in_admin_bar'     => true,
	'menu_position'         => 5,
	'menu_icon'             => 'dashicons-calendar-alt',
	'can_export'            => true,
	'has_archive'           => true,
	'exclude_from_search'   => false,
	'publicly_queryable'    => true,
	'capability_type'       => 'post',
	'rewrite'               => array( 'slug' => __( 'agenda', 'your-text-domain' ) ),
 	'show_in_rest'          => true
);

Wil je meer weten over wat de verschillende argumenten en hun waardes inhouden? Lees dan dit Codex artikel op WordPress.org

Slug rewrite

In de $args array zie je het argument:

'rewrite' => array( 'slug' => __( 'agenda', 'your-text-domain' ) ),

Dit argument zorgt er voor dat de slug ‘agenda’ wordt gebruikt in de URL van je custom post type. Standaard wordt namelijk de naam (in ons geval dus event) gebruikt in de URL. De URL zou er voor een evenement genaamd “Koningsdag 2020” zonder het argument rewrite dus uit zien als bijvoorbeeld: mijnwebsite.nl/event/koningsdag-2020.

Het is ‘best practice’ om een voorvoegsel toe te voegen aan de namen van custom post types die je zelf maakt, zodat je zeker weet dat ze niet botsen met post types die zijn toegevoegd door plugins of thema’s van andere ontwikkelaars.

Met het rewrite argument kan je de URL wijzigen naar: mijnwebsite.nl/agenda/koningsdag-2020. Je zou 'agenda' ook kunnen vervangen door bijvoorbeeld 'events', en deze met de internationalisatie/textdomain-functie kunnen vertalen naar evenementen.

Custom post type registreren

Nu zijn alle argumenten gedefinieerd, maar doet de functie nog niets. Nu komt de functie register_post_type() van pas. Voeg dit toe, onder de argumenten maar nog steeds binnen de accolades ({}):

// Register your custom post type
register_post_type( 'event', $args );

Deze functie registreert het post type event, met de argumenten die we al hebben gedefinieerd.

De complete custom post type plugin code

<?php
/**
 * Plugin Name: wpsimpel custom post types plugin
 * Plugin URI:  https://wpsimpel.nl/
 * Description: Plugin to register the 'event' custom post type
 * Version:     1.0.0
 * Author:      wpsimpel
 * Author URI:  https://wpsimpel.nl/
 * License:     GPL2v2
 * License URI: https://www.gnu.org/licenses/gpl-2.0.html
 * Text Domain: wpsimpel
 * Domain Path: /languages

/**
 * Add 'event' custom post type.
 */
add_action( 'init', 'wpsimpel_event_custom_post_type' );

function wpsimpel_event_custom_post_type() {
	
	// Define the labels for your custom post type
	$labels = array(
		'name'                => _x( 'Events', 'Post Type General Name', 'your-text-domain' ),
		'singular_name'       => _x( 'Event', 'Post Type Singular Name', 'your-text-domain' ),
		'menu_name'           => __( 'Events', 'your-text-domain' ),
		'parent_item_colon'   => __( 'Parent Event:', 'your-text-domain' ),
		'all_items'           => __( 'All Events', 'your-text-domain' ),
		'view_item'           => __( 'View Event', 'your-text-domain' ),
		'add_new_item'        => __( 'Add New Event', 'your-text-domain' ),
		'add_new'             => __( 'Add New', 'your-text-domain' ),
		'edit_item'           => __( 'Edit Event', 'your-text-domain' ),
		'update_item'         => __( 'Update Event', 'your-text-domain' ),
		'search_items'        => __( 'Search Event', 'your-text-domain' ),
		'not_found'           => __( 'Not found', 'your-text-domain' ),
		'not_found_in_trash'  => __( 'Not found in Trash', 'your-text-domain' ),
	);

	// Define the arguments for your custom post type
	$args = array(
		'labels'                => $labels,
		'description'           => __( 'Post Type for events', 'your-text-domain' ),
		'supports'              => array( 'title', 'editor', 'author', 'thumbnail', 'comments', 'custom-fields', ),
		'hierarchical'          => false,
		'public'                => true,
		'show_ui'               => true,
		'show_in_menu'          => true,
		'show_in_nav_menus'     => true,
		'show_in_admin_bar'     => true,
		'menu_position'         => 5,
		'menu_icon'             => 'dashicons-calendar-alt',
		'can_export'            => true,
		'has_archive'           => true,
		'exclude_from_search'   => false,
		'publicly_queryable'    => true,
		'capability_type'       => 'post',
		'rewrite'               => array( 'slug' => __( 'agenda', 'your-text-domain' ) ),
 		'show_in_rest'          => true
	);
	
	// Register your custom post type
	register_post_type( 'event', $args );
}

Sla nu jouw bestand op en activeer de plugin in de WordPress-admin. Je zult zien dat er een nieuwe post type ‘Evenementen’ is verschenen in de WordPress-admin.

De custom post type is nu geregistreerd en kan worden gebruikt; nu kan je beginnen met het toevoegen van evenementen (of andere post types) aan je website.

Custom taxonomieën en extra velden toevoegen aan custom post types

In een van de volgende posts in deze serie leg ik je uit hoe je custom taxonomieën aan je custom post types toevoegt waarmee je je posts kan categoriseren, in dit geval maak ik een taxonomie voor het evenement-type.

Ook leg ik je uit hoe je met de plugin Advanced Custom Fields extra velden toevoegt aan je custom post types. Om in het voorbeeld van deze tutorial te blijven gaan we een begin- en (optioneel) einddatumveld toevoegen, om zo evenmenten op de website te kunnen tonen op datum.

Beoordeel deze post:

Gemiddeld: 4 / 5. Aantal beoordelingen: 2

Nog geen beoordelingen

Whoops! 😔

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