25 Snippets für WordPress

Artikel vom 13. April 2024, Voraussichtliche Lesezeit 11 min,©Der Webfuchs

WordPress ist eine der beliebtesten Content-Management-Systeme weltweit und bietet eine Vielzahl von Funktionen und Erweiterungen, um eine Website zu gestalten und zu verwalten. Einer der Vorteile von WordPress ist die Möglichkeit, Snippets zu nutzen, um die Funktionalität der Website zu erweitern oder anzupassen. Snippets sind Code-Schnipsel, die in die Dateien der WordPress-Website eingefügt werden können, um bestimmte Aufgaben zu erfüllen, ohne dass ein komplettes Plug-in benötigt wird.

In diesem Artikel stelle ich 25 nützliche Snippets vor, die Dir helfen können, Deine WordPress-Website zu optimieren und anzupassen. Von der Anpassung des Designs bis hin zur Verbesserung der Sicherheit – hier findest Du garantiert ein passendes Snippet für Deine Bedürfnisse.

Vor kurzem habe ich Perun besucht und mal wieder ein wenig in dessen Blog gestöbert. Dabei ist mir ein Artikel aufgefallen, in dem er eine Funktion von WordPress geändert hat. Da dachte ich mir, darüber könnte ich mal einen Artikel schreiben und einige Snippets vorstellen.

Bevor ich aber die einzelnen Snippets vorstelle ein paar Hinweise.

Hinweise

Alle Snippets kann man über das Plug-in Code Snippets einfügen und nicht über die functions.php. Für alle hier vorgestellten Snippets ist die kostenlose Version von Code Snippets vollkommen ausreichend.

Bevor Du ein Snippet ausprobierst, lege Dir zumindest ein aktuelles Backup an. Noch besser wäre es, wenn Du Dir eine Staging Seite anlegst. Dort kannst Du dann alles in Ruhe ausprobieren. Denn es kann immer vorkommen, dass ein Snippet bei Dir nicht funktioniert oder einen schwerwiegenden Fehler verursacht.

Die Snippets wurden für mein System erstellt, somit kann es natürlich sein, dass es bei Dir nicht funktioniert.

Auch wenn ich einen Großteil der hier vorgestellten Snippets selbst ausprobiert habe, kann ich für die Sicherheit natürlich nicht garantieren oder haften. Insofern erfolgt die Benutzung immer auf eigene Gefahr.

Was ist Code-Snippets

Das WordPress-Plug-in Code Snippets ist eine Erweiterung, die es Benutzern ermöglicht, Code-Snippets in WordPress zu verwenden, ohne die Funktionen des Themas oder der Plug-ins zu beeinträchtigen.

Um das Code-Snippets-Plug-in zu installieren, gehst Du zu „Plug-ins“ in Deinem WordPress-Dashboard und suchst nach „Code Snippets“. Klicke auf „Installieren“ und aktiviere es anschließend.

Um ein neues Code-Snippet zu erstellen, gehst Du zur Registerkarte „Snippets“ im WordPress-Dashboard und klickst auf „Neues Snippet hinzufügen“. Gib einen Titel und eine Beschreibung ein und fügen dann den Code-Block in das Textfeld ein. Du kannst das Snippet nun speichern und es wird in der Snippet-Liste angezeigt.

Um ein Snippet zu aktivieren, gehst Du zur Registerkarte „Snippets“ und suchst das gewünschte Snippet. Klicke auf „Aktivieren“ und das Snippet wird nun ausgeführt, wenn die Seite geladen wird.

Snippets für den Frontend-Bereich

Länge des Textauszugs (Excerpt) anpassen

Ehre, wem Ehre gebührt, zuerst stelle ich das Snippet von Perun vor.

<?php

function custom_excerpt_length($length) {
    return 25; 
}
add_filter('excerpt_length', 'custom_excerpt_length', 999);

Hier wird die Anzahl der Wörter im Textauszug auf 25 beschränkt, Standard sind bei WordPress üblicherweise 55 Wörter.

Perun empfiehlt, dieses Snippet in die Datei functions.php Deines Child-Themes hinzuzufügen oder zu ändern. Ich weiß natürlich nicht wie seine functions.php aussieht, aber meine wäre bei den ganzen Änderungen sehr unübersichtlich, deshalb füge ich derartige Snippets immer in Code Snippets ein.

Recent Posts – Aktuelle Beiträge

Für aktuelle Beiträge wird oftmals ein Plug-in benutzt. Dies geht aber auch ohne, indem man folgendes Snippet benutzt:

<?php

// Define shortcode
function recent_posts_shortcode() {
  ob_start();
  // Exclude the current post from the query
  $exclude_post = exclude_current_post();
  // Set up query args
  $args = array(
    'post__not_in' => $exclude_post,
    'posts_per_page' => 3,
    'ignore_sticky_posts' => 1
  );
  $the_query = new WP_Query( $args );
  // The Loop
  if ( $the_query->have_posts() ) :
    echo '<h2>Aktuelle Beiträge</h2><ul>';
    while ( $the_query->have_posts() ) : $the_query->the_post();
      echo '<li>';
	echo '<p><a href="' . get_the_permalink() . '">' . get_the_title() . '</a></p>';
      if (has_post_thumbnail()) {
        echo '<p><a href="' . get_the_permalink() . '">' . get_the_post_thumbnail() . '</a></p>';
      }
      echo '<p>' . get_the_excerpt() . '</p>';
      echo '</li>';
    endwhile;
    echo '</ul>';
  else :
    echo 'No posts found';
  endif;
  wp_reset_postdata();
  $content = ob_get_clean();
  return $content;
}

add_shortcode( 'recent-posts', 'recent_posts_shortcode' );

// Exclude current post from query
function exclude_current_post() {
  global $post;
  $exclude_post = array();
  if ( $post ) {
    array_push( $exclude_post, $post->ID );
  }
  return $exclude_post;
}

