WordPress - Custom Post Types


Je hebt in WordPress vrijwel altijd de beschikking over berichten en over pagina's. Dit kan ook verder uitgebreid worden voor allerlei doeleinden door zelf Custom Post Types toe te voegen aan WordPress. Heel eenvoudig gezegd komt het neer op het toevoegen van een nieuwe berichtenstructuur met eigen categorieŽn. Zo kan op deze manier bijvoorbeeld een sectie met veelgestelde vragen opgezet worden, een overzicht met films of een overzicht van projecten. Onderdelen die je niet in je standaard berichtenstructuur wilt plaatsen.

Op deze manier kan het gewenste onderdeel dus gescheiden gehouden worden van de normale berichten en categorieŽn. Een voorbeeld van hoe dit er uit zou kunnen zien in WordPress zie je hieronder in de screenshot. Aan de linkerkant zie je een apart menu item genaamd Films en rechts zie je een aantal films die zijn toegevoegd, inclusief categorieŽn.

Er zijn veel mogelijkheden op dit gebied. Met de onderstaande code voeg je een Custom Post Type toe waarbij er ook de mogelijkheid is om categorieŽn te gebruiken. De code moet geplaatst worden in het functions.php bestand van het gebruikte thema maar het is ook mogelijk om de code in een eigen plugin te plaatsen, iets wat soms handiger kan zijn.

In de code kunnen de namen en opties aangepast worden naar wens. Door het tweede gedeelte taxonomies_movies weg te laten worden er geen categorieŽn toegevoegd. De meeste opties in de code wijzigen zich vanzelf op basis van de naam zoals de optie om de berichten uit de zoekfunctie te halen of de gewenste positie in het menu in WordPress.

Let wel op dat na het toevoegen van de onderstaande code het noodzakelijk kan zijn om de permalinks te resetten. Ga dan naar de instellingen van WordPress en kies dan het menu item Permalinks. Zet hier de permalinks op de optie standaard en kies voor Wijzigingen opslaan. Zet daarna de permalinks weer terug naar de gewenste configuratie.

function custom_post_movies() {
        $labels = array(
                'name' => _x('Films', 'films'),
                'singular_name' => _x('Film', 'films'),
                'add_new' => _x('Nieuwe film', 'films'),
                'add_new_item' => __('Nieuwe film toevoegen', 'films'),
                'edit_item' => __('Film bewerken', 'films'),
                'new_item' => __('Nieuwe film', 'films'),
                'all_items' => __('Alle films', 'films'),
                'view_item' => __('Toon films', 'films'),
                'search_items' => __('Zoek films', 'films'),
                'not_found' => __('Geen films gevonden', 'films'),
                'not_found_in_trash' => __('Geen films gevonden in de prullenbak', 'films'),
                'menu_name' => _x( 'Films', 'films'),
        );
        $args = array(
                'labels' => $labels,
                'description' => 'Films',
                'public' => true,
                'show_ui' => true,
                'show_in_menu' => true,
                'menu_position' => 5,
                //'menu_icon' => 'test.png',
                'supports' => array('title', 'editor', 'excerpt', 'author', 'thumbnail', 'custom-fields', 'comments', 'page-attributes'),
                'show_in_nav_menus' => true,
                'exclude_from_search' => false,
                'has_archive' => true,
                'query_var' => true,
                'can_export' => true,
                'rewrite' => true,
                'rewrite' => array('slug' => 'film'),
                'capability_type' => 'post'
        );
        register_post_type('films', $args);
}
add_action('init', 'custom_post_movies');

function taxonomies_movies() {
        $labels = array(
                'name' => _x('Filmcategorieen', 'films'),
                'singular_name' => _x('Filmcategorie', 'films'),
                'search_items' => __('Doorzoek filmcategorieen'),
                'all_items' => __('Alle filmcategorieen'),
                'parent_item' => __('Hoofdcategorie'),
                'parent_item_colon' => __('Hoofdcategorie'),
                'edit_item' => __('Bewerk filmcategorie'),
                'update_item' => __('Filmcategorie bijwerken'),
                'add_new_item' => __('Nieuwe filmcategorie toevoegen'),
                'new_item_name' => __('Nieuwe filmcategorie'),
                'menu_name' => __('Filmcategorieen'),
        );
        $args = array(
                'hierarchical' => true,
                'labels' => $labels,
                'show_ui' => true,
                'show_admin_column' => true,
                'query_var' => true,
                'rewrite' => array('slug' => 'film-categorieen'),
        );
        register_taxonomy('tax-movies', array('films'), $args);
}
add_action('init', 'taxonomies_movies', 0);


Tags

In het voorbeeld hierboven worden alleen categorieŽn toegevoegd maar het is ook eenvoudig om daarnaast nog tags toe te voegen. In de basis is de code vergelijkbaar en gaat het eigenlijk om alleen het wijzigen van de optie 'hierarchical' van true naar de false.

