Die 26 nützlichsten und funktionellsten WordPress-Snippets

Die 26 nützlichsten und funktionellsten WordPress-Snippets

Andreas Hecht

ist WordPress-Entwickler und bietet dir WordPress-Sicherheit für deine Website. Zudem entwickelt er...

WordPress wird erst so richtig gut durch die Plugins, denn damit kannst du deine Website genau auf deine Bedürfnisse ausrichten. Viele Funktionen lassen sich jedoch auch ohne den Einsatz eines Plugins einbauen. Ein einfaches Snippet reicht. Sich die benötigten Snippets zusammenzusuchen kann jedoch ziemlich mühsam sein.

Daher öffne ich heute meinen Werkzeugkoffer und liste meine liebsten und nützlichsten Snippets für WordPress für dich auf.

Kompatibilität:

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

Die Snippets kopierst du entweder in die functions.php deines aktiven Themes oder legst dir ein seitenspezifisches Plugin für diesen Job an.

Bitte beachten: 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 keinen Zugriff mehr auf deine Website. Führe deine Ergänzungen über einen FTP-Zugriff direkt auf deinem Webhosting durch.

Ich bitte zu beachten, dass der öffnende <?php Tag nicht mit kopiert wird.

1 – Inline-Styles der WordPress Tag Cloud entfernen

Die WordPress Tag Cloud ist ein gern genutztes Instrument für die Sidebar eines Blogs. Mit ihrer Hilfe können deine Besucher schneller finden, wonach sie suchen. Allerdings stellt WordPress die Tags unterschiedlich groß dar, was nicht immer eine gewünschte Eigenschaft ist. Mit diesem Snippet entfernst 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 keine schlechten Funktionen, erzählen sie dir doch, ob deine Artikel auf anderen Websites erwähnt oder verlinkt wurden. Leider hat WordPress die dumme Eigenschaft dich auch über Verlinkungen deiner Artikel auf deiner eigenen Website zu informieren. So schaltest du diese nervigen 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 bunten Emojis sind nicht jedermanns Sache. Solltest du in deinen Beiträgen keine Emojis verwenden wollen, so kannst du diese Funktion komplett abschalten. Die Performance deines Blogs wird es dir danken.

Kennst du unser E-Book-Bundle? Spare jetzt 6,99 €!

E-Book Bundle von Andreas Hecht
<?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 älterer jQuery-Anwendungen sorgen soll. Die »normale« und moderne jQuery Version unterstützt nicht mehr alle alten Anwendungen. Dieser Fall wird mit Sicherheit nicht mehr als 5% aller WordPress-Websites betreffen, und doch wird das nicht gerade kleine Script standardmäßig von WordPress geladen. So schaltest du es ganz einfach 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 brachte die neue Funktion oEmbed mit sich, die in erster Linie dazu gedacht ist, fremde Artikel oder Seiten mittels eines einfachen Links in Beiträge einbetten zu können. Wenn du diese Funktion nicht benötigst oder es dir einfach unwohl dabei ist, dass deine Artikel jederzeit in fremden Artikel dargestellt werden können, dann deaktiviere diese Funktion einfach.

<?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ützlich, anderes hingegen weniger. Manches bläht die Website einfach nur unnötig auf. Hier kommt ein kleines Snippet, dass mal kräftig aufrä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 keine 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 spezielle Dateiformate in Deine WordPress-Mediathek hochladen und bekommst eine Fehlermeldung? Dann nutze diesen Code, und Dein Problem ist gelöst. Der Code erlaubt das Hochladen der Dateiformate ZIPMOBIPDF und EPUB. Solltest Du weitere Formate benötigen, dann findest Du hier die vollständige 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 spezielles Template eine ganz spezielle Länge des Excerpts. Mit der folgenden Funktion lässt sich diese Länge beliebig festlegen. Das Gute ist, das die Excerpt-Länge dabei nicht global festgelegt wird, sondern das jedes Template seine eigene 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 einfach die Tags gegeneinander 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 keine responsiven Videos unterstützt, dann kannst du den Support dafür schnell selbst festlegen. Eine PHP-Funktion sorgt für eine automatische Einbettung in ein Div, die CSS-Angaben sorgen für die optimale 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ötige 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öchtest die alten »Ältere Beiträge | Neuere Beiträge« Links mit einer coolen Nummernliste ersetzen? Kein Problem, den seit der WordPress-Version 4.1 benötigst du dafür das bekannte Plugin WP-PageNavi nicht mehr. Jetzt geht das ganz einfach mit Bordmitteln.