Dieser Code hat etwas, was meines Wissens die meisten Plug-ins zu diesem Thema nicht haben. Liest Du einen in der Liste aufgeführten Beiträge, wird dieser nicht mehr in der Liste der aktuellen Beiträge ausgeführt, sondern übersprungen.

Die Anzahl der angezeigten Beiträge kannst Du mit ‘posts_per_page’ ⇒ 3, auf eine beliebige Zahl abändern und das ganze per Shortcode einfügen.

Lesezeit anzeigen lassen

Hierüber habe ich zwar schon mal einen ausführlicheren Artikel geschrieben, aber in der Auflistung sollte das Snippet ruhig noch einmal auftauchen.

<?php

function tu_estimated_reading_time() {
    $post = get_post();
    $content = $post->post_content;
    $wpm = 250; // How many words per minute.

    $clean_content = strip_shortcodes( $content );
    $clean_content = strip_tags( $clean_content );
    $word_count = str_word_count( $clean_content );
    $time = ceil( $word_count / $wpm );

    return $time . ' min';
}
add_shortcode('reading-time', 'tu_estimated_reading_time');

Das Ganze lässt sich per Shortcode dann einfügen.

Copyright ändern

benutzt Du ein kostenloses Theme, dann hast Du oftmals im Footer den Hinweis auf ein Copyright mit einem beliebigen Text. Dies kannst Du mit diesem Snippet einfach ändern.

<?php

// überschreibt den Standard Footer Copyright Text
add_filter( 'generate_copyright','tu_custom_copyright' );
function tu_custom_copyright() {
    ?>
    <span class="copyright">© Der Webfuchs</span>
    <?php
}

In meiner ausführlicheren Anleitung kannst Du auch genau nachlesen, wie man das machen kann.

Read More oder Weiterlesen Button ändern

Für viele Themes lässt sich der Read More oder Weiterlesen Button mit diesem einfachen Snippet ändern.

<?php

function custom_read_more_text( $more ) {
    return 'Weiterlesen';
}
add_filter( 'excerpt_more', 'custom_read_more_text' );

Um das Aussehen des „Read More“-Buttons zu ändern, musst Du CSS verwenden. Dazu musst Du die Klasse des „Read More“-Buttons in Deinem Theme identifizieren und die gewünschten CSS-Regeln hinzufügen.

Bei GeneratePress funktioniert das Snippet meines Wissens nicht.

Read More oder Weiterlesen Button in GeneratePress ändern

Für GeneratePress kann man den Read More oder Weiterlesen Button wie folgt ändern.

<?php

add_filter( 'generate_content_more_link_output','tu_change_content_more_link' );
function tu_change_content_more_link() {
    return sprintf( '<p class="read-more-container MY-CUSTOM-CLASS"><a title="%1$s" class="r-link link text-underlined" href="%2$s">%3$s</a></p>',
        the_title_attribute( 'echo=0' ),
        esc_url( get_permalink( get_the_ID() ) . apply_filters( 'generate_more_jump','#more-' . get_the_ID() ) ),
        __( 'Mehr erfahren', 'generatepress' )
    );
}

Wie man das genau ändern kann, kannst Du hier nachlesen.

Wer das Premium Modell von GeneratePress hat, kann man Read More auch direkt im Customizer ändern.

Sortierfunktion für Besucher

Mit folgendem Snippet kann der Besucher Deines Blogs die Artikel sortieren nach „älteste Beiträge zuerst“ oder „neueste Beiträge zuerst“.

<?php

function custom_sort_query( $query ) {
    if ( $query->is_category() && isset( $_GET['sort'] ) ) {
        if ( $_GET['sort'] == 'oldest' ) {
            $query->set( 'order', 'ASC' );
            $query->set( 'orderby', 'date' );
        }
    }
}
add_action( 'pre_get_posts', 'custom_sort_query' );

function post_sorting_buttons() {
    $current_url = add_query_arg( NULL, NULL );
    $newest_url = add_query_arg( array( 'sort' => 'newest' ), $current_url );
    $oldest_url = add_query_arg( array( 'sort' => 'oldest' ), $current_url );
    ?>
    <div class="post-sorting-buttons">
        <a href="<?php echo $newest_url; ?>" class="button button-primary">Neueste Beiträge</a>
        <a href="<?php echo $oldest_url; ?>" class="button">Älteste Beiträge</a>
    </div>
    <?php
}
add_shortcode( 'post_sorting_buttons', 'post_sorting_buttons' );

Der Code produziert den shortcode [post_sorting_buttons], den Du an beliebiger Stelle in Deinem Blog einfügen kannst. Mit GeneratePress ist das z.B. kein Problem innerhalb der Kategorie die Beiträge sortieren zu lassen.

Related Posts nach Kategorie

Für Related Posts muss man nicht unbedingt ein Plug-in benutzen. Wenn Du einfach nur ähnliche Beiträge anhand der Kategorie des gelesenen Artikels anzeigen lassen möchtest, ist folgendes Snippet vollkommen ausreichend.

<?php

