Spaces. Smartes Cloud Hosting für anspruchsvolle Webprojekte. Loslegen und Spaces testen. Von Mittwald.
Andreas Hecht 5. September 2018

WordPress-Snippets: Die 26 besten Code-Schnipsel für deine Website

WordPress wird erst so rich­tig gut durch die Plugins, denn damit kannst du dei­ne Website genau auf dei­ne Bedürfnisse aus­rich­ten. Viele Funktionen las­sen sich jedoch auch ohne den Einsatz eines Plugins ein­bau­en. Ein ein­fa­ches Snippet reicht. Sich die benö­tig­ten Snippets zusam­men­zu­su­chen kann jedoch ziem­lich müh­sam sein.

Daher öff­ne ich heu­te mei­nen Werkzeugkoffer und lis­te mei­ne liebs­ten und nütz­lichs­ten Snippets für WordPress für dich auf.

Kompatibilität:

  • WordPress Version ab 4.6
  • PHP-Version 7.xx

Die Snippets kopierst du ent­we­der in die functions.php dei­nes akti­ven Themes oder legst dir ein sei­ten­spe­zi­fi­sches Plugin für die­sen Job an.

Bitte beach­ten: Mache dir vor jeder Änderung an der functions.php ein Backup der Datei. Ändere die Datei nicht über den Editor von WordPress. Geht etwas schief, hast du kei­nen Zugriff mehr auf dei­ne Website. Führe dei­ne Ergänzungen über einen FTP-Zugriff direkt auf dei­nem Webhosting durch.

Ich bit­te zu beach­ten, dass der öff­nen­de <?php Tag nicht mit kopiert wird.

1 – Inline-Styles der WordPress Tag Cloud entfernen

Die WordPress Tag Cloud ist ein gern genutz­tes Instrument für die Sidebar eines Blogs. Mit ihrer Hilfe kön­nen dei­ne Besucher schnel­ler fin­den, wonach sie suchen. Allerdings stellt WordPress die Tags unter­schied­lich groß dar, was nicht immer eine gewünsch­te Eigenschaft ist. Mit die­sem Snippet ent­fernst du die Inline-Styles.

<?php

/**
 * Remove style from Tag Clouds
 * @author Andreas Hecht
 */
function drweb_remove_tagcloud_inline_style($input){ 
    return preg_replace('/ style=("|\')(.*?)("|\')/','',$input); 
}
add_filter('wp_generate_tag_cloud', 'drweb_remove_tagcloud_inline_style',10,1); 

2 – Schalte eigene Pingbacks ab

Pingbacks und Trackbacks sind kei­ne schlech­ten Funktionen, erzäh­len sie dir doch, ob dei­ne Artikel auf ande­ren Websites erwähnt oder ver­linkt wur­den. Leider hat WordPress die dum­me Eigenschaft dich auch über Verlinkungen dei­ner Artikel auf dei­ner eige­nen Website zu infor­mie­ren. So schal­test du die­se ner­vi­gen Nachrichten ab.

<?php

/**
 * Disable self pingbacks
 * 
 */
function evolution_no_self_ping( &$links ) {
    $home = get_option( 'home' );
    foreach ( $links as $l => $link )
        if ( 0 === strpos( $link, $home ) )
            unset($links[$l]);
}

add_action( 'pre_ping', 'evolution_no_self_ping' );

3 – WordPress Emojis abschalten

Die bun­ten Emojis sind nicht jeder­manns Sache. Solltest du in dei­nen Beiträgen kei­ne Emojis ver­wen­den wol­len, so kannst du die­se Funktion kom­plett abschal­ten. Die Performance dei­nes Blogs wird es dir dan­ken.

<?php

/**
* Disable the emoji's
*/
function disable_emojis() {
    remove_action( 'wp_head', 'print_emoji_detection_script', 7 );
    remove_action( 'admin_print_scripts', 'print_emoji_detection_script' );
    remove_action( 'wp_print_styles', 'print_emoji_styles' );
    remove_action( 'admin_print_styles', 'print_emoji_styles' ); 
    remove_filter( 'the_content_feed', 'wp_staticize_emoji' );
    remove_filter( 'comment_text_rss', 'wp_staticize_emoji' ); 
    remove_filter( 'wp_mail', 'wp_staticize_emoji_for_email' );
    add_filter( 'tiny_mce_plugins', 'disable_emojis_tinymce' );
    add_filter( 'wp_resource_hints', 'disable_emojis_remove_dns_prefetch', 10, 2 );
}
add_action( 'init', 'disable_emojis' );

/**
* Filter function used to remove the tinymce emoji plugin.
* 
* @param array $plugins 
* @return array Difference betwen the two arrays
*/
function disable_emojis_tinymce( $plugins ) {
    if ( is_array( $plugins ) ) {
        return array_diff( $plugins, array( 'wpemoji' ) );
    } else {
        return array();
    }
}

/**
* Remove emoji CDN hostname from DNS prefetching hints.
*
* @param array $urls URLs to print for resource hints.
* @param string $relation_type The relation type the URLs are printed for.
* @return array Difference betwen the two arrays.
*/
function disable_emojis_remove_dns_prefetch( $urls, $relation_type ) {
    if ( 'dns-prefetch' == $relation_type ) {
        /** This filter is documented in wp-includes/formatting.php */
        $emoji_svg_url = apply_filters( 'emoji_svg_url', 'https://s.w.org/images/core/emoji/2/svg/' );

        $urls = array_diff( $urls, array( $emoji_svg_url ) );
    }

    return $urls;
}

4 – Schalte das jQuery Migrate Script ab

