WordPress Custom Post Type für Buchblogs

Hier mal ein kurzer Textschnippsel für einen Custom Post Type um schön Strukturiert Bücherrezensionen zu erstellen. Wie das ganze aussieht könnt ihr euch bei Game of Books ansehen

function cptui_register_my_cpts_book() {

	/**
	 * Post Type: Bücher-Rezensionen.
	 */

	$labels = array(
		"name" => __( "Bücher-Rezensionen", "tiny-framework" ),
		"singular_name" => __( "Buch-Rezension", "tiny-framework" ),
	);

	$args = array(
		"label" => __( "Bücher-Rezensionen", "tiny-framework" ),
		"labels" => $labels,
		"description" => "",
		"public" => true,
		"publicly_queryable" => true,
		"show_ui" => true,
		"show_in_rest" => false,
		"rest_base" => "",
		"has_archive" => "books",
		"show_in_menu" => true,
		"show_in_nav_menus" => true,
		"exclude_from_search" => false,
		"capability_type" => "post",
		"map_meta_cap" => true,
		"hierarchical" => false,
		"rewrite" => array( "slug" => "book", "with_front" => true ),
		"query_var" => true,
		"supports" => array( "title", "thumbnail", "excerpt", "trackbacks", "comments", "revisions", "author" ),
		"taxonomies" => array( "category", "post_tag", "ngg_tag" ),
	);

	register_post_type( "book", $args );
}

add_action( 'init', 'cptui_register_my_cpts_book' );

und dann noch die dazugehörigen Custom Fields:

if(function_exists("register_field_group"))
{
	register_field_group(array (
		'id' => 'acf_books',
		'title' => 'Books',
		'fields' => array (
			array (
				'key' => 'field_5b560505663f5',
				'label' => 'Autor',
				'name' => 'autor',
				'type' => 'text',
				'required' => 1,
				'default_value' => '',
				'placeholder' => 'Nachname, Vorname',
				'prepend' => '',
				'append' => '',
				'formatting' => 'html',
				'maxlength' => '',
			),
			array (
				'key' => 'field_5b560532663f6',
				'label' => 'Titel',
				'name' => 'titel',
				'type' => 'text',
				'required' => 1,
				'default_value' => '',
				'placeholder' => '',
				'prepend' => '',
				'append' => '',
				'formatting' => 'html',
				'maxlength' => '',
			),
			array (
				'key' => 'field_5b561803a4d38',
				'label' => 'Verlag',
				'name' => 'verlag',
				'type' => 'text',
				'default_value' => '',
				'placeholder' => '',
				'prepend' => '',
				'append' => '',
				'formatting' => 'html',
				'maxlength' => '',
			),
			array (
				'key' => 'field_5b561812a4d39',
				'label' => 'ISBN-13',
				'name' => 'isbn-13',
				'type' => 'text',
				'default_value' => '',
				'placeholder' => '',
				'prepend' => '',
				'append' => '',
				'formatting' => 'none',
				'maxlength' => '',
			),
			array (
				'key' => 'field_5b5618cb79bda',
				'label' => 'Quellen-Copyright:',
				'name' => 'quellen-copyright',
				'type' => 'text',
				'default_value' => '',
				'placeholder' => '',
				'prepend' => '',
				'append' => '',
				'formatting' => 'html',
				'maxlength' => '',
			),
			array (
				'key' => 'field_5b563a25c9ad9',
				'label' => 'Galerie-ID',
				'name' => 'galerieid',
				'type' => 'number',
				'default_value' => '',
				'placeholder' => '',
				'prepend' => '',
				'append' => '',
				'min' => '',
				'max' => '',
				'step' => '',
			),
			array (
				'key' => 'field_5b5615dc5491b',
				'label' => 'Einleitung:',
				'name' => 'einleitung',
				'type' => 'textarea',
				'default_value' => '',
				'placeholder' => '',
				'maxlength' => '',
				'rows' => '',
				'formatting' => 'html',
			),
			array (
				'key' => 'field_5b561344258de',
				'label' => 'Inhalt:',
				'name' => 'inhalt',
				'type' => 'textarea',
				'default_value' => '',
				'placeholder' => '',
				'maxlength' => '',
				'rows' => '',
				'formatting' => 'html',
			),
			array (
				'key' => 'field_5b561383258df',
				'label' => 'Meinung:',
				'name' => 'meinung',
				'type' => 'textarea',
				'default_value' => '',
				'placeholder' => '',
				'maxlength' => '',
				'rows' => '',
				'formatting' => 'html',
			),
			array (
				'key' => 'field_5b561396258e0',
				'label' => 'Autor-Bio:',
				'name' => 'autor-bio',
				'type' => 'textarea',
				'default_value' => '',
				'placeholder' => '',
				'maxlength' => '',
				'rows' => '',
				'formatting' => 'html',
			),
			array (
				'key' => 'field_5b583548354ef',
				'label' => 'Freitext',
				'name' => 'freitext',
				'type' => 'textarea',
				'default_value' => '',
				'placeholder' => '',
				'maxlength' => '',
				'rows' => '',
				'formatting' => 'html',
			),
		),
		'location' => array (
			array (
				array (
					'param' => 'post_type',
					'operator' => '==',
					'value' => 'book',
					'order_no' => 0,
					'group_no' => 0,
				),
			),
		),
		'options' => array (
			'position' => 'acf_after_title',
			'layout' => 'no_box',
			'hide_on_screen' => array (
			),
		),
		'menu_order' => 0,
	));
}

 

Webserver Härtung

Die IT-Sicherheitsbranche bleibt nicht stehen, deswegen gibt es hier mal wieder einen Aktualisierung/Ergänzung zu meinem Artikel über sichere Webserver-Konfiguration.