Du kannst diese Funktion direkt in der index.php und in der archive.php einsetzen. Allerdings ist es vorteilhaft, dafür ein Child-Theme zu erstellen.

<?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 nutze. Du musst es noch auf deine Blog-Farben anpassen:

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 richtig stolz auf deine WordPress-Website und hast viel Arbeit in das Design investiert? Dann gehe noch einen Schritt weiter und passe auch gleich das Logo auf der Login-Seite an. Zusammen mit einer eigenen Hintergrundfarbe sieht das schon richtig 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 richtig cool sieht ein Beitrag erst aus, wenn der erste Absatz in einer anderen Farbe und Schriftart gestaltet ist. Dafür musst du nicht jedesmal in den Text-Bereich deines Editors wechseln, den Job kann WordPress automatisch für dich erledigen. Zwei Snippets und die Magie ist perfekt:

<?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 obige Code verpasst nun jedem ersten Absatz eines Artikels oder einer Seite die Klasse .opener. Mit etwas CSS steuerst du nun nicht nur die Formatierung des Absatzes, sondern 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 stellen den ersten 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öglich. Um Hacker zu ärgern und WordPress ein bisschen sicherer zu machen, kannst Du Dich mit diesem Code ausschließlich mit E-Mail und Passwort anmelden.

<?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 deiner Website. Sorge stets dafür, dass die vergebenen Passwörter sehr stark sind, damit Angriffe keine Chance haben. User jedoch ändern die vergebenen Passwörter sehr gern in sehr leicht zu merkende und damit zu knackende Varianten. Das kannst du erfolgreich verhindern!

<?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 verdienen möchtest, dann kommst Du um den Einsatz von Werbung nicht herum. Du kannst dafür zum Beispiel das beliebte Google Adsense verwenden. Dieses Snippet blendet deine Werbeblöcke nach dem von dir festgelegten 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 biografischen Angaben in Deinem WordPress Profil sind recht mager ausgestattet. Viele Möglichkeiten hast du nicht, um all deine Sozialen Netzwerke zu verlinken. Mit diesem Code kannst du jeden deiner Social Media-Accounts hinzufügen und schnell im Theme anzeigen.

<?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 folgenden Tag kannst du die neuen Felder im Theme anzeigen:

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

18 – Kategorie-Liste mit RSS-Feeds anzeigen lassen

Manchmal kann es praktisch sein, sich alle Kategorien mit den dazugehörenden RSS-Feed-Adressen anzeigen lassen zu können. Noch besser wird es, wenn man einen WordPress-Shortcode nutzen kann, um die Liste überall – auch in den Text-Widgets – anzeigen zu können.

<?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 anzeigen, wo du sie haben möchtest. Er funktioniert auch innerhalb von Widgets.

In deinem Theme kannst du den Shortcode ebenfalls verwenden:

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

19 – Related Posts ohne Plugin anzeigen

Die beliebten ähnlichen Beiträge lassen sich ganz bequem auch ohne ein aufgeblähtes Plugin mit “vielen” Funktionen anzeigen. 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 wurde, muss in der single.php oder dem Template, dass die Loop der einzelnen Beiträge enthält, ein Tag eingefügt werden.

<?php evolution_related_posts(); ?>

Damit das Ganze dann schick aussieht, 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 (ehemals Webmaster Tools) für eine schnelle Indexierung der Beiträge deiner Website. Bisher musstest du ein Plugin installieren, um eine sitemap.xml zu generieren. Mit diesem Code kannst du dir das Plugin sparen.

Die Sitemap wird für deine 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 mehreren Autoren kann das folgende Snippet Gold wert sein, denn es macht die Vergabe eines Beitragsbilds erforderlich, um einen Artikel veröffentlichen zu können.