jQuery Migrate ist ein Script, das für eine Abwärtskompatibilität älte­rer jQuery-Anwendungen sor­gen soll. Die »nor­ma­le« und moder­ne jQuery Version unter­stützt nicht mehr alle alten Anwendungen. Dieser Fall wird mit Sicherheit nicht mehr als 5% aller WordPress-Websites betref­fen, und doch wird das nicht gera­de klei­ne Script stan­dard­mä­ßig von WordPress gela­den. So schal­test du es ganz ein­fach ab:

<?php

/**
* Dequeue jQuery Migrate Script in WordPress.
*/
if ( ! function_exists( 'evolution_remove_jquery_migrate' ) ) :

function evolution_remove_jquery_migrate( &$scripts) {
    if(!is_admin()) {
        $scripts->remove( 'jquery');
        $scripts->add( 'jquery', false, array( 'jquery-core' ), '1.12.4' );
    }
}
add_filter( 'wp_default_scripts', 'evolution_remove_jquery_migrate' );
endif;

5 – WordPress oEmbed Funktion abschalten

Die WordPress-Version 4.4 brach­te die neue Funktion oEmbed mit sich, die in ers­ter Linie dazu gedacht ist, frem­de Artikel oder Seiten mit­tels eines ein­fa­chen Links in Beiträge ein­bet­ten zu kön­nen. Wenn du die­se Funktion nicht benö­tigst oder es dir ein­fach unwohl dabei ist, dass dei­ne Artikel jeder­zeit in frem­den Artikel dar­ge­stellt wer­den kön­nen, dann deak­ti­vie­re die­se Funktion ein­fach.

<?php
/**
 * Disable embeds on init.
 *
 * - Removes the needed query vars.
 * - Disables oEmbed discovery.
 * - Completely removes the related JavaScript.
 *
 * @since 1.0.0
 */
function evolution_disable_embeds_init() {
    /* @var WP $wp */
    global $wp;

    // Remove the embed query var.
    $wp->public_query_vars = array_diff( $wp->public_query_vars, array(
        'embed',
    ) );

    // Remove the REST API endpoint.
    remove_action( 'rest_api_init', 'wp_oembed_register_route' );

    // Turn off oEmbed auto discovery.
    add_filter( 'embed_oembed_discover', '__return_false' );

    // Don't filter oEmbed results.
    remove_filter( 'oembed_dataparse', 'wp_filter_oembed_result', 10 );

    // Remove oEmbed discovery links.
    remove_action( 'wp_head', 'wp_oembed_add_discovery_links' );

    // Remove oEmbed-specific JavaScript from the front-end and back-end.
    remove_action( 'wp_head', 'wp_oembed_add_host_js' );
    add_filter( 'tiny_mce_plugins', 'evolution_disable_embeds_tiny_mce_plugin' );

    // Remove all embeds rewrite rules.
    add_filter( 'rewrite_rules_array', 'disable_embeds_rewrites' );

    // Remove filter of the oEmbed result before any HTTP requests are made.
    remove_filter( 'pre_oembed_result', 'wp_filter_pre_oembed_result', 10 );
}

add_action( 'init', 'evolution_disable_embeds_init', 9999 );

/**
 * Removes the 'wpembed' TinyMCE plugin.
 *
 * @since 1.0.0
 *
 * @param array $plugins List of TinyMCE plugins.
 * @return array The modified list.
 */
function evolution_disable_embeds_tiny_mce_plugin( $plugins ) {
    return array_diff( $plugins, array( 'wpembed' ) );
}

/**
 * Remove all rewrite rules related to embeds.
 *
 * @since 1.0.0
 *
 * @param array $rules WordPress rewrite rules.
 * @return array Rewrite rules without embeds rules.
 */
function evolution_disable_embeds_rewrites( $rules ) {
    foreach ( $rules as $rule => $rewrite ) {
        if ( false !== strpos( $rewrite, 'embed=true' ) ) {
            unset( $rules[ $rule ] );
        }
    }

    return $rules;
}

/**
 * Remove embeds rewrite rules on plugin activation.
 *
 * @since 1.0.0
 */
function evolution_disable_embeds_remove_rewrite_rules() {
    add_filter( 'rewrite_rules_array', 'disable_embeds_rewrites' );
    flush_rewrite_rules( false );
}

register_activation_hook( __FILE__, 'evolution_disable_embeds_remove_rewrite_rules' );

/**
 * Flush rewrite rules on plugin deactivation.
 *
 * @since 1.0.0
 */
function evolution_disable_embeds_flush_rewrite_rules() {
    remove_filter( 'rewrite_rules_array', 'disable_embeds_rewrites' );
    flush_rewrite_rules( false );
}

register_deactivation_hook( __FILE__, 'evolution_disable_embeds_flush_rewrite_rules' );

6 – Befreie den WordPress-Header von unnötigen Einträgen

WordPress lädt eine Menge Sachen über den wp_head() Hook in den Header der WordPress Themes. Einiges davon ist sehr nütz­lich, ande­res hin­ge­gen weni­ger. Manches bläht die Website ein­fach nur unnö­tig auf. Hier kommt ein klei­nes Snippet, dass mal kräf­tig auf­räumt.

<?php

/**
 * Befreit den Header von unnötigen Einträgen
 */ 