function related_posts( $atts ) {
    $atts = shortcode_atts( array(
        'count' => 3,
    ), $atts, 'related_posts' );

    global $post;
    $categories = get_the_category( $post->ID );

    if ( ! empty( $categories ) ) {
        $category_ids = array();
        foreach ( $categories as $category ) {
            $category_ids[] = $category->term_id;
        }

        $args = array(
            'category__in' => $category_ids,
            'post__not_in' => array( $post->ID ),
            'posts_per_page' => $atts['count'],
            'orderby' => 'rand',
        );

        $query = new WP_Query( $args );

        if ( $query->have_posts() ) {
            $output = '<div class="related-posts">';
            $output .= '<h2>Related Posts</h2>';
            $output .= '<ul>';

            while ( $query->have_posts() ) {
                $query->the_post();

                // Beitragsbild
                $thumbnail = get_the_post_thumbnail( $post->ID, 'thumbnail' );
                if ( ! $thumbnail ) {
                    $thumbnail = '<img src="' . get_stylesheet_directory_uri() . '/images/no-thumbnail.jpg" alt="No thumbnail">';
                }

                // Textauszug
                $excerpt = wp_kses_post(get_the_excerpt());
                if ( ! $excerpt ) {
                    $excerpt = wp_trim_words( get_the_content(), 20 );
                }

                $output .= '<li>';
                $output .= '<a href="' . get_permalink() . '">' . $thumbnail . '</a>';
                $output .= '<div class="related-posts-content">';
                $output .= '<h3><a href="' . get_permalink() . '">' . get_the_title() . '</a></h3>';
                $output .= '<p>' . $excerpt . '</p>';
                $output .= '</div>';
                $output .= '</li>';
            }

            $output .= '</ul>';
            $output .= '</div>';

            wp_reset_postdata();

            return $output;
        }
    }
}
add_shortcode( 'related_posts', 'related_posts' );

Dieser Code fügt eine Funktion mit dem Namen „related_posts“ hinzu, die einen Shortcode related_posts erstellt. Wenn Du diesen Shortcode in einen Beitrag oder eine Seite einfügst, werden drei zufällige Beiträge aus derselben Kategorie wie der aktuelle Beitrag angezeigt.

Man kann die Anzahl der angezeigten Beiträge mit dem Attribut „count“ ändern. Zum Beispiel: related_posts count=”5″ zeigt fünf zufällige Beiträge an.

Das Aussehen der verwandten Beiträge kann durch Anpassen der CSS-Klassen „related-posts“, „related-posts h2“, „related-posts ul“, „related-posts li“, „related-posts a“, „related-posts-content“ und „related-posts-content h3“ im Stylesheet des Themes angepasst werden.

Related Posts nach Schlagwort

Wenn Du lieber nach Schlagwörtern sortieren möchtest, dann ist folgendes Snippet für Dich das richtige.

<?php

function related_posts_by_tags( $atts ) {
    $atts = shortcode_atts( array(
        'count' => 3,
    ), $atts, 'related_posts_by_tags' );

    global $post;
    $tags = wp_get_post_tags( $post->ID );

    if ( ! empty( $tags ) ) {
        $tag_ids = array();
        foreach ( $tags as $tag ) {
            $tag_ids[] = $tag->term_id;
        }

        $args = array(
            'tag__in' => $tag_ids,
            'post__not_in' => array( $post->ID ),
            'posts_per_page' => $atts['count'],
            'orderby' => 'rand',
        );

        $query = new WP_Query( $args );

        if ( $query->have_posts() ) {
            $output = '<div class="related-posts">';
            $output .= '<h2>Related Posts</h2>';
            $output .= '<ul>';

            while ( $query->have_posts() ) {
                $query->the_post();

                // Beitragsbild
                $thumbnail = get_the_post_thumbnail( $post->ID, 'thumbnail' );
                if ( ! $thumbnail ) {
                    $thumbnail = '<img src="' . get_stylesheet_directory_uri() . '/images/no-thumbnail.jpg" alt="No thumbnail">';
                }

                // Textauszug
                $excerpt = wp_kses_post( get_the_excerpt() );
                if ( ! $excerpt ) {
                    $excerpt = wp_trim_words( wp_kses_post( get_the_content() ), 20 );
                }

                $output .= '<li>';
                $output .= '<a href="' . get_permalink() . '">' . $thumbnail . '</a>';
                $output .= '<div class="related-posts-content">';
                $output .= '<h3><a href="' . get_permalink() . '">' . get_the_title() . '</a></h3>';
                $output .= '<p>' . $excerpt . '</p>';
                $output .= '</div>';
                $output .= '</li>';
            }

            $output .= '</ul>';
            $output .= '</div>';

            wp_reset_postdata();

            return $output;
        }
    }
}
add_shortcode( 'related_posts_by_tags', 'related_posts_by_tags' );

In dieser Version der Funktion werden verwandte Beiträge anhand von Schlagwörtern gefunden, die dem aktuellen Beitrag zugeordnet sind. Der Rest der Funktion bleibt unverändert, einschließlich der Anzeige des Beitragsbildes und des Textauszugs.

Um diese Funktion mit Schlagworten zu nutzen, musst Du den Shortcode [related_posts_by_tags] verwenden, wie im ursprünglichen Beispiel.

Related Posts nach Ähnlichkeit

Eine Kombination aus beiden, nämlich Schlagwörtern und Kategorie ist folgendes Snippet.

<?php