<?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 deinen Beiträgen verlinkst, dann wirst du dieses Snippet lieben. Denn es verlinkt bei einer Eingabe von @account automatisch auf den jeweiligen 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 eingefügte URL wird von WordPress automatisch mit einem Link umgeben. Das kann durchaus zu einem Problem werden, denn nicht immer sind es diese Links auch wert, von deinem Blog verlinkt zu werden. Das folgende Snippet macht aus den URLs reinen Text.

<?php

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

24 – Das komplette JavaScript in den Footer laden

WordPress lädt das JavaScript normalerweise in den Header deiner Website. Dadurch verlangsamt sich der Seitenaufbau ungemein. Mit diesem Code wird das JavaScript komplett im Footer der Website geladen, damit sich die Seite schneller aufbaut.

<?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 überladenes Plugin. Einige Zeilen Code reichen vollkommen 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 mittels eines einfachen Funktionsaufrufes integriert werden. Die richtigen 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ützliches Werkzeug für die Gestaltung einer umfangreichen Website mit vielen Funktionen. Allerdings werden sie von WordPress nicht automatisch in die Kategorien und Tags übernommen. Startest du eine Suche, so wirst du immer einen Fehler zurückerhalten. Mit diesen beiden Snippets integrierst du deine 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 hoffe, dass du einige nützliche Snippets für dich und dein WordPress entdecken konntest. Wenn dieser Artikel hier erfolgreich sein sollte, dann lege ich eventuell noch einen Beitrag über die nützlichsten WooCommerce Snippets nach.

Andreas Hecht

ist WordPress-Entwickler und bietet dir WordPress-Sicherheit für deine Website. Zudem entwickelt er WooCommerce Shops mit Ladezeiten von unter einer Sekunde. Er schreibt seit 2012 für Dr. Web. Auf seinem Blog veröffentlicht er unter anderem nützliche WordPress-Snippets.

Hinterlasse einen Kommentar

15 Kommentare auf "Die 26 nützlichsten und funktionellsten WordPress-Snippets"

Benachrichtige mich zu:
avatar
Sortiert nach:   neueste | älteste | beste Bewertung
Bettina Munk
Gast

Danke für diese Fülle an Snippets, die fehlten mir schon sehr!

Heiko Mitschke
Gast

Hallo Andreas!

Bist du dir sicher, dass Tip 24 funktioniert? Ich würde sagen, du entfernst zwar Javascript aus dem Kopfbereich, vergisst es aber wieder einzubinden. Hast du nur die Hälfte des Codes kopiert oder übersehe ich etwas?


add_action('wp_footer', 'wp_print_scripts', 5);
add_action('wp_footer', 'wp_enqueue_scripts', 5);
add_action('wp_footer', 'wp_print_head_scripts', 5);

Viele Grüße
Heiko Mitschke

Ralph
Gast

Super hilfreich! Danke für diese Zusammenstellung, die ich mir gleich speicherte!
Ein Blogpost mit viel Nutzen für WordPress-Nutzer.

Beste Grüße. Ralph

Marco
Gast

Super. Vielen dank für die Liste. Sind spannende dabei. Vor allem das mit der Werbung

bullet force
Gast

Vielen Dank. Da sind ein paar interessante Snippets dabei.

Hannah
Gast

Vielen Dank für den hilfreichen Artikel!

Thomas
Gast

Tolle Zusammenstellung, kompakt und auf deutsch – selten im www. Daumen hoch.

Anna Blume
Gast

Vielen Dank, eine sehr interessante Zusammenstellung.

Andreas
Gast

Danke für den Artikel. Was müsste ich den eintragen, wenn die Autorenbox z.B. nicht auf Veranstaltungsseiten des Events Managers erscheinen soll bzw. nur für eingeloggte Besucher sichtbar sein soll? Ich habe die einzelnen Veranstaltungsseiten zwar schon als Seiten und nicht als Beiträge ausgegeben, aber die Autorenbox erscheint dort trotzdem.

Christian
Gast

Vielen Dank, Andreas. Da sind ein paar interessante Snippets dabei.

Maja
Gast

Super Artikel, danke für die Zusammenfassung!