Diese Webseite nutzt Cookies für Funktions-, Komfort- und Statistikzwecke. Ausführliche Informationen zur Verwendung von Cookies auf Webseiten finden Sie im Bereich Datenschutz.
imaker-it.com_blog_mysite.com-plugins-folder

Erstellung eines WordPress-Plugins für benutzerdefinierte Beitragstypen

  • Webentwicklung
  • Sayd Imaker
  • Juli 23, 2017
  • 654 Seitenaufrufe
  • 1 Star2 Stars3 Stars4 Stars5 Stars 5
    Loading... Stimmen

Im folgendem Artikel beschreibe ich die Erstellung eines Plugins für benutzerdefinierte Beitragstypen in WordPress mit der Unterstützung von Kategorien, die sich mit den Kategorien für Standard Beiträge nicht überschneiden.

Erstellung des Plugins

Es existieren bestimmte Standards für die Erstellung von Plugins für WordPress, die eingehalten werden sollten (näheres kann dem „Wordpress Codex“ entnommen werden). Unten führe ich einige wichtige Aspekte auf, die bei der Erstellung eines eigenen Plugins berücksichtigt werden sollten.

Wahl des Plugin Namens

Es wäre richtig, die Hauptaufgabe des Plugin bereits in seinem Namen wiederzugeben. Daher wird für dieses Beispiel der Plugin Name „Mein Portfolio“ gewählt.

Plugin Datei-Struktur

In der Regel, werden Plugins in dem entsprechenden Ordner wp-content/plugins platziert. Das Plugin kann aus einer Datei bestehen, die sich unmittelbar in dem Ordner plugins befindet, sowie auch aus mehreren verbundenen Dateien innerhalb eines Ordners. Sinnvollerweise sollte der Name der Plugin Datei/des Plugin Ordners dem Namen des Plugins entsprechen. Selbstverständlich, dürfen verschiedene Plugins innerhalb einer Website, keinen identischen Datei/Ordner Namen haben.

Wenn das Plugin nur aus einer Datei besteht, dann enthält die Datei ganz am Anfang eine Metainformation über das Plugin für WordPress. Unten führe ich ein typisches Beispiel einer Metainformation für das gegebene Plugin auf.

<?php
/*
Plugin Name: My portfolio
Plugin URI: http://www.my-portfolio.com 
Version: 1.0
Description: Declares custom post type "project" for Potfolio.
Author: IMAKER IT
Author URI: http://www.my-portfolio.com 
License: My free license
*/

Diese Information genügt, um das Plugin im System zu erkennen.

Quellcode des PLugins

Folglich wird das Plugin nur aus einer Datei bestehen. Dementsprechend benenne ich die Datei my-portfolio.php. Der Pfad zum Plugin sieht nun folgendermaßen aus: /wp-content/plugins/myportfolio.php. Geht man nun in den Bereich „Plugins“ über, erscheint dort der erstellte Plugin „My portfolio“, der bereits aktiviert werden kann. Nach der Plugin Aktivierung wird auf der Website nicht passieren, da das Plugin noch keinen Quellcode hat.

Раздел «Плагины», плагин: «My portfolio».

Bereich „Plugins“, Plugin: „My portfolio“.

Wie aus der Beschreibung ersichtlich ist, gibt das gegebene Plugin den benutzerdefinierten Beitragstyp project an. Beiträge dieses Typs müssen Kategorien unterstützen und aus Titel, Beitragsbild und Inhalt bestehen. Entsprechend muss das alles in dem Quellcode des Plugins angegeben werden.

Zuerst wird der Beitragstyp project mit den entsprechenden Einstellungen registriert. Nähere Erklärungen der Einstellungen sind meiner Meinung nach irrelevant. Dort ist alles intuitiv verständlich.

/* Registered a custom post type with slug "project" */
function imaker_projects() {
	// Set UI labels for Custom Post Type
	$labels = array(
		'name' => _x('Portfolio', 'post type general name'),
		'singular_name' => _x('Project', 'post type singular name'),
		'add_new' => _x('Add New', 'project'),
		'add_new_item' => __('Add new project'),
		'edit_item' => __('Edit project'),
		'new_item' => __('New project'),
		'all_items' => __('All projects'),
		'view_item' => __('View project'),
		'search_items' => __('Search project'),
		'not_found' =>	__('No projects found'),
		'not_found_in_trash' => __('No projects found in Trash'), 
		'parent_item_colon' => __('Parent projects'),
		'menu_name' => __('Portfolio')
	);
	
	// Set other options for Custom Post Type
	$args = array(
		'labels' => $labels,
		'hierarchical' => true,
		'description' => 'Project Posts',
		'supports' => array( 'title', 'editor', 'thumbnail' ),
		'taxonomies' => array( 'project_category', 'post_tag' ),
		'show_ui' => true, 
		'show_in_menu' => true, 
		'menu_position' => null,
		'menu_icon' => 'dashicons-list-view',
		'show_in_nav_menus' => true,
		'publicly_queryable' => true,
		'exclude_from_search' => false,
		'query_var' => true,
		'can_export' => true,
		'rewrite' => array('slug'=>'portfolio/%project_category%', 'with_front'=>FALSE),
		'public' => true,
		'has_archive' => 'projects', 
		'capability_type' => 'post',
	); 
	register_post_type('project',$args);
}
add_action( 'init', 'imaker_projects' );