function related_posts_func($atts, $post) {
    // Get post tags and categories
    $tags = wp_get_post_terms($post->ID, 'post_tag', array('fields' => 'ids'));
    $categories = wp_get_post_categories($post->ID, array('fields' => 'ids'));

    // Get related posts
    $related_posts = array();
    $related_posts_query = new WP_Query(array(
        'post_type' => 'post',
        'post__not_in' => array($post->ID),
        'posts_per_page' => -1,
        'tax_query' => array(
            'relation' => 'OR',
            array(
                'taxonomy' => 'post_tag',
                'field' => 'term_id',
                'terms' => $tags,
            ),
            array(
                'taxonomy' => 'category',
                'field' => 'term_id',
                'terms' => $categories,
            ),
        ),
    ));
    while($related_posts_query->have_posts()) {
        $related_posts_query->the_post();
        $similarity = similar_text(strtolower($post->post_content), strtolower(get_the_content()), $percent);
        $post_id = get_the_ID();
        if (isset($related_posts[$post_id])) {
            // Update existing post's similarity
            $related_posts[$post_id]['similarity'] = max($related_posts[$post_id]['similarity'], $percent);
        } else {
            // Add new related post to array
            $related_posts[$post_id] = array(
                'id' => $post_id,
                'similarity' => $percent,
            );
        }
    }
    wp_reset_postdata();

    // Sort related posts by similarity
    usort($related_posts, function($a, $b) {
        return $b['similarity'] <=> $a['similarity'];
    });

    // Limit related posts to three
    $related_posts = array_slice($related_posts, 0, 3);

    // Generate output
    $output = '<table style="border: none; width: 100%;" class="related-posts-table"><tr>';
    foreach($related_posts as $related_post) {
        $output .= '<td style="border: none; width: 33%; vertical-align: top;">';
        $output .= '<h3><a href="' . get_permalink($related_post['id']) . '">' . get_the_title($related_post['id']) . '</a></h3>';
        if(has_post_thumbnail($related_post['id'])) {
            $output .= '<a href="' . get_permalink($related_post['id']) . '">' . get_the_post_thumbnail($related_post['id'], ) . '</a>';
        }
        $output .= '<p>' . get_the_time(get_option('date_format'), $related_post['id']) . '</p>';
        $output .= '<p>' . wp_kses_post(get_the_excerpt($related_post['id'])) . '</p>';
        $output .= '</td>';
    }
    $output .= '</tr></table>';
    return $output;
}

add_shortcode('related_posts', function($atts) {
    return related_posts_func($atts, get_post());
});

Der Code sucht zunächst nach den Schlagwörtern des aktuellen Artikels und sucht dann nach Beiträgen in der gleichen Kategorie wie der aktuelle Artikel. Anschließend werden alle gefundenen Beiträge nach Ähnlichkeit mit dem aktuellen Artikel sortiert und die drei bestbewerteten Vorschläge werden ausgegeben.

Beliebtheitsgrad von Beiträgen messen und anzeigen

Manchmal sieht man auf diversen Blogs folgende Zeile: Dieser Artikel wurde XXX mal gelesen. Das dazugehörige Snippet könnte so aussehen:

<?php

// Add post view count function
function count_postviews($postID) {
    $count_key = 'post_views_count';
    $count = get_post_meta($postID, $count_key, true);
    if ($count == '') {
        $count = 1;
        delete_post_meta($postID, $count_key);
        add_post_meta($postID, $count_key, '1');
    } else {
        $count++;
        update_post_meta($postID, $count_key, $count);
    }
}

// Shortcode to display post views
function post_views_shortcode($atts) {
    $post_id = get_the_ID();
    $count = get_post_meta($post_id, 'post_views_count', true);
    if ($count == '') {
        $count = 0;
    }
    return '<p> Dieser Artikel wurde bereits ' . $count . ' mal gelesen</p>';
}
add_shortcode('post_views', 'post_views_shortcode');

// Call post view count function
add_action('wp_head', 'track_post_views');
function track_post_views($post_id) {
    if (!is_single()) {
        return;
    }
    if (empty($post_id)) {
        global $post;
        $post_id = $post->ID;
    }
    count_postviews($post_id);
}

Dieses Snippet fügt eine Funktion hinzu, die die Anzahl der Ansichten von WordPress-Beiträgen zählt. Die Funktion zählt die Anzahl der Ansichten des Beitrags und speichert sie als benutzerdefinierten Post-Meta-Wert mit dem Schlüssel „post_views_count“. Wenn der Post-Meta-Wert bisher nicht vorhanden ist, wird er erstellt und auf 1 gesetzt. Andernfalls wird der vorhandene Wert erhöht.

Außerdem fügt der Code eine shortcode-Funktion hinzu, die den Wert der Anzahl der Ansichten des aktuellen Beitrags mithilfe des oben genannten benutzerdefinierten Post-Meta-Schlüssels „post_views_count“ ausgibt. Wenn man diesen shortcode in sein Template einfügt, z.B. mit GenerateBlocks, dann erscheint die Anzeige immer an derselben Stelle in Deinem Blog. So vermeidest Du bei Aktualisierungen Deines Themes das Wiedereinfügen der Funktion.

Schließlich fügt der Code eine Aktion hinzu, die bei jedem Laden eines einzelnen Beitrags aufgerufen wird und die count_postviews-Funktion ausführt, um die Anzahl der Ansichten zu erhöhen.

Das Original dieses Snippet habe ich Devslife gefunden und entsprechend geändert.

WordPress verbessern

Die alten Widgets wiederholen

Ich mag die neuen Widgets nicht, ich bin ein Freund der alten Widgets. Diese sind zwar nicht besser oder schlechter, aber ich habe mich daran gewöhnt und mag mich hier nicht umstellen. Reicht schon, dass ich mich an den Gutenbergeditor gewöhnen muss.

Wie dem auch sei, die alten Widgets lassen sich mit einem kleinen Snippet wieder herstellen.

<?php

add_filter( 'use_widgets_block_editor', '__return_false' );

Systeminfos im Dashboard anzeigen

Die mit dem Snippet angezeigten Informationen lassen sich in WordPress finden. Ich finde es aber gut, einzelne Informationen direkt im Dashboard zu sehen.

<?php

function add_ip_address_display() {
    wp_add_dashboard_widget(
        'dashboard_ip_address',
        'Aktuelle IP-Adresse',
        'display_current_ip_address'
    );
}
add_action('wp_dashboard_setup', 'add_ip_address_display');