add_action('init', 'evolution_remheadlink');
function evolution_remheadlink()
{
    remove_action('wp_head', 'rsd_link');
    remove_action('wp_head', 'wp_generator');
    remove_action('wp_head', 'index_rel_link');
    remove_action('wp_head', 'wlwmanifest_link');
    remove_action('wp_head', 'feed_links', 2);
    remove_action('wp_head', 'feed_links_extra', 3);
    remove_action('wp_head', 'parent_post_rel_link', 10, 0);
    remove_action('wp_head', 'start_post_rel_link', 10, 0);
    remove_action('wp_head', 'wp_shortlink_wp_head', 10, 0);
    remove_action('wp_head', 'wp_shortlink_header', 10, 0);
    remove_action('wp_head', 'adjacent_posts_rel_link_wp_head', 10, 0);
}

7 – Sorge für Beitragsbilder auch im RSS-Feed

Standardmäßig fügt WordPress in den RSS-Feed kei­ne Beitragsbilder mit ein. So kannst du das ändern.

<?php

/**
 * Füge Beitragsbilder in den RSS-Feed ein
 */
function evolution_featuredtoRSS($content) {
global $post;
if ( has_post_thumbnail( $post->ID ) ){
$content = '<div>' . get_the_post_thumbnail( $post->ID, 'large', array( 'style' => 'margin-bottom: 15px;' ) ) . '</div>' . $content;
}
return $content;
}
 
add_filter('the_excerpt_rss', 'evolution_featuredtoRSS');
add_filter('the_content_feed', 'evolution_featuredtoRSS');

8 – Zusätzliche Dateiformate für die Mediathek erlauben

Du willst spe­zi­el­le Dateiformate in Deine WordPress-Mediathek hoch­la­den und bekommst eine Fehlermeldung? Dann nut­ze die­sen Code, und Dein Problem ist gelöst. Der Code erlaubt das Hochladen der Dateiformate ZIPMOBIPDF und EPUB. Solltest Du wei­te­re Formate benö­ti­gen, dann fin­dest Du hier die voll­stän­di­ge Liste der MIME-Types.

<?php

/**
 * Füge weitere Mime Types für den Download der Produkte hinzu
 */
function add_custom_mime_types($mimes){

 $new_file_types = array (
 'zip' => 'application/zip',
 'mobi' => 'application/x-mobipocket-ebook',
 'pdf' => 'application/pdf',
 'epub' => 'application/epub+zip'
 );

 return array_merge($mimes,$new_file_types);
}
add_filter('upload_mimes','add_custom_mime_types');

9 – Die Länge des Excerpt beliebig festlegen

Manchmal braucht man für ein spe­zi­el­les Template eine ganz spe­zi­el­le Länge des Excerpts. Mit der fol­gen­den Funktion lässt sich die­se Länge belie­big fest­le­gen. Das Gute ist, das die Excerpt-Länge dabei nicht glo­bal fest­ge­legt wird, son­dern das jedes Template sei­ne eige­ne Länge haben kann.

<?php

/**
 * Custom Excerpt Lenght
 * 
 */ 
the_excerpt_max_charlength(190);

function the_excerpt_max_charlength($charlength) {
	$excerpt = get_the_excerpt();
	$charlength++;

	if ( mb_strlen( $excerpt ) > $charlength ) {
		$subex = mb_substr( $excerpt, 0, $charlength - 5 );
		$exwords = explode( ' ', $subex );
		$excut = - ( mb_strlen( $exwords[ count( $exwords ) - 1 ] ) );
		if ( $excut < 0 ) {
			echo mb_substr( $subex, 0, $excut );
		} else {
			echo $subex;
		}
		echo '...';
	} else {
		echo $excerpt;
	}
}

Im Template tauscht du dann ein­fach die Tags gegen­ein­an­der aus und bestimmst die Länge des Excerpts:

// Den Original Tag löschen:
<?php the_excerpt(); ?>

// Gegen diesen Tag austauschen und beliebige Länge eingeben (in Klammer):
<?php the_excerpt_max_charlength( 250 ); ?>

10 – Responsive Videos – Youtube und Vimeo

Wenn dein Theme kei­ne respon­si­ven Videos unter­stützt, dann kannst du den Support dafür schnell selbst fest­le­gen. Eine PHP-Funktion sorgt für eine auto­ma­ti­sche Einbettung in ein Div, die CSS-Angaben sor­gen für die opti­ma­le Skalierung bei jeder Auflösung.

<?php

/**
 * Responsive Videos, Youtube and Vimeo
 * 
 */
function evolution_wrap_oembed( $html ){
    $html = preg_replace( '/(width|height)="\d*"\s/', "", $html ); // Strip width and height #1

    return'<div class="embed-responsive embed-responsive-16by9">'.$html.'</div>'; // Wrap in div element and return #3 and #4

}
add_filter( 'embed_oembed_html','evolution_wrap_oembed',10,1);

Das nöti­ge CSS:

.embed-responsive.embed-responsive-16by9 {
    position: relative;
    padding-bottom: 56.25%; /* 16:9 */
    padding-top: 25px;
    height: 0;
}
.embed-responsive.embed-responsive-16by9 iframe {
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
}
/* Diese Angabe macht HTML5 Videos responsive */
video {
    width: 100% !important;
    height: auto !important;
}

11 – WordPress Pagination ohne Plugin erstellen

Du möch­test die alten »Ältere Beiträge | Neuere Beiträge« Links mit einer coo­len Nummernliste erset­zen? Kein Problem, den seit der WordPress-Version 4.1 benö­tigst du dafür das bekann­te Plugin WP-PageNavi nicht mehr. Jetzt geht das ganz ein­fach mit Bordmitteln.

Du kannst die­se Funktion direkt in der index.php und in der archive.php ein­set­zen. Allerdings ist es vor­teil­haft, dafür ein Child-Theme zu erstel­len.

