Erweiterte Autoreninformationen ohne Plugin anzeigen

Realisiert werden soll die Anzeige von Autoreninformationen in der Einzelansicht von Beiträgen ohne Plugin. Folgende Punkte sollen angezeigt bzw. beachtet werden:

  • Links zur Website des Autors und ggf. sozialen Netzwerken, sofern diese Informationen im Profil angegeben sind
  • bisher verfasste Beiträge verlinkt mit dem individuellen Archiv des Autoren
  • Ausgabe des Website-Namens im Text via Abfrage, damit die Lösung variabel einsetzbar ist

Über die functions.php oder via Plugin werden benutzerdefinierte Autorenangaben möglich. In einer Multisite-Umgebung präferiere ich den Einsatz dieser Kontaktangaben netzwerkweit, also über ein Must-Use-plugin zu definieren. Zur Übersichtlichkeit auf der Profil-Seite werden dort zunächst AIM, Jabber und YIM deaktiviert.

function custom_contactmethods( $contactmethods ) {
  unset($contactmethods['aim']);
  unset($contactmethods['jabber']);
  unset($contactmethods['yim']);
  $contactmethods['twitter'] = 'Twitter';
  $contactmethods['facebook'] = 'Facebook';
  $contactmethods['xing'] = 'XING';
  return $contactmethods;
}
add_filter('user_contactmethods','custom_contactmethods',10,1);

single.php

<div class="postauthor">
  <p class="postauthorabout">&Uuml;ber den Autor<p>
  <h2><?php the_author(); ?></h2>
  <p class="postauthorbio"><?php if(get_the_author_meta('description') != NULL) { ?><?php the_author_meta('description'); ?> <?php } ?>
  Auf <?php bloginfo('name'); ?> stammen <a href="<?php echo get_author_posts_url( get_the_author_meta( 'ID' ) ); ?>" title="Alle Beitr&auml;ge von <?php the_author(); ?>"><?php the_author_posts(); ?> Beitr&auml;ge</a> aus der Feder von <?php the_author_meta('user_firstname'); ?>.</p>
  <p class="postauthorlinks">
  <?php if(get_the_author_meta('user_url') != NULL) { ?><a href="<?php the_author_meta('user_url'); ?>">Website</a> <?php } ?>
  <?php if(get_the_author_meta('facebook') != NULL) { ?><a href="<?php the_author_meta('facebook'); ?>">Facebook</a> <?php } ?>
  <?php if(get_the_author_meta('twitter') != NULL) { ?><a href="<?php the_author_meta('twitter'); ?>">Twitter</a> <?php } ?>
  <?php if(get_the_author_meta('xing') != NULL) { ?><a href="<?php the_author_meta('xing'); ?>">XING</a> <?php } ?>
  </p>
</div>

style.css

.postauthorabout { font-size:0.8em; }
.postauthorabout, .postauthorlinks { font-variant:small-caps; }
.postauthorbio { margin:0 0 0.8em 0; }
.postauthorlinks { font-weight:bold; }
.postauthorlinks a { margin:0 0.4em 0 0; }

Ergebnis

So kann das Ganze dann aussehen:

Autoreninformationen Screenshot

Referenz

Suchfunktion verbessern

Realisation über ein Plugin. Beitrag dient als Notiz und wird kontinuierlich erweitert.

/*
Plugin Name: Verbesserte Suchfunktion
Description: Diverse Verbesserungen für die interne Suche auf der Website.
Version: 1.0
*/

// Bei einzelnem Suchergebnis sofort auf Beitrag/Seite weiterleiten

add_action('template_redirect', 'redirect_single_post');
function redirect_single_post() {
if (is_search()) {
global $wp_query;
if ($wp_query->post_count == 1 && $wp_query->max_num_pages == 1) {
wp_redirect( get_permalink( $wp_query->posts['0']->ID ) );
exit;
}
}
}

Referenz

TinyMCE-Editor ab WordPress 3.9: Buttons hinzufügen/entfernen, Formate bearbeiten