function display_current_ip_address() {
    echo '<p>Ihre aktuelle IP-Adresse lautet: ' . $_SERVER['REMOTE_ADDR'] . '</p>';
	echo '<li>PHP-Version: ' . phpversion() . '</li>';
    
    echo '<li>Server-Betriebssystem: ' . php_uname() . '</li>';
    echo '<li>WordPress-Version: ' . get_bloginfo('version') . '</li>';
    echo '<li>WP_DEBUG: ' . (WP_DEBUG ? 'Aktiviert' : 'Deaktiviert') . '</li>';
    echo '<li>Speicherlimit: ' . ini_get('memory_limit') . '</li>';
    echo '<li>Maximale Ausführungszeit: ' . ini_get('max_execution_time') . '</li>';
    echo '<li>Upload-Maximum: ' . ini_get('upload_max_filesize') . '</li>';
	echo '<li>POST-Maximum: ' . ini_get('post_max_size') . '</li>';
    echo '<li>Allow URL Fopen: ' . (ini_get('allow_url_fopen') ? 'Aktiviert' : 'Deaktiviert') . '</li>';
    echo '<li>cURL: ' . (function_exists('curl_version') ? 'Verfügbar' : 'Nicht verfügbar') . '</li>';
    echo '<li>OpenSSL: ' . (extension_loaded('openssl') ? 'Verfügbar' : 'Nicht verfügbar') . '</li>';
	echo '<li>Anzahl der installierten Plugins: ' . count( get_plugins() ) . '</li>';
	echo '<li>Anzahl der installierten Themes: ' . count( wp_get_themes() ) . '</li>';
	echo '<li>Anzahl der Benutzer im System: ' . count_users()['total_users'] . '</li>';
	echo '<li>Webserver: ' . $_SERVER['SERVER_SOFTWARE'] . '</li>';
    echo '</ul>';
   
}

Self Pingbacks verhindern

Wenn Du einen Artikel veröffentlichst, in dem Du auf einen anderen Artikel innerhalb Deines Blogs verweist, erhältst Du Standardmäßig ein Ping back auf Deinen eigenen Artikel. Folgendes Snippet sollte das verhindern:

<?php

add_action( 'pre_ping', function( &$links ) {
    $home = get_option( 'home' );
    foreach ( $links as $l => $link )
        if ( 0 === strpos( $link, $home ) )
            unset($links[$l]);
} );

Beiträge duplizieren

Manchmal benötigt man schnell eine Kopie eines bereits erstellten Beitrags. Hierfür bietet WordPress Standardmäßig keine Funktion an. Man kann zwar ein Plug-in benutzen, es geht aber auch einfach mit folgendem Snippet.

<?php

function copy_post() {
    global $wpdb;
    $post_id = $_GET['post'];
    $post = get_post( $post_id );
    if ( isset( $post ) && $post->post_type == 'post' ) {
        $new_post = array(
            'post_title' => $post->post_title . ' (Copy)',
            'post_content' => $post->post_content,
            'post_status' => 'draft',
            'post_author' => $post->post_author,
            'post_category' => $post->post_category,
            'post_excerpt' => $post->post_excerpt,
            'post_name' => sanitize_title( $post->post_title ) . '-copy',
            'post_date' => date( 'Y-m-d H:i:s' ),
            'post_date_gmt' => date( 'Y-m-d H:i:s' ),
            'post_modified' => date( 'Y-m-d H:i:s' ),
            'post_modified_gmt' => date( 'Y-m-d H:i:s' ),
        );
        $new_post_id = wp_insert_post( $new_post );
        $taxonomies = get_object_taxonomies( $post->post_type );
        foreach ( $taxonomies as $taxonomy ) {
            $post_terms = wp_get_object_terms( $post_id, $taxonomy, array( 'fields' => 'slugs' ) );
            wp_set_object_terms( $new_post_id, $post_terms, $taxonomy, false );
        }
        wp_redirect( admin_url( 'post.php?action=edit&post=' . $new_post_id ) );
        exit;
    }
}
add_action( 'admin_action_copy_post', 'copy_post' );
add_action( 'post_row_actions', 'copy_post_link', 10, 2 );

function copy_post_link( $actions, $post ) {
    if ( current_user_can( 'edit_posts' ) && $post->post_type == 'post' ) {
        $actions['copy'] = '<a href="' . wp_nonce_url( 'admin.php?action=copy_post&post=' . $post->ID, 'copy_post_' . $post->ID ) . '">Copy</a>';
    }
    return $actions;
}

Dieses Snippet fügt jedem Beitrag, neben den üblichen Bearbeiten, Quick Edit, Papierkorb und Vorschau, noch ein copy hinzu.

WordPress Konstanten

Einige Sachen an WordPress nerven im Laufe der Zeit. Einige davon sind die Revisionen und der Umgang mit Medien. Folgendes Snippet ändert das.

<?php

/* AutoSave Interval. */
define( 'AUTOSAVE_INTERVAL', '160' );
/* Number of post revisions to save */
define( 'WP_POST_REVISIONS', '3' );
/* Media Recycle Bin. */
define( 'MEDIA_TRASH', true );
/* Empty recycle bin after X(5) days */
define( 'EMPTY_TRASH_DAYS', '5' );

  • AUTOSAVE_INTERVAL: Definiert das Intervall in Sekunden, in dem WordPress Beiträge automatisch speichert, während der Benutzer einen neuen Beitrag schreibt oder einen vorhandenen Beitrag bearbeitet. In diesem Beispiel wird das Autosave-Intervall auf 160 Sekunden (2 Minuten, 40 Sekunden) festgelegt. Der Standardwert für das Autosave-Intervall in WordPress ist 60 Sekunden. Das bedeutet, dass WordPress alle 60 Sekunden automatisch einen Entwurf des aktuellen Beitrags oder der aktuellen Seite speichert.
  • WP_POST_REVISIONS: Definiert die Anzahl der Versionen, die WordPress für einen einzelnen Beitrag speichern wird. In diesem Beispiel werden nur die letzten drei Versionen jedes Beitrags gespeichert.
  • MEDIA_TRASH: Aktiviert die Papierkorb-Funktion für Medien-Dateien. Wenn diese Konstante auf true gesetzt wird, werden gelöschte Medien-Dateien in den Papierkorb verschoben und können später wiederhergestellt werden. Wenn diese Konstante auf false gesetzt wird, werden Medien-Dateien endgültig gelöscht.
  • EMPTY_TRASH_DAYS: Definiert die Anzahl der Tage, nach denen der Papierkorb automatisch geleert wird. In diesem Beispiel wird der Papierkorb alle fünf Tage geleert.

