wordpress_beitragstypen

WordPress: Beitragstypen/ Custom Post Types

Die regulären Beitragstypen in WordPress sind Artikel und Seiten. Hier erfährst Du, wie man weitere Post Types hinzufügen kann.

Video

In diesem Video wird der ganze Code demonstriert und erklärt. Außerdem finden sich Hinweise zur Verwendung von Beitragstypen in der Praxis.

functions.php

Zunächst einmal muss in der functions.php WordPress gesagt werden, dass ein neuer Beitragstyp angelegt werden soll. Innerhalb der Funktion register_post_type muss der Name, sowie einige Einstellungen in dem array angegeben werden. In der Regel sind diese relativ selbsterklärend oder man schaut die unzähligen Möglichkeiten im WordPress Codex nach. In unserem Fall haben wir wenige Optionen gewählt. Slug ist für die spätere URL Struktur wichtig.

add_action( 'init', 'create_post_type' );

function create_post_type() {
	register_post_type( 'portfolio',
		array(
			'labels' => array(
			'name' => __( 'Portfolio' ),
			'singular_name' => __( 'Portfolio' )),
			'public' => true,
			'has_archive' => true,
			'rewrite' => array('slug' => 'portfolio'),
			'taxonomies' => array('post_tag')
		)
	);
}

Separat ausgeben

Es ist möglich den Beitragstypen in einer eigenen Loop separat auszugeben. Dies macht beispielsweise auf der Startseite Sinn, wenn man Blogposts und daneben News, oder eben die Einträge im Portfolio, ausgeben möchte.

<div id="container">
  <?php $args = array( 'post_type' => 'portfolio', 'posts_per_page' => 10 );
  $loop = new WP_Query( $args );
  while ( $loop->have_posts() ) : $loop->the_post(); ?>
    <div <?php post_class('article'); ?>>
      <?php the_title();
      the_content(); ?>
    </div>
  <?php endwhile; ?>
</div>

Zusammen ausgeben

Es ist natürlich auch möglich den Beitragstypen innerhalb der bereits erstellten Loop mit den anderen Artikeln auszugeben. Dazu muss man einfach folgenden Code in die functions.php schreiben. Dieser reiht den neu erstellten Beitragstyp zu den anderen Beiträgen in die Schlange und gibt diese auf der Startseite mit allen Posts aus.

add_action( 'pre_get_posts', 'add_my_post_types_to_query' );

function add_my_post_types_to_query( $query ) {
  if ( is_home() && $query->is_main_query() )
    $query->set( 'post_type', array( 'post', 'portfolio' ) );
  return $query;
}

Template

Wenn man keine speziellen Templates erstellen möchte, greift WordPress stest auf die index.php zu. Natürlich ist es auch möglich eine spezielle single.php bzw. archive.php Template Datei zu erstellen.

single-portfolio.php

Neben der Bezeichnung single-portfolio.php kennen wir den folgenden Code schon. Lediglich die Funktion get_post_type_archive_link() ist neu, die einen Link zum Archiv des jeweiligen Posttypes ausgibt. In die besagte Funktion hätte man direkt ‚portfolio‘ schreiben können, mit der Funktion get_post_type() lässt sich diese Bezeichnung allerdings auch auslesen. Ob das an dieser Stelle sinnvoll ist, sei mal dahin gestellt. Es ist jedoch wichtig diese Funktion zu kennen.

<?php get_header(); ?>
  <div id="main">
    <div id="content">
      <?php if (have_posts()) : while (have_posts()) : the_post(); ?>
        <div <?php post_class('article'); ?>>
	  <div class="date"><?php the_time('l, d. F Y, h:i'); ?></div> 
	    <h2 class="title"><?php the_title(); ?></h2>
	    <?php the_content('Weiterlesen'); ?>
					
	    <a href="<?php echo get_post_type_archive_link(get_post_type()); ?>"> Mehr aus meinem Portfolio</a>
	  </div>
      <?php endwhile; endif; ?>

      <?php comments_template(); ?>
    </div><!-- content -->
 
    <div id="sidebar">
      <?php get_sidebar(); ?>
    </div><!-- #sidebar -->
	
    <div class="clear"></div>
  </div> <!-- #main -->
<?php get_footer(); ?>

archive-portfolio.php

Die folgende Template Datei ist zum Darstellen des jeweiligen Archives zuständig. Oben haben wir den Titel „Mein Portfolio“ ausgegeben. Sonst gleicht der Code uns Bekanntem.

<?php get_header(); ?>
  <div id="main">
    <div id="content">
      <strong id="archive_title">Mein Portfolio</strong>
      <?php if (have_posts()) : while (have_posts()) : the_post(); ?>
        <div <?php post_class('article'); ?>>
	  <div class="date"><?php the_time('l, d. F Y, h:i'); ?></div> 
	
	  <h2 class="title"><a href="<?php the_permalink() ?>"><?php the_title(); ?></a></h2>
	  <?php the_content('Weiterlesen'); ?>

        </div>
      <?php endwhile; endif; ?>
    </div><!-- content -->
 
    <div id="sidebar">
      <?php get_sidebar(); ?>
    </div><!-- #sidebar -->
	
    <div class="clear"></div>
  </div> <!-- #main -->
<?php get_footer(); ?>

Um einen Link zum jeweiligen „Custom Post Type“-Archiv zu erstellen, kann folgende Funktion verwendet werden. Diese gibt den Link als „blank“-Text, also ohne HTML Tags, aus.

<?php get_post_type_archive_link(); ?>

Einstellungen für Post Types

Die Funktionen wie Artikelbilder, müssen erst für den Beitragstyp mit der Funktion add_post_type_support() aktiviert werden. Mit der gegensätzlichen Funktion remove_post_type_support() kann man auch solche Funktionen entfernen, wenn man diese nicht haben möchte. In unserem Fall haben wir dem Beitragstyp Portfolio die Funktionen Artikelbilder und Kommentare hinzugefügt, und für die Seiten die Artikelbilder deaktiviert.

add_action( 'init', 'settings_post_types' );
function settings_post_types () {
  add_post_type_support( 'portfolio', array('thumbnail', 'comments') );
  remove_post_type_support( 'page', 'thumbnail' );
}

Quellen

http://codex.wordpress.org/Function_Reference/remove_post_type_support
http://codex.wordpress.org/Function_Reference/add_post_type_support
http://codex.wordpress.org/Post_Type
http://codex.wordpress.org/Function_Reference/register_post_type
http://codex.wordpress.org/Function_Reference/is_home
http://codex.wordpress.org/Function_Reference/get_post_type
http://codex.wordpress.org/Function_Reference/get_post_type_archive_link

Über den Autor:

Mein Name ist Fabian Geier, Gründer von SourceBlogging, Läufer und WordPress-Enthusiast. Du findest mich vor allen Dingen auf meiner Webseite.