Wo ich früher eigentlich ausschließlich SSLlabs zum Testen meiner Webserver Konfiguration eingesetzt habe steht bei mir mittlerweile eine Kombination aus diversen Tools im Vordergrund.

Weiterlesen

Frankfurter Buchmesse 2017 #fbm17

Wow, was war das denn? Zurück von der Frankfurter Buchmesse und einfach nur geflasht. Ich wusste vorher ungefähr was mich auf der Frankfurter Buchmesse erwartet, aber die Realität war noch viel besser als gedacht. Weiterlesen

#GBSDH (=grüne Bücher sind der Hammer)

Die hat dazu aufgerufen unter dem Hashthag #GBSDH (=grüne Bücher sind der Hammer) tolle Bücher mit grünem Cover zu zeigen. hier mal eine kleine Auswahl von mir. Viel Spass damit, ich kann sie alle empfehlen 🙂

Neu gekaufte/bekommen Bücher in 2016

Das Jahr 2016 war Büchertechnisch bei mir erstaunlich ruhig, das mag auch daran liegen das ich 2016 deutlich mehr Fanfictions gelesen habe. An echten Büchern kamen bei mir 2016 folgende dazu:

  • Xiang von Anna Mocikat
  • Memox: Das Zittern der Zeit von Peter Pakulat, Bastian Pakulat
  • Das Paket von Sebastian Fitzek
  • The End von Michael Hopf
  • #pwned: Es kann jeden treffen von Holger Junker
  • MUC: Roman von Anna Mocikat
  • Countdown – Spiel um dein Leben von Florian Lafani, Gautier Renault
  • HELIX – Sie werden uns ersetzen von Elsberg, Marc
  • Harry Potter und das verwunschene Kind. Teil eins und zwei von Rowling, Joanne K
  • Demon – Sumpf der Toten: Ein neuer Fall für Special Agent Pendergast von Preston, Douglas und Child, Lincoln
  • Harry Potter and the Cursed Child – Parts I & II von Rowling, Joanne K.
  • Mirror von Olsberg, Karl
  • Teufelsgold von Eschbach, Andreas

Puppet Config für einen sicheren Webserver

Hier mal die Puppet Config für meinen Webserver. Das ganze besteht aus mehreren Teilen, der Webserver allgemein:

class blue-web-srv::srv {
	
	class { 'apache': 
		server_tokens  => 'Prod',
		server_signature => 'EMail',
		trace_enable => 'off',
		mpm_module => 'prefork'
	}
	apache::listen { '80': }
	apache::listen { '443': }
	class { 'apache::mod::ssl':
		ssl_cipher => 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256',
		ssl_protocol => [ 'all', '-SSLv2', '-SSLv3', '-TLSv1', '-TLSv1.1' ],
		ssl_compression => false,
		ssl_honorcipherorder => true,
		ssl_stapling => true,		
	}
	class { 'apache::mod::rewrite': }
	class { 'apache::mod::headers': }
	class { 'apache::mod::php': }

}

dann der Config für den VHost:

class blue-web-srv::sebastianhaeutlede {

	$domain = 'sebastian-haeutle.de'
	$alias = ['www.haeutleit.de', 'haeutleit.de', 'www.sebastian-haeutle.de', 'www.sebastian-haeutle.com', 'sebastian-haeutle.com', 'www.sebastianhaeutle.de', 'sebastianhaeutle.de']
	
	file { "/opt/myssl/${domain}":
		ensure => 'directory',
		owner  => 'root',
		group  => 'root',
		mode   => '0755',
	}
	
	file { "/opt/myssl/${domain}/request.cnf":
		ensure  => file,
		content => template('blue-web-srv/request.cnf.erb'),
	}
	
	apache::vhost { "${domain}_non-ssl":
		servername => $domain,
		serveraliases => $alias,
		serveradmin => 'root@haeutle-it.de',
		port       => '80',
		ip_based   => true,
		docroot    => "/var/httpd/${domain}",
		docroot_owner => 'www-data',
		docroot_group => 'www-data',
		redirect_status => 'permanent',
		rewrite_cond => '%{HTTPS} off',
		rewrite_rule => '(.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]',
	}
	apache::vhost { "${domain}_ssl":
		servername => $domain,
		serveraliases => $alias,
		serveradmin => 'root@haeutle-it.de',
		port       => '443',
		ip_based   => true,
		docroot    => "/var/httpd/${domain}",
		docroot_owner => 'www-data',
		docroot_group => 'www-data',
		ssl     => true,
		ssl_cert => '/opt/myssl/fullchain.pem',
		ssl_key  => '/opt/myssl/privkey.pem',
		ssl_openssl_conf_cmd => 'DHParameters "/opt/myssl/dhparam.pem"',
		ssl_stapling_timeout => '5',
		ssl_stapling_return_errors => false,
		directories  => [
			{ path           =>  "/var/www/${domain}",
			allow_override => ['all'],
			},
		],
		headers => [
			'always set Strict-Transport-Security: "max-age=31536001; includeSubDomains"',
			'always set X-Content-Type-Options nosniff',
			'edit Set-Cookie ^(.*)$ $1;HttpOnly;Secure',
			'set X-XSS-Protection "1; mode=block"',
			'append X-Frame-Options "SAMEORIGIN"',
			'set X-Content-Security-Policy "default-src https:"',
			'set Public-Key-Pins "pin-sha256=\"XXXXX=\"; max-age=100800; includeSubDomains"'
			],
	}

}

und schließlich noch eine Datenbank für das mysql.

Dieses Setup reicht für ein A+ Rantig auf SSLlabs und immerhin ein B Ranting bei observatory.mozilla.org