MIME-Typen verbieten

Manchmal möchte man je bestimmte Dateitypen nicht in seinen Medienordner haben. Dies kann man per Snippet einfach verbieten. Als Beispiel nehme ich mal das .jpg-Format.

<?php

function disable_jpg_upload( $mime_types ) {
    // Disable JPG uploads
    unset( $mime_types['jpg'] );
    unset( $mime_types['jpeg'] );

    return $mime_types;
}
add_filter( 'upload_mimes', 'disable_jpg_upload' );

Dieser Code fügt eine Filterfunktion hinzu, die die Erlaubnis für das Hochladen von JPG-Dateien aus der Liste der erlaubten MIME-Typen entfernt. Dadurch wird das Hochladen von JPG-Dateien blockiert. Beachte jedoch, dass dieser Code nur das Hochladen von JPG-Dateien blockiert und andere Bildformate weiterhin erlaubt. Wenn Du auch andere Bildformate blockieren möchtest, musst Du die entsprechenden MIME-Typen in der Funktion „disable_jpg_upload“ entfernen.

Es ist wichtig zu beachten, dass die Verwendung dieser Funktion das Hochladen von JPG-Dateien vollständig blockiert und auch die Anzeige von bereits hochgeladenen JPG-Dateien auf Ihrer Website beeinträchtigen kann. Wenn Du das vermeiden möchten, kannst Du stattdessen ein Sicherheit-Plug-in verwenden, um unerwünschte Dateitypen zu blockieren.

Welche MIME-Typen bei Dir erlaubt sind, bekommst Du wie folgt raus:

  • Erstelle eine PHP-Datei mit folgendem Inhalt
    <?php
    
    
  • Speichere die Datei unter einem beliebigen Namen, z.B. mime.php und lade diese auf Deinem Server hoch
  • Rufe die Datei mime.php in Deinem Browser auf und Du siehst, welche MIME-Typen erlaubt sind.

MIME-Typen erlauben

Das Gegenteil geht natürlich auch. Wen man z.B. BMP-Dateien hochladen möchte, dann sollte folgendes Snippet helfen.

<?php

function allow_bmp_upload( $mime_types ) {
    $mime_types['bmp'] = 'image/bmp';
    return $mime_types;
}
add_filter( 'upload_mimes', 'allow_bmp_upload' );

Beachte jedoch, dass das Hochladen von BMP-Dateien möglicherweise die Ladezeiten Deiner Website erhöht, da BMP-Dateien in der Regel größer sind als andere Bildformate wie JPEG oder PNG. Ich empfehle daher, die Verwendung von BMP-Dateien auf Deiner Website zu minimieren und stattdessen JPEG- oder PNG-Dateien zu verwenden, wenn möglich.

Snippets zu Erhöhung der Sicherheit

Security-Header einfügen

Dieses schöne Snippet habe ich beim Kulturbanausen gefunden. Auch dort treibe ich mich öfter mal umher. Hier nun also das Snippet:

<?php

if (!empty($_SERVER['HTTPS'])) {
  function kb_add_security_headers($headers) {
    $headers["x-frame-options"] = "deny";
    $headers["x-xss-protection"] = "1; mode=block";
    $headers["x-content-type-options"] = "nosniff";
    $headers["strict-transport-security"] = "max-age=31536000; includeSubDomains";
    $headers["referrer-policy"] = "no-referrer";
    $headers["permissions-policy"] = "accelerometer=(), autoplay=(self), camera=(), encrypted-media=(), fullscreen=(), geolocation=(self), gyroscope=(), magnetometer=(), microphone=(), midi=(), payment=(), picture-in-picture=(self), usb=(), interest-cohort=()";
    $headers["content-security-policy"] = "default-src 'self'; script-src 'self' https://www.google.com; img-src 'self'; style-src 'self'; font-src 'self'; object-src 'none'; frame-src 'self'; worker-src 'self'; connect-src 'self'; report-uri ".esc_url(get_template_directory_uri())."/security-report.php";
    return $headers;
  }
  add_filter('wp_headers', 'kb_add_security_headers');
}

Der Security-Header erhöht die Sicherheit Deines Blogs, deshalb ist es sinnvoll über dessen Einsatz nachzudenken. Welcher Header für Dich sinnvoll ist, musst Du selbst entscheiden. Welcher Header für was gut ist, erfährst Du beim Kulturbanausen, ebenso, wie Du Deinen Blog testen kannst.

Vor dem endgültigen Einsatz dieses Snippet solltest Du Dir aber vorher genau ansehen, welche Auswirkungen jeder einzelne Header hat, sowohl im Frontend als auch im backend.

Anmeldeversuche begrenzen

Auch dieses Snippet erhöht ein wenig die Sicherheit Deines Blogs.

<?php

// Begrenzen Sie die Anzahl der fehlgeschlagenen Anmeldeversuche
define('WP_LOGIN_ATTEMPTS', 3);
function limit_login_attempts() {
    $ip_address = $_SERVER['REMOTE_ADDR'];
    $login_failed_key = $ip_address . '_login_failed';
    $login_lockout_key = $ip_address . '_login_lockout';
    $failed_login_attempts = get_transient($login_failed_key);
    if ($failed_login_attempts === false) {
        set_transient($login_failed_key, 1, 60);
    } else {
        if ($failed_login_attempts >= WP_LOGIN_ATTEMPTS) {
            set_transient($login_lockout_key, true, 60 * 60);
            wp_die('Zu viele ungültige Anmeldeversuche. Bitte versuchen Sie es später erneut.');
        } else {
            $failed_login_attempts++;
            set_transient($login_failed_key, $failed_login_attempts, 60);
        }
    }
}
add_action('wp_authenticate', 'limit_login_attempts');