Ab WordPress 3.9 hat sich die Ansprache des Editors, der TinyMCE nutzt verändert. Über die functions.php, bevorzugt über ein Plugin, dass im Zweifelsfall einfach deaktiviert werden kann, können weiterhin Bearbeitungen des Editors vorgenommen werden. Im Codebeispiel sind bereits einige Deaktivierungen für Buttons auskommentiert, der Vollständigkeit halber aber aufgeführt.

Buttons entfernen

function delete_buttons($buttons) {
// unset($buttons[0]); // Fett
// unset($buttons[1]);  // Kursiv
// unset($buttons[2]); // Durchgestrichen
// unset($buttons[3]); // Aufzählungszeichen
// unset($buttons[4]); // Nummerierung
// unset($buttons[5]); // Zitat
unset($buttons[6]);  // Horizontale Linie
unset($buttons[7]); // Text links ausrichten
unset($buttons[8]);  // Text zentrieren
unset($buttons[9]);  // Text rechts ausrichten
// unset($buttons[10]); // Link hinzufügen
// unset($buttons[11]); // Link entfernen
unset($buttons[12]); // Weiterlesen-Tag
unset($buttons[14]); // Vollbild-Ansicht
return $buttons;
}
add_filter('mce_buttons', 'delete_buttons');

function delete_buttons_2($buttons) {
// unset($buttons[0]); // Absatzformatierung Auswahl
unset($buttons[1]);  // Unterstreichen
unset($buttons[2]); // Blocksatz
unset($buttons[3]); // Textfarbe
// unset($buttons[4]); // Als Text einfügen
// unset($buttons[5]); // Formatierung löschen
// unset($buttons[6]);  // Sonderzeichen
unset($buttons[7]); // Einzug verringern
unset($buttons[8]);  // Einzug erhöhen
// unset($buttons[9]);  // Schritt widerrufen
// unset($buttons[10]); // Schritt wiederholen
unset($buttons[11]); // Hilfe
return $buttons;
}
add_filter('mce_buttons_2', 'delete_buttons_2');

Absatzformatierung-Auswahl und Format-Auswahl bearbeiten

function mce_mod( $init ) {
$init['block_formats'] = 'Paragraph=p;Heading 3=h3;Heading 4=h4;Heading 5=h5;Blockquote=blockquote';
$style_formats = array (
array( 'title' => 'Fett', 'inline' => 'b' ),
array( 'title' => 'Kursiv', 'inline' => 'em' ),
array( 'title' => 'Unterstrichen', 'inline' => 'span', 'styles' => array( 'text-decoration' => 'underline' ) ),
array( 'title' => 'Durchgestrichen', 'inline' => 'del' ),
array( 'title' => 'Hochgestellt', 'inline' => 'sup' ),
array( 'title' => 'Tiefgestellt', 'inline' => 'sub' )
);

$init['style_formats'] = json_encode( $style_formats );
$init['style_formats_merge'] = false;
return $init;
}
add_filter('tiny_mce_before_init', 'mce_mod');

function mce_add_buttons( $buttons ){
array_splice( $buttons, 1, 0, 'styleselect' );
return $buttons;
}
add_filter( 'mce_buttons_2', 'mce_add_buttons' );

Referenz

Kontaktangaben im Impressum für alle Websites zentral verwalten

Als mu-plugin realisiert wird das Impressum zentral für alle Websites einer Multisite-Umgebung nutzbar. Der Shortcode impressum integriert das Impressum. Mit der Variable impressum email=“name@tld.de“ kann die E-Mail-Adresse angepasst werden. Sinnvoll ist diese Lösung insbesondere dann, wenn über die Websites hinweg die gleichen Kontakdaten gelten. Sie kann z.B. um dann ebenfalls zentral verwaltete Datenschutzhinweise erweitert werden.