Im nächsten Schritt kommt die Unterstützung der Kategorien hinzu. Anstatt der gewöhnlichen Klassifikation category wird eine neue project_category registriert. Dies wird die Darstellung der Kategorien für Projekte im allgemeinen Kategorienverzeichnis für Beiträge verhindern. Für ein besseres Verständnis, habe ich zu einigen Parametern Kommentare hinzugefügt.

/* Set taxonomy for custom post type */
function my_taxonomy() {
	register_taxonomy(
		'project_category',					//The name of the taxonomy 
		'project',							//Post type name
		array(
			'hierarchical' => true,
			'label' => 'Categories',		//Display name
			'query_var' => true,
			'rewrite' => array(
				'slug' => 'category',		//The base slug
				'with_front' => false		//Don't display the category base before 
			),
			'show_admin_column' => true,	//Display column in Backend
		)
	);
}
add_action( 'init', 'my_taxonomy');

Damit die Kategorien in der URL des Beitrags angezeigt werden, wird ein post_type_link Filter mit der entsprechenden Änderung in der URL angewandt.

/* Changed permalink */
function filter_post_type_link($link, $post) {
	if ($post->post_type != 'project')
		return $link;

	if ($cats = get_the_terms($post->ID, 'project_category'))
		$link = str_replace('%project_category%', array_pop($cats)->slug, $link);
	return $link;
}
add_filter('post_type_link', 'filter_post_type_link', 10, 2);

Falls keine Kategorie für den Beitrag angegeben wird, dann muss der Beitrag sich in die Kategorie other verschieben. Dafür ist der nächste Block verantwortlich.

/* Set default category, if post has not category */
function default_taxonomy_term( $post_id, $post ) {
	if ( 'publish' === $post->post_status ) {
		$defaults = array(
			'project_category' => array('other'),
		);
		$taxonomies = get_object_taxonomies( $post->post_type );
		foreach ( (array) $taxonomies as $taxonomy ) {
			$terms = wp_get_post_terms( $post_id, $taxonomy );
			if ( empty( $terms ) && array_key_exists( $taxonomy, $defaults ) ) {
				wp_set_object_terms( $post_id, $defaults[$taxonomy], $taxonomy );
			}
		}
	}
}
add_action( 'save_post', 'default_taxonomy_term', 100, 2 );

Im Allgemeinen ist es der komplette Quellcode des Plugins. Unten führe ich den ganzen Quellcode auf, der in der Datei my-portfolio.php platziert werden muss.

 _x('Portfolio', 'post type general name'),
		'singular_name' => _x('Project', 'post type singular name'),
		'add_new' => _x('Add New', 'project'),
		'add_new_item' => __('Add new project'),
		'edit_item' => __('Edit project'),
		'new_item' => __('New project'),
		'all_items' => __('All projects'),
		'view_item' => __('View project'),
		'search_items' => __('Search project'),
		'not_found' =>	__('No projects found'),
		'not_found_in_trash' => __('No projects found in Trash'), 
		'parent_item_colon' => __('Parent projects'),
		'menu_name' => __('Portfolio')
	);
	
	// Set other options for Custom Post Type
	$args = array(
		'labels' => $labels,
		'hierarchical' => true,
		'description' => 'Project Posts',
		'supports' => array( 'title', 'editor', 'thumbnail' ),
		'taxonomies' => array( 'project_category', 'post_tag' ),
		'show_ui' => true, 
		'show_in_menu' => true, 
		'menu_position' => null,
		'menu_icon' => 'dashicons-list-view',
		'show_in_nav_menus' => true,
		'publicly_queryable' => true,
		'exclude_from_search' => false,
		'query_var' => true,
		'can_export' => true,
		'rewrite' => array('slug'=>'portfolio/%project_category%', 'with_front'=>FALSE),
		'public' => true,
		'has_archive' => 'projects', 
		'capability_type' => 'post',
	); 
	register_post_type('project',$args);
}
add_action( 'init', 'imaker_projects' );


/* Set taxonomy for custom post type */
function my_taxonomy() {
	register_taxonomy(
		'project_category',					//The name of the taxonomy 
		'project',							//Post type name
		array(
			'hierarchical' => true,
			'label' => 'Categories',		//Display name
			'query_var' => true,
			'rewrite' => array(
				'slug' => 'category',		//The base slug
				'with_front' => false		//Don't display the category base before 
			),
			'show_admin_column' => true,	//Display column in Backend
		)
	);
}
add_action( 'init', 'my_taxonomy');


/* Changed permalink */
function filter_post_type_link($link, $post) {
	if ($post->post_type != 'project')
		return $link;

	if ($cats = get_the_terms($post->ID, 'project_category'))
		$link = str_replace('%project_category%', array_pop($cats)->slug, $link);
	return $link;
}
add_filter('post_type_link', 'filter_post_type_link', 10, 2);


/* Set default category, if post has not category */
function default_taxonomy_term( $post_id, $post ) {
	if ( 'publish' === $post->post_status ) {
		$defaults = array(
			'project_category' => array('other'),
		);
		$taxonomies = get_object_taxonomies( $post->post_type );
		foreach ( (array) $taxonomies as $taxonomy ) {
			$terms = wp_get_post_terms( $post_id, $taxonomy );
			if ( empty( $terms ) && array_key_exists( $taxonomy, $defaults ) ) {
				wp_set_object_terms( $post_id, $defaults[$taxonomy], $taxonomy );
			}
		}
	}
}
add_action( 'save_post', 'default_taxonomy_term', 100, 2 );

Der Plugin ist auch zum Download verfügbar: Plug-in "Portfolio".