WordPress-Snippets: Die 26 besten Code-Schnipsel für deine Website
WordPress wird erst so richtig gut durch die Plugins, denn damit kannst du deine WordPress 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.
[box-achtung text=“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.
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);
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' );
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.
<?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;
}
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;
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' );
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);
}
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');
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 ZIP
, MOBI
, PDF
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');
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 ); ?>
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;
}
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 Minimal WordPress-Themes
<?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;
}
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' );
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;
}
nbsp;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);
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();
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 );
}
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' ); ?>
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]"); ?>
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, Minimal WordPress-Themes 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;
}
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');
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" );
}
}
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');
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);
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' );
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(); ?>
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 Code-Schnipsel für dich und dein WordPress entdecken konntest. Morgen früh legen wir noch die nützlichsten WooCommerce-Snippets nach.
(Quelle Artikelkbild: Depositphotos)
….ich fand hier diesen Kommentar, der mir jedoch gar nicht geholfen hat… :::::::
“
Um deine Website zu schützen, läuft dieser Link in 1 Tag ab. Aber keine Sorge: Ein neuer Link wird dir per E-Mail zugeschickt, wenn der Fehler nach Ablauf der Frist erneut auftritt.
Wenn du Hilfe bei diesem Problem suchst, wirst du möglicherweise nach einigen der folgenden Informationen gefragt:
WordPress-Version 6.0
Aktives Theme: Baylys (Version 1.0.4)
Aktuelles Plugin: Jetpack (Version 11.0)
PHP-Version 7.4.29
Fehler-Details
==============
Ein Fehler vom Typ E_COMPILE_ERROR wurde in der Zeile 90 der Datei /wp-content/plugins/jetpack/vendor/jetpack-autoloader/class-php-autoloader.php verursacht. Fehlermeldung: require(): Failed opening required ‚/wp-content/plugins/jetpack/jetpack_vendor/automattic/jetpack-heartbeat/src/class-heartbeat.php‘ (include_path=‘.:/opt/cpanel/ea-php74/root/usr/share/pear‘)
Guten Tag,
erst spät merkte ich, daß mein WordPress einfach verschwunden ist… kannst Due mir aufzeigen, was da passiert ist ? ich bin völlig ratlos.
EINE BREADCRUMB-NAVIGATION OHNE PLUGIN ERSTELLEN
Hallo und guten Tag,
hier muss man ja
in eine andere PHP-Datei gehen.
Ist es denkbar, das man stattdessen, am Schluss ein
add_action( ‚ah_the_breadcrumb‘, ‚yyyyyyyyyyy‘ );
einfügt, sodass bei einem Update nichts verloren geht ?
Meine Frage, was wäre für yyyyyyyyyyy hier einzutragen?
VG sendet
Mario
ich bin auf der Suche nach der Einbindungsmöglichkeit von .vcf Dateien.
Hast du da einen Tipp für mich?
Hallo,
ist das Script „Schalte das jQuery Migrate Script ab“ wirklich noch nötig? ( ab WordPress 5.5 )
Zumindest hat es bei mir dazu geführt (Ich hatte es seit längererZeit ) dass das PlugIn „Slider by Supsystic “ nicht funktionierte.
Das komplette „JavaScript in den Footer laden“ führte dazu dass das PlugIn „Accordions by PickPlugins“ nicht mehr funktionierte.
Hallo Uwe,
das kann leider immer passieren, wenn man jQuery oder JavaScript nicht lädt oder nur vom Footer aus lädt. Deswegen sind Tests immer notwendig bevor solche Änderungen live gehen.
Wer nicht auf diese Plugins verzichten mag, sollte im Zweifelsfall das Plugin „jQuery Migrate Helper“ aktivieren (siehe https://www.drweb.de/wordpress-updates/ )
Herzlich,
— Markus
Hallo Andreas Hecht
Super diese Seite. Einiges konnte ich übernehmen.
Beim Logo auf der Loginseite zeigt es mir leider auch „nur“ das Logo von WordPress an.
Beste Grüsse aus der Schweiz
Silvester
Super, vielen Dank dafür! Direkt gespeichert.
Leider aber übernimmt er beim Logo-Login nicht das Logo.
Background etc. klappt, aber das Logo wird nicht angezeigt.
Habe alle mir bekannten Möglichkeiten und Pfade zum Bild versucht.
Ist auch ein PNG.
Wie ist es bzgl. der Frage von Micha in Bezug auf Updates von WordPress?
LG
Super Liste. Vielen Dank!
Bei einem Update wäre das aber auch wieder weg oder? Also lieber als Plugin?
Hallo, ich habe nach deiner Anleitung die Seitennavigation eingefügt. Das klappt auch jetzt ohne zusätzliches Plugin aber die Navigation erscheint immer ganz unten auf der Seite und nicht nach den Beiträgen, egal an welcher Stelle ich den Code in die index.php einfüge. Ich verwende das Theme Zoom Lite.
Gibts da eine Lösung?
lg
Super hilfreich – einiges gleich ausprobiert! Danke für den tollen Artikel!…8)
Wow, da sind ja coole Snippets dabei. Danke für den geilen Artikel!
Das ist ja sehr hilfreich. Vieles kannte ich gar nicht. Danke!
moin zusammen,
vielleicht hat hier ja jemand einen tipp für mich. bei wordpress führt der klick auf das »hauptlogo« bei einem theme ja in der regel auf die startseite. ich würde das gern ändern.
kontret:
aufruf: musterdomain.de =» Startseite
klick auf logo =» Seite2
hat da jemand einen tipp. vielen dank schon mal im voraus.
lg
aus hamburg
Danke für diese Fülle an Snippets, die fehlten mir schon sehr!
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
Super. Vielen dank für die Liste. Sind spannende dabei. Vor allem das mit der Werbung
Vielen Dank. Da sind ein paar interessante Snippets dabei.
Vielen Dank für den hilfreichen Artikel!
Danke an Euch alle! Freut mich, das Ihr profitieren könnt. Ein Klick auf die Teilen-Buttons wäre übrigens ganz klasse:-)
Tolle Zusammenstellung, kompakt und auf deutsch – selten im www. Daumen hoch.
Vielen Dank, eine sehr interessante Zusammenstellung.
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.
Das kannst Du mit einigen Tags steuern. Zum Beispiel mit is_user_logged_in(). Siehe https://developer.wordpress.org/reference/functions/is_user_logged_in/
Vielen Dank, Andreas. Da sind ein paar interessante Snippets dabei.
Super Artikel, danke für die Zusammenfassung!