function shortcode_imprint($atts, $content = null) {
 // Die hier angegebene E-Mail-Adresse wird angezeigt, wenn die Variable email bei Eingabe des Shortcodes nicht gesetzt wird.
 extract(shortcode_atts(array( 'email' => '2013@wpdoc.de' ), $atts));
 $return = '<p>Max Mustermann<br />
 Musterstra&szlig;e 5<br />
 43524 Musterhausen<br />
 Telefon 4531 4564761<br />
 E-Mail ' . $email . '</p>';
 return $return;
 }
add_shortcode('impressum', 'shortcode_imprint');

WordPress Daten, Zahlen, Fakten

Vorheriger und nächster Beitrag-Link mit Artikelbild und Zufallsbild als Fallback

single.php

<div id="prev_post">
 <?php
 $prev_post = get_previous_post('true');
 if (!empty( $prev_post )): ?>
 <a href="<?php echo get_permalink( $prev_post->ID ); ?>" title="<?php $prev_post->post_title; ?>" ><?php if ( has_post_thumbnail( $prev_post->ID ) ) { echo get_the_post_thumbnail($prev_post->ID, 'homepage-thumbnail'); } else { ?>
 <img src="<?php bloginfo('template_directory'); ?>/images/artikelbild/start/<?php echo mt_rand(1, 5); ?>.jpg" alt="<?php $prev_post->post_title; ?>" /><?php } ?></a>
 <p><a href="<?php echo get_permalink( $prev_post->ID ); ?>"><?php echo $prev_post->post_title; ?></a></p>
 <?php endif; ?>
</div>

<div id="next_post">
 <?php
 $next_post = get_next_post('true');
 if (!empty( $next_post )): ?>
 <a href="<?php echo get_permalink( $next_post->ID ); ?>" title="<?php $next_post->post_title; ?>" ><?php if ( has_post_thumbnail( $next_post->ID ) ) { echo get_the_post_thumbnail($next_post->ID, 'homepage-thumbnail'); } else { ?>
 <img src="<?php bloginfo('template_directory'); ?>/images/artikelbild/start/<?php echo mt_rand(1, 5); ?>.jpg" alt="<?php $next_post->post_title; ?>" /><?php } ?></a>
 <p><a href="<?php echo get_permalink( $next_post->ID ); ?>"><?php echo $next_post->post_title; ?></a></p>
 <?php endif; ?>
</div>

style.css

#next_post { width:290px; float:right; margin:20px 20px 20px 0; }
#prev_post { width:290px; float:left; margin:20px 0 20px 20px; }

Zweispaltige Artikelausgabe nach Kategorie mit WP_Query und sticky_posts

start.php (Benutzerdefiniertes Seitentemplate)

  • eine CSS-Klasse frontcoluml und eine frontcolumr, die die beiden Spalten formatiert
  • mit der PHP-Variable $postcount wird gezählt, wie viele Beiträge bereits ausgegeben wurden; mit $showposts wird dann die Zahl der noch auszugebenden weiteren Beiträge ermittelt
  • es wird in diesem Beispiel davon ausgegangen das pro Spalte drei Beiträge (post_per_page => 3) aus Kategorie fünf (cat => 5) ausgegeben werden sollen
<div class="frontcoluml">
<?php
$temp = $wp_query;
$wp_query = new WP_Query( array( 'posts_per_page' => '3', 'cat' => 5, 'post__in' => get_option('sticky_posts')));
while ($wp_query->have_posts()) : $wp_query->the_post();
?>
<h3><a href="<?php the_permalink() ?>" title="<?php the_title(); ?>"><?php the_title(); ?></a></h3>
<div class="entry">
<?php the_excerpt(); ?>
</div>
<?php
$postcount++;
endwhile;
wp_reset_postdata();
$showposts = 3 - $postcount;
if ($showposts != 0) {
$temp = $wp_query;
global $more; $more = 0;
$wp_query = new WP_Query( array( 'posts_per_page' => $showposts, 'ignore_sticky_posts' => 1, 'post__not_in' => get_option('sticky_posts'), 'cat' => 5));
while ($wp_query->have_posts()) : $wp_query->the_post();
?>
<h3><a href="<?php the_permalink() ?>" title="<?php the_title(); ?>"><?php the_title(); ?></a></h3>
<div class="entry">
<?php the_excerpt(); ?>
</div>
<?php endwhile;
wp_reset_postdata();
} else {}
unset($postcount);
unset($showposts);
?>
</div>