<?php the_posts_pagination( array(
 'mid_size' => 3, //Wie viel Buttons werden angezeigt, bevor der Platzhalter »...« erscheint.
 'type' => 'list', // Anzeige als Liste
 'prev_text' => __( '« Neuer', 'textdomain' ),
 'next_text' => __( 'Älter »', 'textdomain' ),
 ) ); ?>

Damit die Liste ein Design bekommt, benö­tigt es noch etwas CSS. Hier die Styles, die ich ab und an nut­ze. Du musst es noch auf dei­ne Blog-Farben anpas­sen:

nav.pagination{position:relative;display:block;margin-top:20px}
.page-numbers{margin:0;padding:0}
.page-numbers li{list-style:none;margin:0 6px 0 0;padding:0;display:inline-block}
.page-numbers li span.current{padding:10px 15px;background:#9FC65D;border:1px solid #9FC65D;display:block;line-height:1;color:#fff}
.page-numbers li a{padding:10px 15px;background:#eee;color:#555;text-decoration:none;border:1px solid #eee;display:block;line-height:1}
.page-numbers li a:hover{background:#9FC65D;border-color:#9FC65D;color:#fff}
.screen-reader-text {
 clip: rect(1px,1px,1px,1px);
 position: absolute!important;
 height: 1px;
 width: 1px;
 overflow: hidden;
}

12 – Eigenes Login-Logo mit eigener Hintergrundfarbe

Du bist so rich­tig stolz auf dei­ne WordPress-Website und hast viel Arbeit in das Design inves­tiert? Dann gehe noch einen Schritt wei­ter und pas­se auch gleich das Logo auf der Login-Seite an. Zusammen mit einer eige­nen Hintergrundfarbe sieht das schon rich­tig gut aus.

<?php

/**
 * Ein neues Logo für den Adminbereich und eine eigene Hintergrundfarbe
 * @author Andreas Hecht
 */
function ah_login_logo() { 
?>
 <style type="text/css">
 #login h1 a, .login h1 a {
 background-image: url(<?php echo get_stylesheet_directory_uri(); ?>/images/dein-logo.png);
 margin-bottom: 0;
 background-size: 180px;
 height: 180px;
 width: 180px;
 margin-left: auto;
 margin-right: auto;
 border-radius: 50%;
 }
 body.login {background-color: #0073bf;} .login #backtoblog a, .login #nav a {color: #fff !important}
 </style>
<?php }
add_action( 'login_enqueue_scripts', 'ah_login_logo' );

13 – Gestalte den ersten Absatz anders

So rich­tig cool sieht ein Beitrag erst aus, wenn der ers­te Absatz in einer ande­ren Farbe und Schriftart gestal­tet ist. Dafür musst du nicht jedes­mal in den Text-Bereich dei­nes Editors wech­seln, den Job kann WordPress auto­ma­tisch für dich erle­di­gen. Zwei Snippets und die Magie ist per­fekt:

<?php

/**
 * Auto-Highlighting - Automatisches Highlighten des ersten Absatzes eines Beitrags
 * @author Andreas Hecht
 */
function tb_first_paragraph_highlight( $content ) {
    return preg_replace( '/<p([^>]+)?>/', '<p$1 class="opener">', $content, 1 );
}
add_filter( 'the_content', 'tb_first_paragraph_highlight' );

Der obi­ge Code ver­passt nun jedem ers­ten Absatz eines Artikels oder einer Seite die Klasse .opener. Mit etwas CSS steu­erst du nun nicht nur die Formatierung des Absatzes, son­dern auch den »Ort« des Geschehens.

/* Nur einzelne Beitraege bekommen das Design */
.single p.opener {
    color: #165a72;
    font-weight: 400;
    font-size: 21px;
    line-height: 1.5;
}

Oder Beiträge und Seiten stel­len den ers­ten Absatz anders dar:

/* Einzelne Beitraege und Seiten werden designed */
.single p.opener, .page p.opener {
    color: #165a72;
    font-weight: 400;
    font-size: 21px;
    line-height: 1.5;
}

14 – Benutzeranmeldung nur mit E-Mail und Passwort

Seit der WordPress Version 4.5 ist eine Benutzeranmeldung auch mit einer E-Mail-Adresse und dem Passwort mög­lich. Um Hacker zu ärgern und WordPress ein biss­chen siche­rer zu machen, kannst Du Dich mit die­sem Code aus­schließ­lich mit E-Mail und Passwort anmel­den.

<?php

// Ab hier kopieren
//WordPress Authentifikation löschen
remove_filter('authenticate', 'wp_authenticate_username_password', 20);

// Neue Authentifikation setzen - Anmelden nur mit E-Mail und Passwort
add_filter('authenticate', function($user, $email, $password){
 
    //Check for empty fields
        if(empty($email) || empty ($password)){        
            //create new error object and add errors to it.
            $error = new WP_Error();
 
            if(empty($email)){ //No email
                $error->add('empty_username', __('<strong>ERROR</strong>: Email field is empty.'));
            }
            else if(!filter_var($email, FILTER_VALIDATE_EMAIL)){ //Invalid Email
                $error->add('invalid_username', __('<strong>ERROR</strong>: Email is invalid.'));
            }
 
            if(empty($password)){ //No password
                $error->add('empty_password', __('<strong>ERROR</strong>: Password field is empty.'));
            }
 
            return $error;
        }
 
        //Check if user exists in WordPress database
        $user = get_user_by('email', $email);
 
        //bad email
        if(!$user){
            $error = new WP_Error();
            $error->add('invalid', __('<strong>ERROR</strong>: Either the email or password you entered is invalid.'));
            return $error;
        }
        else{ //check password
            if(!wp_check_password($password, $user->user_pass, $user->ID)){ //bad password
                $error = new WP_Error();
                $error->add('invalid', __('<strong>ERROR</strong>: Either the email or password you entered is invalid.'));
                return $error;
            }else{
                return $user; //passed
            }
        }
}, 20, 3);

15 – Hindere User daran, ihre Passwörter zu ändern

Der Administrationsbereich von WordPress ist das Herz und die Lunge dei­ner Website. Sorge stets dafür, dass die ver­ge­be­nen Passwörter sehr stark sind, damit Angriffe kei­ne Chance haben. User jedoch ändern die ver­ge­be­nen Passwörter sehr gern in sehr leicht zu mer­ken­de und damit zu kna­cken­de Varianten. Das kannst du erfolg­reich ver­hin­dern!

<?php

/**
 *
 * User davon abhalten, ihre Passwörter zu ändern
 * 
 */ 
class Password_Reset_Removed
{

  function __construct() 
  {
    add_filter( 'show_password_fields', array( $this, 'disable' ) );
    add_filter( 'allow_password_reset', array( $this, 'disable' ) );
  }

  function disable() 
  {
    if ( is_admin() ) {
      $userdata = wp_get_current_user();
      $user = new WP_User($userdata->ID);
      if ( !empty( $user->roles ) && is_array( $user->roles ) && $user->roles[0] == 'administrator' )
        return true;
    }
    return false;
  }

}

$pass_reset_removed = new Password_Reset_Removed();

16 – Werbung nach dem xx Absatz einblenden

Wenn Du mit Deinem Blog Geld ver­die­nen möch­test, dann kommst Du um den Einsatz von Werbung nicht her­um. Du kannst dafür zum Beispiel das belieb­te Google Adsense ver­wen­den. Dieses Snippet blen­det dei­ne Werbeblöcke nach dem von dir fest­ge­leg­ten Absatz ein.

<?php
/**
 * Werbeblock nach dem zweiten Absatz einfuegen
 * 
 */ 
add_filter( 'the_content', 'tb_insert_post_ads' );

function tb_insert_post_ads( $content ) {
	
	$ad_code = 'Hier kommt der Werbe-Code hinein. Entweder statische Werbung oder auch Google Adsense.';

	if ( is_single() && ! is_admin() ) {
        // Die Zahl vor Content bestimmt, wo der Code erscheint. Hier nach dem zweiten Absatz eines Artikels.
		return tb_insert_after_paragraph( $ad_code, 2, $content );
	}
	
	return $content;
}
 
// Parent Function that makes the magic happen
 
function tb_insert_after_paragraph( $insertion, $paragraph_id, $content ) {
	$closing_p = '</p>';
	$paragraphs = explode( $closing_p, $content );
	foreach ($paragraphs as $index => $paragraph) {

		if ( trim( $paragraph ) ) {
			$paragraphs[$index] .= $closing_p;
		}

		if ( $paragraph_id == $index + 1 ) {
			$paragraphs[$index] .= $insertion;
		}
	}
	
	return implode( '', $paragraphs );
}

17 – Dein Benutzer-Profil um weitere Social Media Accounts erweitern

Die bio­gra­fi­schen Angaben in Deinem WordPress Profil sind recht mager aus­ge­stat­tet. Viele Möglichkeiten hast du nicht, um all dei­ne Sozialen Netzwerke zu ver­lin­ken. Mit die­sem Code kannst du jeden dei­ner Social Media-Accounts hin­zu­fü­gen und schnell im Theme anzei­gen.

<?php

/**
 * Managing contact fields for author bio
 */
$evolution_pro_Contactfields = new evolution_pro_Contactfields(
// Fehlende Accounts kannst du leicht ergänzen
       array (
	'Feed',
	'Twitter',
        'Facebook',
        'GooglePlus',
        'Flickr',
        'Xing',
        'Github',
        'Instagram',
        'LinkedIn',
        'Pinterest',
        'Vimeo',
        'Youtube'
	)
);

class evolution_pro_Contactfields {
	public
		$new_fields
	,	$active_fields
	,	$replace
	;

	/**
	 * @param array $fields New fields: array ('Twitter', 'Facebook')
	 * @param bool $replace Replace default fields?
	 */
	public function __construct($fields, $replace = TRUE)
	{
		foreach ( $fields as $field )
		{
			$this->new_fields[ mb_strtolower($field, 'utf-8') ] = $field;
		}

		$this->replace = (bool) $replace;

		add_filter('user_contactmethods', array( $this, 'add_fields' ) );
	}

	/**
	 * Changing contact fields
	 * @param  $original_fields Original WP fields
	 * @return array
	 */
	public function add_fields($original_fields)
	{
		if ( $this->replace )
		{
			$this->active_fields = $this->new_fields;
			return $this->new_fields;
		}

		$this->active_fields = array_merge($original_fields, $this->new_fields);
		return $this->active_fields;
	}

	/**
	 * Helper function
	 * @return array The currently active fields.
	 */
	public function get_active_fields()
	{
		return $this->active_fields;
	}
}

Mit dem fol­gen­den Tag kannst du die neu­en Felder im Theme anzei­gen:

<?php echo get_the_author_meta( 'facebook' ); ?>

18 – Kategorie-Liste mit RSS-Feeds anzeigen lassen

Manchmal kann es prak­tisch sein, sich alle Kategorien mit den dazu­ge­hö­ren­den RSS-Feed-Adressen anzei­gen las­sen zu kön­nen. Noch bes­ser wird es, wenn man einen WordPress-Shortcode nut­zen kann, um die Liste über­all – auch in den Text-Widgets – anzei­gen zu kön­nen.

<?php

function tb_categories_with_feed() { 
	$args = array(
		'orderby' => 'name',
		'feed' => 'RSS', 
		'echo' => false, 
		'title_li'     => '',
	); 
	$string .= '<ul>';
	$string .= wp_list_categories($args); 
	$string .= '</ul>'; 

	return $string; 

}

// add shortcode
add_shortcode('categories-feed', 'tb_categories_with_feed'); 

// Add filter to execute shortcodes in text widgets
add_filter('widget_text', 'do_shortcode');

Der Shortcode:

[categories-feed]

lässt Dich die List dort anzei­gen, wo du sie haben möch­test. Er funk­tio­niert auch inner­halb von Widgets.

In dei­nem Theme kannst du den Shortcode eben­falls ver­wen­den:

<?php echo do_shortcode("[categories-feed]"); ?>

19 – Related Posts ohne Plugin anzeigen

Die belieb­ten ähn­li­chen Beiträge las­sen sich ganz bequem auch ohne ein auf­ge­bläh­tes Plugin mit “vie­len” Funktionen anzei­gen. Du brauchst einen PHP-Schnipsel, ein Child-Theme und etwas CSS.

<?php

if ( ! function_exists( 'evolution_related_posts' ) ) :

function evolution_related_posts() {
    
global $post;
    
if($post) {
 $post_id = get_the_ID();
} else {
 $post_id = null;
}
$orig_post = $post;    
$categories = get_the_category($post->ID);
if ($categories) {
$category_ids = array();
foreach($categories as $individual_category) $category_ids[] = $individual_category->term_id;
$args=array(
'category__in' => $category_ids,
'post__not_in' => array($post->ID),
'posts_per_page'=> 3, // Number of related posts that will be shown.
'ignore_sticky_posts'=>1
);
$my_query = new wp_query( $args );
if( $my_query->have_posts() )  { 
echo '<div class="related-wrap">';    
echo '<h4 class="entry-related">';
_e('Related Posts','evolution');   
echo '</h4>';
echo '<div class="related-posts">';    
$c = 0; while( $my_query->have_posts() ) {
$my_query->the_post(); $c++; 
if( $c == 3) {
	$style = 'third';
	$c = 0;
}
else $style=''; ?>
<article class="entry-item <?php echo $style; ?>">                                         
<div class="entry-thumb">                                                  
<a href="<?php the_permalink($post->ID); ?>" title="<?php the_title(); ?>"><?php the_post_thumbnail( 'evolution-medium' ); ?></a>                            
    </div>                                          
<div class="content">
<?php if ( ! empty( $categories ) ) {
    echo '<span class="cat"><i class="icon-folder-open" aria-hidden="true"></i> <a href="' . esc_url( get_category_link( $categories[0]->term_id ) ) . '">' . esc_html( $categories[0]->name ) . '</a></span>';
} ?>
<header>
<h4 class="entry-title"><a href="<?php the_permalink($post->ID); ?>" title="<?php the_title(); ?>"><?php the_title(); ?></a></h4>
</header>
</div><!-- content -->
</article><!-- entry-item -->
<?php
}
echo '</div></div>';
echo '<div class="clear"></div>';    
}
}
$post = $orig_post;
wp_reset_postdata();    
}
endif;

Nachdem der Code in die functions.php kopiert wur­de, muss in der single.php oder dem Template, dass die Loop der ein­zel­nen Beiträge ent­hält, ein Tag ein­ge­fügt wer­den.

<?php evolution_related_posts(); ?>

Damit das Ganze dann schick aus­sieht, benö­tigst du noch etwas CSS:

.related-posts {
    display: flex;
}
.related-posts .entry-title {
    font-size: 1rem;
}
.related-posts .cat {
    color: #ba9e30;
    font-size: 0.85rem;
}
.related-posts .entry-item {
    width: 31%;
    margin-right: 3.5%;
    position: relative;
    float: left;
}
.related-posts .entry-item.third {
    margin-right: 0;
}
.related-posts a img:hover {
    opacity: .85;
}
.entry-related {
    padding-bottom: 10px;
    border-bottom: 1px solid #ddd;
    margin-bottom: 20px
}
.related-wrap {
    margin-bottom: 70px;
}

20 – Eine sitemap.xml ohne Plugin erstellen

Die sitemap.xml sorgt in Verbindung mit der Google Search Console (ehe­mals Webmaster Tools) für eine schnel­le Indexierung der Beiträge dei­ner Website. Bisher muss­test du ein Plugin instal­lie­ren, um eine sitemap.xml zu gene­rie­ren. Mit die­sem Code kannst du dir das Plugin spa­ren.

Die Sitemap wird für dei­ne Beiträge, die Seiten und die Bilder der Mediathek erstellt.

<?php

// Ab hier kopieren
/**
 * Eine eigene sitemap.xml ohne Plugin erstellen
 * @author Andreas Hecht
 */
function ah_create_sitemap() {
  $sitemap_posts = get_posts(array(
    'numberposts' => -1,
    'orderby' => 'modified',
    'post_type'  => array('post','page', 'attachment'), // Deine Custom Post Types hier einfügen (z.B. Portfolio)
    'order'    => 'DESC'
  ));

  $sitemap = '<?xml version="1.0" encoding="UTF-8"?>';
  $sitemap .= '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">';

  foreach($sitemap_posts as $post) {
    setup_postdata($post);

    $postdate = explode(" ", $post->post_modified);

  	$sitemap .= '<url>'.
      '<loc>'. get_permalink($post->ID) .'</loc>'.
      '<lastmod>'. $postdate[0] .'</lastmod>'.
      '<changefreq>monthly</changefreq>'.
    '</url>';
  }
  $sitemap .= '</urlset>';

  $fp = fopen(ABSPATH . "sitemap.xml", 'w');
  fwrite($fp, $sitemap);
  fclose($fp);
}
add_action('publish_post', 'ah_create_sitemap');
add_action('publish_page', 'ah_create_sitemap');

21 – Mache ein Beitragsbild erforderlich

Für Blogs mit meh­re­ren Autoren kann das fol­gen­de Snippet Gold wert sein, denn es macht die Vergabe eines Beitragsbilds erfor­der­lich, um einen Artikel ver­öf­fent­li­chen zu kön­nen.

<?php

add_action('save_post', 'evolution_check_thumbnail');
add_action('admin_notices', 'evolution_thumbnail_error');

function evolution_check_thumbnail($post_id) {
    // change to any custom post type
    if(get_post_type($post_id) != 'post')
        return;
    if ( !has_post_thumbnail( $post_id ) ) {
        // set a transient to show the users an admin message
        set_transient( "has_post_thumbnail", "no" );
        // unhook this function so it doesn't loop infinitely
        remove_action('save_post', 'evolution_check_thumbnail');
        // update the post set it to draft
        wp_update_post(array('ID' => $post_id, 'post_status' => 'draft'));
        add_action('save_post', 'evolution_check_thumbnail');
    } else {
        delete_transient( "has_post_thumbnail" );
    }
}
function evolution_thumbnail_error()
{
    // check if the transient is set, and display the error message
    if ( get_transient( "has_post_thumbnail" ) == "no" ) {
        echo "<div id='message' class='error'><p><strong>Du musst ein Beitragsbild vergeben. Ohne Beitragsbild kann dieser Artikel nicht veröffentlicht werden.</strong></p></div>";
        delete_transient( "has_post_thumbnail" );
    }
}

22 – Automatische Verlinkung von Twitter-Accounts

Wenn du öfters Twitter-Accounts in dei­nen Beiträgen ver­linkst, dann wirst du die­ses Snippet lie­ben. Denn es ver­linkt bei einer Eingabe von @account auto­ma­tisch auf den jewei­li­gen Twitter-Account.

<?php

function content_twitter_mention($content) {
	return preg_replace('/([^a-zA-Z0-9-_&])@([0-9a-zA-Z_]+)/', "$1<a href=\"http://twitter.com/$2\" target=\"_blank\" rel=\"nofollow\">@$2</a>", $content);
}

add_filter('the_content', 'content_twitter_mention');   
add_filter('comment_text', 'content_twitter_mention');

23 – Automatische Verlinkung in User-Kommentaren verhindern

Jede in die Kommentare ein­ge­füg­te URL wird von WordPress auto­ma­tisch mit einem Link umge­ben. Das kann durch­aus zu einem Problem wer­den, denn nicht immer sind es die­se Links auch wert, von dei­nem Blog ver­linkt zu wer­den. Das fol­gen­de Snippet macht aus den URLs rei­nen Text.

<?php

remove_filter('comment_text', 'make_clickable', 9);

24 – Das komplette JavaScript in den Footer laden

WordPress lädt das JavaScript nor­ma­ler­wei­se in den Header dei­ner Website. Dadurch ver­lang­samt sich der Seitenaufbau unge­mein. Mit die­sem Code wird das JavaScript kom­plett im Footer der Website gela­den, damit sich die Seite schnel­ler auf­baut.

<?php

/**
 * @uses wp_head() and wp_enqueue_scripts()
 * 
 */
if ( !function_exists( 'evolution_footer_scripts' ) ) {
    
    function evolution_footer_scripts() { 

	   remove_action('wp_head', 'wp_print_scripts'); 
	   remove_action('wp_head', 'wp_print_head_scripts', 9); 
	   remove_action('wp_head', 'wp_enqueue_scripts', 1); 
    } 
}
add_action( 'wp_enqueue_scripts', 'evolution_footer_scripts' );

25 – Eine Breadcrumb-Navigation ohne Plugin erstellen

Für eine Breadcrumb-Navigation benö­tigst du kein über­la­de­nes Plugin. Einige Zeilen Code rei­chen voll­kom­men aus.

<?php
// Ab hier kopieren

function ah_the_breadcrumb() {
                echo '<ul id="crumbs">';
        if (!is_home()) {
                echo '<li><a href="';
                echo get_option('home');
                echo '">';
                echo 'Home';
                echo "</a></li>";
                if (is_category() || is_single()) {
                        echo '<li>';
                        the_category(' </li><li> ');
                        if (is_single()) {
                                echo "</li><li>";
                                the_title();
                                echo '</li>';
                        }
                } elseif (is_page()) {
                        echo '<li>';
                        echo the_title();
                        echo '</li>';
                }
        }
        elseif (is_tag()) {single_tag_title();}
        elseif (is_day()) {echo"<li>Archive for "; the_time('F jS, Y'); echo'</li>';}
        elseif (is_month()) {echo"<li>Archive for "; the_time('F, Y'); echo'</li>';}
        elseif (is_year()) {echo"<li>Archive for "; the_time('Y'); echo'</li>';}
        elseif (is_author()) {echo"<li>Author Archive"; echo'</li>';}
        elseif (isset($_GET['paged']) && !empty($_GET['paged'])) {echo "<li>Blog Archives"; echo'</li>';}
        elseif (is_search()) {echo"<li>Search Results"; echo'</li>';}
        echo '</ul>';
}

Der Tag zum Aufruf im Theme

Im Theme kann die Navigation mit­tels eines ein­fa­chen Funktionsaufrufes inte­griert wer­den. Die rich­ti­gen Dateien dafür wären je nach Theme die header.php, die index.php und die single.php usw.

<?php ah_the_breadcrumb(); ?>

26 – Anzeige von Custom Post Types in den Kategorien und Tags

Custom Post Types sind ein extrem nütz­li­ches Werkzeug für die Gestaltung einer umfang­rei­chen Website mit vie­len Funktionen. Allerdings wer­den sie von WordPress nicht auto­ma­tisch in die Kategorien und Tags über­nom­men. Startest du eine Suche, so wirst du immer einen Fehler zurück­er­hal­ten. Mit die­sen bei­den Snippets inte­grierst du dei­ne Custom Post Types in die WordPress-Suchfunktion.

Das Snippet für die Kategorien:

<?php

/**
 * Sorgt für die Anzeige der Custom Post Types in den Kategorien
 * @author Andreas Hecht
 */
function evolution_query_post_type($query) {
  if( is_category() ) {
    $post_type = get_query_var('post_type');
    if($post_type)
        $post_type = $post_type;
    else
        // Deine Post Types hinzufügen
        $post_type = array('nav_menu_item', 'post', 'posttype', 'posttype'); // don't forget nav_menu_item to allow menus to work!
    $query->set('post_type',$post_type);
    return $query;
    }
}
add_filter('pre_get_posts', 'evolution_query_post_type');

Das Snippet für die Tags:

<?php

/**
 * Sorgt für die Anzeige der Custom Post Types in den Tags
 * @author Andreas Hecht
 */
function evolution_tag_query_post_type($query) {
  if( is_tag() ) {
    $post_type = get_query_var('post_type');
    if($post_type)
        $post_type = $post_type;
    else
        // Deine Post Types hinzufügen
        $post_type = array('nav_menu_item', 'post', 'posttype', 'posttype'); // don't forget nav_menu_item to allow menus to work!
    $query->set('post_type',$post_type);
    return $query;
    }
}
add_filter('pre_get_posts', 'evolution_tag_query_post_type');

Fazit

Ich hof­fe, dass du eini­ge nütz­li­che Code-Schnipsel für dich und dein WordPress ent­de­cken konn­test. Morgen früh legen wir noch die nütz­lichs­ten WooCommerce-Snippets nach.

(Quelle Artikelkbild: Depositphotos)

Andreas Hecht

Andreas Hecht

entwickelt WordPress-Websites und bietet dir einen Website Sicherheit Service und einen Performance Service für deine Website. Außerdem ist er Spezialist für Onpage SEO und bringt Deine Website in die Top-Suchergebnisse von Google. Auf seinem Blog schreibt er über WordPress, SEO und Content SEO.

17 Kommentare

  1. Hallo, ich habe nach dei­ner Anleitung die Seitennavigation ein­ge­fügt. Das klappt auch jetzt ohne zusätz­li­ches Plugin aber die Navigation erscheint immer ganz unten auf der Seite und nicht nach den Beiträgen, egal an wel­cher Stelle ich den Code in die index.php ein­fü­ge. Ich ver­wen­de das Theme Zoom Lite.
    Gibts da eine Lösung?

    lg

  2. Super hilf­reich – eini­ges gleich aus­pro­biert! Danke für den tol­len Artikel!…8)

  3. Wow, da sind ja coo­le Snippets dabei. Danke für den gei­len Artikel!

  4. Das ist ja sehr hilf­reich. Vieles kann­te ich gar nicht. Danke!

  5. moin zusam­men,

    viel­leicht hat hier ja jemand einen tipp für mich. bei word­press führt der klick auf das »haupt­lo­go« bei einem the­me ja in der regel auf die start­sei­te. ich wür­de das gern ändern.

    kon­tret:

    auf­ruf: musterdomain.de =» Startseite
    klick auf logo =» Seite2

    hat da jemand einen tipp. vie­len dank schon mal im vor­aus.

    lg
    aus ham­burg

  6. Danke für die­se Fülle an Snippets, die fehl­ten mir schon sehr!

  7. Super hilf­reich! Danke für die­se Zusammenstellung, die ich mir gleich spei­cher­te!
    Ein Blogpost mit viel Nutzen für WordPress-Nutzer.

    Beste Grüße. Ralph

  8. Super. Vielen dank für die Liste. Sind span­nen­de dabei. Vor allem das mit der Werbung

  9. Vielen Dank. Da sind ein paar inter­es­san­te Snippets dabei.

  10. Vielen Dank für den hilf­rei­chen Artikel!

  11. Danke an Euch alle! Freut mich, das Ihr pro­fi­tie­ren könnt. Ein Klick auf die Teilen-Buttons wäre übri­gens ganz klas­se:-)

  12. Tolle Zusammenstellung, kom­pakt und auf deutsch – sel­ten im www. Daumen hoch.

  13. Vielen Dank, eine sehr inter­es­san­te Zusammenstellung.

  14. Danke für den Artikel. Was müss­te ich den ein­tra­gen, wenn die Autorenbox z.B. nicht auf Veranstaltungsseiten des Events Managers erschei­nen soll bzw. nur für ein­ge­logg­te Besucher sicht­bar sein soll? Ich habe die ein­zel­nen Veranstaltungsseiten zwar schon als Seiten und nicht als Beiträge aus­ge­ge­ben, aber die Autorenbox erscheint dort trotz­dem.

  15. Vielen Dank, Andreas. Da sind ein paar inter­es­san­te Snippets dabei.

  16. Super Artikel, dan­ke für die Zusammenfassung!

Schreibe einen Kommentar zu Christian Antworten abbrechen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.