// Begrenzen Sie die Anzahl der fehlgeschlagenen Anmeldeversuche für wp-admin.php
function limit_admin_attempts() {
    $ip_address = $_SERVER['REMOTE_ADDR'];
    $admin_failed_key = $ip_address . '_admin_failed';
    $admin_lockout_key = $ip_address . '_admin_lockout';
    $failed_admin_attempts = get_transient($admin_failed_key);
    if ($failed_admin_attempts === false) {
        set_transient($admin_failed_key, 1, 60);
    } else {
        if ($failed_admin_attempts >= WP_LOGIN_ATTEMPTS) {
            set_transient($admin_lockout_key, true, 60 * 60);
            wp_die('Zu viele ungültige Anmeldeversuche. Bitte versuchen Sie es später erneut.');
        } else {
            $failed_admin_attempts++;
            set_transient($admin_failed_key, $failed_admin_attempts, 60);
        }
    }
}
add_action('admin_init', 'limit_admin_attempts');

Dieser Code begrenzt die Anzahl der fehlgeschlagenen Anmeldeversuche auf 3 innerhalb von 60 Sekunden. Wenn ein Benutzer versucht, sich mehr als dreimal mit falschen Anmeldeinformationen anzumelden, wird er blockiert und erhält eine Nachricht, dass zu viele ungültige Anmeldeversuche erfolgt sind und er es später erneut versuchen soll.

Das funktioniert sowohl für User als auch für Admins.

Error Text bei fehlgeschlagenem Anmeldeversuch

Dieses Snippet erhöht ebenfalls die Sicherheit Deines Blogs ein wenig.

<?php

function no_login_error() {
    return 'Ups, da lief was nicht korrekt.';
}
add_filter('login_errors', 'no_login_error');

Die Standard-Log-in-Fehlermeldung in WordPress lautet: „FEHLER: falscher Benutzername oder ungültiges Passwort.“ Dies wird durch diesen Code geändert auf „Ups, da lief etwas nicht korrekt.“. Zumindest verwirrt dieser Hinweis etwas.

Zugriff auf wp-login.php einschränken

Man kann auch den Zugriff auf die wp-login.php einschränken auf bestimmte IP-Adressen. Das funktioniert mit folgendem Snippet.

<?php

function restrict_login_access() {
    $allowed_ips = array( '123.456.789.0', '987.654.321.0', '192.168.1.1' ); // Hier können Sie die erlaubten IP-Adressen angeben
    $ip = $_SERVER['REMOTE_ADDR'];
    if ( ! in_array( $ip, $allowed_ips ) ) {
        if ( isset( $_GET['ip'] ) && $_GET['ip'] == $ip ) {
            // Zugriff erlauben, wenn die aktuelle IP-Adresse als Parameter übergeben wurde
            return;
        }
        // Andernfalls auf die Startseite umleiten
        wp_redirect( home_url() . '?login_error=1' );
        exit;
    }
}
add_action( 'wp_login_failed', 'restrict_login_access' );
add_action( 'login_form_login', 'restrict_login_access' );

Wenn ein Benutzer versucht, sich von einer nicht erlaubten IP-Adresse aus anzumelden, wird er auf die Startseite umgeleitet und ein Parameter login_error=1 wird hinzugefügt. Der Benutzer kann dann versuchen, erneut auf die Log-in-Seite zuzugreifen, indem er seine aktuelle IP-Adresse als Parameter IP angibt. Wenn die IP-Adresse in der Liste der erlaubten IP-Adressen enthalten ist oder als Parameter IP übergeben wurde, wird der Zugriff erlaubt.

Wenn Deine IP-Adresse 77.111.247.233 lautet und Du die Log-in-Seite von https://deinedomain.de/ aufrufen möchtest, wäre die vollständige URL folgendermaßen:

https://deinedomain.de/wp-login.php?ip=77.111.247.233

Das Ganze ist insbesondere für diejenigen von Interesse, die immer eine feste IP-Adresse haben. Wechselt Deine IP-Adresse trotzdem mal, kannst Du Dich über den alternativen Link dennoch anmelden.

Andere Snippets

Begrüßungsnachricht für den Admin

Das ist jetzt ein Snippet, welches dem Admin eine Begrüßungsnachricht hinterlässt.

<?php

function greet_by_time_of_day() {

    $current_time = current_time( 'H:i:s' );
    $morning_time = '06:00:00';
    $noon_time = '12:00:00';
    $evening_time = '18:00:00';
    $night_time = '23:59:59';
    
    if ( $current_time >= $morning_time && $current_time < $noon_time ) {
        $greeting = 'Good Morning!';
    } elseif ( $current_time >= $noon_time && $current_time < $evening_time ) {
        $greeting = 'Good Afternoon!';
    } elseif ( $current_time >= $evening_time && $current_time <= $night_time ) {
        $greeting = 'Good Evening!';
    } else {
        $greeting = 'Hello!';
    }

    $user = wp_get_current_user();
    $message = $greeting . ' ' . $user->user_login;
    ?>
        <script>
            jQuery(document).ready(function($){
                $('#wp-admin-bar-my-account > .ab-item').html('<?php echo $message; ?>');
            });
        </script>
    <?php
}

if ( is_admin() ) {
    add_action( 'admin_head', 'greet_by_time_of_day' );
}

Das ersetzt das Willkommen, welches rechts oben in der Ecke üblicherweise erscheint, mit einem der Uhrzeit angepassten Willkommensgruß. Die jeweilige Nachricht lässt sich natürlich ändern.

Begrüßungsnachricht für jeden Besucher