<div class="frontcolumr">
<?php
$temp = $wp_query;
$wp_query = new WP_Query( array( 'posts_per_page' => '3', 'cat' => 5, 'offset' => 3, 'post__in' => get_option('sticky_posts')));
while ($wp_query->have_posts()) : $wp_query->the_post();
?>
<h3><a href="<?php the_permalink() ?>" title="<?php the_title(); ?>"><?php the_title(); ?></a></h3>
<div class="entry">
<?php the_excerpt(); ?>
</div>
<?php
$postcount++;
endwhile;
wp_reset_postdata();
$showposts = 3 - $postcount;
if ($showposts != 0) {
$temp = $wp_query;
global $more; $more = 0;
$wp_query = new WP_Query( array( 'posts_per_page' => $showposts, 'ignore_sticky_posts' => 1, 'post__not_in' => get_option('sticky_posts'), 'cat' => 5, 'offset' => 3,));
while ($wp_query->have_posts()) : $wp_query->the_post();
?>
<h3><a href="<?php the_permalink() ?>" title="<?php the_title(); ?>"><?php the_title(); ?></a></h3>
<div class="entry">
<?php the_excerpt(); ?>
</div>
<?php endwhile;
wp_reset_postdata();
} else {}
unset($postcount);
unset($showposts);
?>
</div>

Referenz

WordPress Nutzerrollen und ihre Rechte

Grundsätzlich hat eine übergeordnete Nutzerrolle immer die Rechte einer untergeordneten. Der Super Admin existiert nur in einem Multisite-Netzwerk. Entsprechend sind die Rechte eines Administrators hier eingeschränkter.

  • Ein Super Admin verwaltet ein Multisite-Netzwerk.
  • Ein Administrator verwaltet eine Website.
  • Ein Redakteur kann alle Beiträge, Seiten, Kommentare und Kategorien veröffentlichen, bearbeiten und löschen.
  • Ein Autor kann Dateien hochladen, eigene Beiträge veröffentlichen und bearbeiten.
  • Ein Mitarbeiter kann Beiträge erstellen, aber nicht veröffentlichen.
  • Ein Abonnent kann das eigene Nutzerprofil bearbeiten und registriert kommentieren.
Nutzerrechte (1)Super AdminAdmini-stratorRedakteurAutorMitarbeiterAbonnent
MU (2) verwaltenJa
Seiten in MU hinzufügen, bearbeiten, löschenJa
Nutzer in MU hinzufügen, bearbeiten, löschenJa
Themes in MU freischalten, (de)installieren, bearbeitenJa
MU-Einstellungen bearbeitenJa
HTML und Javascript in Seiten, Beiträgen und Kommentaren ausführenJa
Nutzer erstellenJaJa (3)
Nutzer einer Website erstellen, bearbeiten, entfernenJaJa (3)
Plugins aktivieren, löschenJaJa (4)
Plugins installieren, bearbeitenJaJa (3)
WordPress, Themes & Plugins aktualisierenJaJa (4)
Einstellungen (einer Website) bearbeitenJaJa
Themes installieren, löschen, Dateien bearbeitenJaJa (4)
Theme-Einstellungen bearbeitenJaJa
Theme wechselnJaJa
Import/Export-Tool nutzenJaJa
Kommentare moderierenJaJaJa
Kategorien hinzufügen, bearbeiten, löschenJaJaJa
Beiträge/Seiten veröffentlichen, bearbeiten, löschenJaJaJa
private Beiträge/Seiten lesen, bearbeiten, löschenJaJaJa
Dateien hochladenJaJaJaJa
"Meine Seiten"-Menü nutzenJaJaJaJa
eigene Beiträge veröffentlichenJaJaJaJa
eigene Beiträge bearbeiten, löschenJaJaJaJaJa
eigenes Nutzerprofil bearbeitenJaJaJaJaJaJa
Nutzerrechte (1)Super AdminAdmini-stratorRedakteurAutorMitarbeiterAbonnent