function taxonomies_movies_tags() {
        $labels = array(
                'name' => _x('Filmtags', 'films'),
                'singular_name' => _x('Filmtags', 'films'),
                'search_items' => __('Doorzoek filmtags'),
                'all_items' => __('Alle filtags'),
                'edit_item' => __('Bewerk filmtag'),
                'update_item' => __('Filmtag bijwerken'),
                'add_new_item' => __('Nieuwe filmtag toevoegen'),
                'new_item_name' => __('Nieuwe filmtag'),
                'menu_name' => __('Filmtags'),
        );
        $args = array(
                'hierarchical' => false,
                'labels' => $labels,
                'show_ui' => true,
                'show_admin_column' => true,
                'query_var' => true,
                'rewrite' => array('slug' => 'film-tags'),
        );
        register_taxonomy('tax-movies-tags', array('films'), $args);
}
add_action('init', 'taxonomies_movies_tags', 0);

Eigen templates

Na het toevoegen van de bovenstaande code zal de content aan de voorkant worden getoond op basis van de standaard bestanden die in het template aanwezig zijn. Het gaat dan om archive.php voor het tonen van de categorieŽn en single.php voor het tonen van de berichten zelf. Het is echter ook mogelijk om zelf aparte bestanden in het template aan te maken voor in dit geval het tonen van de films. Op basis van het bovenstaande voorbeeld maak je dan een kopie van het bestand archive.php en noem je deze archive-films.php. Dit is dus archive direct gevolgd door de naam van de Custom Post Type.

Met archive-films heb je dan alleen een aparte template voor het overzicht van alle films. Om nu ook voor de categorieŽn zelf een aparte template te maken maak je opnieuw een kopie van archive.php maar noem je deze taxonomy-tax-movies.php. Dit is 'taxonomy' gevolgd door de naam van de taxonomie. Op deze manier kan er ook een aparte pagina aangemaakt worden voor de tags. Met het weergeven van het bericht of film zelf gaat dit op dezelfde manier, kopieer het bestand single.php en wijzig de naam naar single-films.php.

Laatste berichten tonen

Met de onderstaande code roep je de meest recente berichten (films zoals in het voorbeeld) op. Ingesteld is dat er maximaal vijf berichten worden getoond, dit aantal kun je naar wens aanpassen achter posts_per_page. In de code wordt de titel, de afbeelding en de permalink getoond. Tevens worden categorieŽn en tags getoond waarin de film staat.

<?php
        $args = array(
                'post_type' => 'films',
                'posts_per_page' => 5,
        );
        $movieposts = new WP_Query( $args );
        if( $movieposts->have_posts() ):
                while( $movieposts->have_posts() ):
                        $movieposts->the_post();
                        echo get_the_title();
                        echo get_the_post_thumbnail($post->ID, 'thumbnail', true);
                        echo get_permalink();
                        echo the_time('j F Y');
                        echo get_the_term_list($post->ID, 'tax-movies');
                        echo get_the_term_list($post->ID, 'tax-movies-tags');
                endwhile;
                wp_reset_query();
        endif;
?>


Laatste berichten tonen uit specifieke categorie

Aanvullend op de bovenstaande code kun je er ook voor kiezen om de laatste berichten uit een specfieke categorie (filmcategorie) te tonen. Dit kan met de onderstaande code die bijna gelijk is aan de code hierboven. Verschil met de bovenstaande code is dat er een categorie aan wordt geroepen op basis van het unieke ID. Deze moet ingevoerd worden achter 'terms'. Zorg uiteraard ook dat de juiste naam is ingegeven achter taxonomy.

<?php
        $args = array(
                'post_type' => 'films',
                'posts_per_page' => 5,
                'tax_query' => array(
                        array(
                                'taxonomy' => 'tax-movies',
                                'field' => 'term_id',
                                'terms' => 12)
                        )
        );
        $movieposts = new WP_Query( $args );
        if( $movieposts->have_posts() ):
                while( $movieposts->have_posts() ):
                        $movieposts->the_post();
                        echo get_the_title();
                        echo get_the_post_thumbnail($post->ID, 'thumbnail', true);
                        echo get_permalink();
                        echo the_time('j F Y');
                        echo get_the_term_list($post->ID, 'tax-movies');
                        echo get_the_term_list($post->ID, 'tax-movies-tags');
                endwhile;
                wp_reset_query();
        endif;
?>


Berichten tonen maar juist categorieŽn uitsluiten