Was man für den Admin machen kann, kann man auch für jeden Besucher einrichten.

<?php

function greet_visitor() {
    $current_time = current_time( 'H:i:s' );
    $morning_time = '06:00:00';
    $noon_time = '12:00:00';
    $evening_time = '18:00:00';
    $night_time = '23:59:59';
    
    if ( $current_time >= $morning_time && $current_time < $noon_time ) {
        $greeting = 'Good Morning';
    } elseif ( $current_time >= $noon_time && $current_time < $evening_time ) {
        $greeting = 'Good Afternoon';
    } elseif ( $current_time >= $evening_time && $current_time <= $night_time ) {
        $greeting = 'Good Evening';
    } else {
        $greeting = 'Hello';
    }

    $greeting .= ', and welcome to our website!';

    return '<div class="greeting-message">' . $greeting . '</div>';
}

add_shortcode( 'greet', 'greet_visitor' );

Dieses Snippet erstellt den shortcode [greet], den man beliebig einsetzen kann. Auch hier lassen sich die jeweiligen Nachrichten anpassen.

Cookie auslesen

Man kann auch das eigene Cookie auslesen mit Snippets.

<?php

function wp_login_expiration_notice() {
    $current_user = wp_get_current_user();
    $user_id = $current_user->ID;
    $tokens = get_user_meta($user_id, 'session_tokens', true);
    if (empty($tokens)) {
        return;
    }
    $expiration = 0;
    foreach ($tokens as $token) {
        if ($token['expiration'] > $expiration) {
            $expiration = $token['expiration'];
        }
    }
    $expiration_date = date_i18n(get_option('date_format') . ' ' . get_option('time_format'), $expiration); // Ablaufdatum in WP-Zeitformat konvertieren
    $remaining = $expiration - time(); // Differenz zwischen Ablaufdatum und aktuellem Datum in Sekunden
    $days_remaining = round($remaining / DAY_IN_SECONDS); // Differenz in Tagen umrechnen und runden
    echo '<div class="notice notice-success is-dismissible"><p>';
    printf(__( 'You will need to log in again by %s (%s days remaining).' ), $expiration_date, $days_remaining);
    echo '</p></div>';
}
add_action( 'admin_notices', 'wp_login_expiration_notice' );

Fazit

Snippets sind eine tolle Sache, sie erleichtern einem das WordPress-Leben und können extrem viel Zeit sparen. In diesem Artikel habe ich einige nützliche Snippets für den Frontend-Bereich vorgestellt, die Dir dabei helfen können, Deine Website zu verbessern.

Mit dem Code-Snippet von Perun kannst Du die Länge des Textauszugs anpassen und damit den Überblick über Deine Beiträge verbessern. Das Recent Posts-Snippet zeigt Dir, wie Du aktuelle Beiträge ohne Plug-in anzeigen lassen kannst. Auch die Lesezeitanzeige und das Ändern des Copyrights sind mit Snippets einfach und schnell umsetzbar.

Ein weiteres nützliches Snippet ist das Ändern des Read-More-Buttons, das besonders für Blogger interessant ist, die Wert auf das Design ihrer Website legen. Mit dem Sortierfunktion-Snippet können Deine Leser die Artikel nach neuesten oder ältesten Beiträgen sortieren. Und das Related Posts-Snippet zeigt Dir, wie Du ähnliche Beiträge auf Deiner Website ohne ein Plug-in anzeigen lassen kannst.

Es gibt noch viele weitere Snippets, die Dir dabei helfen können, Deine Website zu optimieren. Und das Beste daran ist, dass Du dafür nicht einmal programmieren können musst. Es reicht, die Snippets in Deine functions.php-Datei einzufügen oder ein Plug-in wie Code Snippets zu verwenden. Wobei ich letzteres empfehlen würde.

Wenn Du also Zeit sparen und Deine Website auf das nächste Level bringen möchtest, solltest Du unbedingt Snippets ausprobieren. Mit ein wenig Recherche und Experimentieren kannst Du sicherlich einige nützliche Snippets finden und Deine Website noch besser machen.

Viele weitere Snippets findest Du auch direkt in der Cloud von Code-Snippets.

Das könnte Dich auch interessieren

Logo Der Webfuchs

Der Webfuchs

"Der Webfuchs" ist ein Pseudonym des Webentwicklers Stephan Bloemers. Geboren 1967 in Duisburg und aktuell in Düsseldorf ansässig, begann er bereits 1999 mit der Erstellung von Websites. Durch selbständiges Lernen erwarb er die notwendigen HTML-Kenntnisse und registrierte 2001 seine erste Top-Level-Domain "derwebfuchs.de", die damals bereits kostenlose Ressourcen für Webmaster bereitstellte.

Über die Jahre hat Stephan weitere Projekte realisiert, darunter einen Blog über seinen damaligen Kegelclub. Alle von ihm erstellten Websites werden als Hobby betrieben.

Neben dem Basteln an seinen Websites verbringt Stephan seine Freizeit gerne mit Spielen wie Poker oder Schach.

Stephan hat sich im Laufe seiner Karriere auf die Entwicklung von benutzerfreundlichen und effektiven Websites spezialisiert. Seine Leidenschaft für Technologie und Design spiegelt sich in seiner Arbeit wider und er ist stets bemüht, auf dem neuesten Stand zu bleiben, um die bestmöglichen Lösungen anbieten zu können.

In seiner Freizeit ist Stephan ein begeisterter Blogger und teilt gerne sein Wissen und seine Erfahrungen mit anderen Webentwicklern und Interessierten. Seine Leidenschaft für die Online-Welt und seine Fähigkeit, komplexe Themen einfach und verständlich zu vermitteln, machen ihn zu einer wertvollen Ressource für alle, die sich für Webentwicklung und Online-Marketing interessieren.

Schreibe einen Kommentar