Letzte Bearbeitungen Admin Dashboard Widget

Plugin

add_action( 'wp_dashboard_setup', 'dashboard_last_edits_register_dashboard_widget' );
 function dashboard_last_edits_register_dashboard_widget()
 {
 wp_add_dashboard_widget(
 __FUNCTION__, 'K&uuml;rzlich bearbeitete Inhalte', 'dashboard_last_edits_render_dashboard_widget');
 }
function dashboard_last_edits_render_dashboard_widget() { 
 $posts = get_posts(
 array ('numberposts' => 10, 'post_type' => array ( 'post', 'page' ), 'orderby' => 'modified')
 );
 if ( ! $posts )
 {
 print 'Keine Bearbeitungen gefunden. <a href="'
 . admin_url( 'post-new.php' ) . '">Einen Beitrag schreiben.</a>';
 }
 else
 {
 echo '<ul>';
 foreach ( $posts as $post )
 { printf('<li>&raquo; <a href="%1$s">%2$s</a></li>', esc_html( get_permalink( $post->ID )),
 esc_html( $post->post_title )); }
 echo '</ul>';
 }
}

Zentrale Funktionen für Sicherheit und Nutzerfreundlichkeit im WPMU-Netzwerk

Zentrale Datei mit Funktionen, die im kompletten MU-Netzwerk ausgeführt werden.

/wp-content/mu-plugins/general-security-usability.php

<?php
/*
Plugin Name: General Security &amp; Usability
Plugin URI: https://wpdoc.de/?p=81
Description: Grundlegende Einstellungen hinsichtlich Sicherheit, Nutzerfreundlichkeit und Datenschutz.
Author: Johannes Ries
Author URI: http://johannesries.de
Version: 2.1
*/

// NOBLOGREDIRECT Workaround
remove_action( 'template_redirect', 'maybe_redirect_404' );

// Kommentare ohne IP-Adresse und Cookies speichern
add_filter( 'pre_comment_user_ip', '' );
  remove_action( 'set_comment_cookies', 'wp_set_comment_cookies' );// Login-Fehlermeldung bearbeiten
  function failed_login() {
  return 'Die eingegebenen Daten sind fehlerhaft. ';
}
add_filter('login_errors', 'failed_login');

// Dashboard umbennen in Übersicht
add_filter(
'gettext', 'change_names' );
add_filter( 'ngettext', 'change_names' );
function change_names( $translated ) { $translated = str_ireplace(
'Dashboard', '&amp;Uuml;bersicht', $translated );
return $translated;}

// Bilder grundsätzlich mit Datei (nicht Anhangseite) verlinken
update_option('image_default_link_type','file');

// Leere Absätze entfernen
add_filter('the_content', 'remove_empty_p', 20, 1);
function remove_empty_p($content) {
  $content = force_balance_tags($content);
  return preg_replace('#<p>(s|&nbsp;)*+(<brs*/*>)?(s|&nbsp;)*</p>#', '', $content);
}

// Änderungsmöglichkeit für das Farbschema des Administrationsbereich entfernen
function admin_color_scheme() {
  global $_wp_admin_css_colors;
  $_wp_admin_css_colors = 0;
}
add_action('admin_head', 'admin_color_scheme');

// Aktualisierungshinweis nur für Admins in Singlesite-Umgebung bzw. nur für Superadmins in Multisite-Umgebung
add_action(
'plugins_loaded',
function () {
  if (( is_multisite() &amp;&amp; !current_user_can('manage_network') ) || ( !is_multisite() &amp;&amp; !current_user_can('create_users'))) {
  add_action( 'init', create_function( '$a', &quot;remove_action( 'init', 'wp_version_check' );&quot; ), 2 );
  add_filter( 'pre_option_update_core', create_function( '$a', &quot;return null;&quot; ) );
  add_filter( 'pre_site_transient_update_core', create_function( '$a', &quot;return null;&quot; ) );
}
}
);
?>