<?php
        $args = array(
                'post_type' => 'films',
                'posts_per_page' => 5,
                'tax_query' => array(
                        array(
                                'taxonomy' => 'tax-movies',
                                'field' => 'id',
                                'terms' => 12,
                                'operator' => 'NOT IN' )
                        )
        );
        $movieposts = new WP_Query( $args );
        if( $movieposts->have_posts() ):
                while( $movieposts->have_posts() ):
                        $movieposts->the_post();
                        echo get_the_title();
                        echo get_the_post_thumbnail($post->ID, 'thumbnail', true);
                        echo get_permalink();
                        echo the_time('j F Y');
                        echo get_the_term_list($post->ID, 'tax-movies');
                        echo get_the_term_list($post->ID, 'tax-movies-tags');
                endwhile;
                wp_reset_query();
        endif;
?>

CategorieŽn en tags tonen

Met de onderstaande code kun je op een willekeurige plek in de website een overzicht van alle beschikbare categorieŽn tonen die je hierboven hebt ingesteld voor de films. Vul dan wel de juiste naam achter taxonomy in. In dit geval is de gebruikte naam dus tax-movies, afkomstig uit de code hierboven. Met dezelfde code kunnen ook tags getoond worden.

<?php
        $args = array(
                'orderby' => 'name',
                'show_count' => 0,
                'pad_counts' => 0,
                'hierarchical' => 1,
                'taxonomy' => 'tax-movies',
                'title_li' => 'Filmcategorieen'
        );
?>
<ul>
        <?php wp_list_categories($args); ?>
</ul>


Alternatieve code

<?php
        $args = array(
                'orderby' => 'name',
                'show_count' => 0,
                'pad_counts' => 0,
                'hierarchical' => 1,
                'taxonomy' => 'tax-movies',
                'title_li' => 'Filmcategorieen'
        );
        echo '<ul class="cat-menu">';
                $output = get_categories($args);
                foreach($output as $cat):
                        echo '<li><a href="' . get_term_link($cat) . '">' . $cat->name . '</a></li>';
                endforeach;
        echo '</ul>';
?>

Alle categorieŽn en berichten samen tonen

Met de onderstaande code kun je eenvoudig een overzicht maken met alle categorieŽn met onder elke categorie alle bijbehorende berichten. Deze opzet kan bijvoorbeeld goed van pas komen bij een FAQ pagina waarbij je een overzicht krijgt van alle veelgestelde vragen onderverdeeld in categorieŽn, zo zou je bijvoorbeeld een accordeon kunnen maken. De code kan het best geplaatst worden op een nieuwe pagina met een eigen template.

<?php
        $categories = get_terms("tax-movies");
        foreach($categories as $category):
?>
<div class="movie-container" id="movie-container-<?php echo $category->term_id; ?>">
        <div class="movie-cat-title">
                <?php echo $category->name ?>
        </div>
        <?php
                $catid = $category->term_id;
                $args = array(
                        'post_type' => 'films',
                        'tax_query' => array(
                        array(
                                'taxonomy' => 'tax-movies',
                                'field' => 'term_id',
                               'terms' => $catid)
                       )
                );
                $query = new WP_Query($args);
                while ( $query->have_posts() ) : $query->the_post();
        ?>
        <div class="movie-title">
                <?php the_title( '<a href="' . esc_url( get_permalink() ) . '">', '</a>' ); ?>
        </div>
        <div class="movie-item">
                <?php the_content(); ?>
        </div>
        <?php
                        endwhile;
                echo '</div>';
        endforeach;
        wp_reset_postdata();
?>

Toon categorieŽn waar bericht aan is gekoppeld

Toon op de detailpagina van een bericht aan welke categorieŽn het bericht is gekoppeld.

<?php
        if(false != get_the_term_list($post->ID, 'tax-movies')):
                echo get_the_term_list($post->ID,'tax-movies', ' ', ', ', '' );
        endif;
?>


Alternatieve code

<?php
        $terms = get_the_terms($post->ID, 'tax-movies');
        if($terms && ! is_wp_error($terms)):
                foreach ( $terms as $term ):
                        $termID = $term->term_id;
                        echo $term->name;
                        echo get_term_link($term);
                endforeach;
        endif;
?>

Titel categorie op categoriepagina

Toon op de categoriepagina de titel van de betreffende categorie.

<?php
        single_term_title();
?>

ID huidige categorie en parent

Toon ID van de huidige categorie en parent.

<?php
        echo 'ID: ' . get_queried_object_id();
        echo 'Parent: ' . $parentID = get_queried_object()->parent;
?>

Zoeken in taxonomy

Plaats een zoekveld om specifiek in een opgegeven taxonomy te zoeken. Vul de correcte naam van de taxonomy in evenals van de aangemaakte custom post type.

<form action="<?php echo get_site_url() ?>" method="get">
        <fieldset>
                <input name="s" type="text" placeholder="" value="<?php echo get_search_query() ?>" />
                <!-- &taxonomy=tax-jobs&post_type=jobs -->
                <input type="hidden" value="tax-movies" name="taxonomy" />
                <input type="hidden" value="films" name="post_type" />
                <input type="submit" class="button" value="" />
        </fieldset>
</form>