Alle Artikel zum Thema “Wordpress”

TinyMCE “stylesheets”-Dropdown nach eigenem Wunsch anpassen

Vom 24.10.2011

Für viele Kundenprojekte würde ich gerne dem Kunden ganz klar definierte Layout-Möglichkeiten bieten. Und NUR diese. Ich entferne in der Regel mittels Plugin “TinyMCE Advanced” alle nicht im Design vorgesehenen Formatierungsbuttons (wie “durchgestrichen”, “geordnete Liste” etc.) und möchte dann dem Kunden mittels “Stylesheets”-Dropdown die Möglichkeit geben ganz bestimmte Styles einfach anwenden zu können.

Das klappt seit einer Weile ja schon gut mittels editor-style.css, was aber daran noch stört ist, dass in der Styles-Liste “ungewollte” styles auftauchen, die ich dem Kunden eben nicht anbieten möchte.

Eine umfassende Beschreibung, um volle Kontrolle über die Styles zu erhalten habe ich bei einer Web-Kollegin alisothegeek.com gefunden. Damit erhält man die volle Kontrolle.

Custom Post Types und Taxonomien

Vom 10.08.2011

Manchmal mag es recht nützlich sein, einen Custom Post Type anzulegen, der dann auch noch verschiedene Eigenschaften hat.

Das geht recht komfortabel über ein Plugin namens Custom Post Type UI , das sowohl das Anlegen des Custom Post Types als auch der dazu gehörigen Taxonomien einfach macht. Wenn man aber sicher gehen möchte, dass auch ohne den Einsatz eines Plugins der Custom Post Type vorhanden ist, kann man den auch durch einen Eintrag in der functions.php seines Themes erstellen.

function post_type_distributors() {
	register_post_type(
                'distributoren',
                array(
                    'label' => __('Distributoren'),
                    'public' => true,
                    'show_ui' => true,
                    'supports' => array(
					'title',
					'editor'
                     )
                )
        );

       register_taxonomy( 'regionen', 'distributoren',
		array(
             'hierarchical' => true,
			 'label' => __('Regionen'),
			 'query_var' => 'regionen',
			 'rewrite' => array('slug' => 'regionen' )
		)
	);

	register_taxonomy( 'branchen', 'distributoren',
		array(
             'hierarchical' => true,
			 'label' => __('Branchen'),
			 'query_var' => 'branchen',
			 'rewrite' => array('slug' => 'branchen' )
		)
	);

}
add_action('init', 'post_type_distributors');

3 Level WordPress Menu

Vom 21.07.2011

Sicherlich könnte ein geübter Programmierer hier eine elegantere Lösung finden aber für meine Zwecke tut dieser Code genau, was er soll.

Ausgangsvoraussetzung: Ich habe eine WordPress-Seite mit drei Menüleveln.

Diese Grafik zeigt, welche Fälle es gibt und wie die Menüs sich verhalten sollen. In meinem Fall sollten die Menüs syntaktisch voneinander getrennt sein, also jedes Menülevel in einem eigenen “Code-Block”, der sich dann per CSS individuell stylen lässt.

CODE:

Nun zum Interessanten! Ein Teil des Codes muss nun in die Theme-Datei an die Stelle, an der das Menü auftauchen soll. Das könnte z.B. die header.php sein oder auch die sidebar.php.

<?php
	//Automatic Submenu
    global $wp_query;
 	//Wenn die Seite ein Grandparent ist, also keine Eltern hat...
    if( empty($wp_query->post->post_parent) )
      {
     		//Herausfinden ob es Kinder gibt...
			$ich=$wp_query->post->ID;
			$children = wp_list_pages("title_li=&child_of=$ich&echo=0");
				if ($children)
				{
					$parent1 = $wp_query->post->ID;
					//Menue ausgeben
					echo "<ul class='submenus'>";
					wp_list_pages("title_li=&child_of=$parent1&depth=1");
					echo "</ul>";
				}
     } 

    else
	//hat Eltern, ist also ein parent
     {
		$ich=$wp_query->post->ID;
		$children = wp_list_pages("title_li=&child_of=$ich&echo=0");
		//UND hat weitere Kinder
		if ($children)
		{
			$parent1 = $wp_query->post->post_parent;
			//MENUE 1 mit Geschwistern aktueller Seite (Kinder von $parent1)
			echo "<ul class='submenus'>";
			wp_list_pages("title_li=&child_of=$parent1&depth=1");
			echo "</ul>";

			$parent2 = $wp_query->post->ID;
			//Menue 2 mit Kindern aktueller Seite ($parent2)
			echo "<ul class='subsubmenu'>";
			wp_list_pages("title_li=&child_of=$parent2&depth=1");
			echo "</ul>";

		}
		else
		{
				if(get_grandpapa())
				{
					$parent1 = get_grandpapa();
					//MENUE 1 mit Geschwistern aktueller Seite (Kinder von $parent1)
					echo "<ul class='submenus'>";
					wp_list_pages("title_li=&child_of=$parent1&depth=1");
					echo "</ul>";

					$parent2 = $wp_query->post->post_parent;
					//Menue 2 mit Kindern aktueller Seite ($parent2)
					echo "<ul class='subsubmenu'>";
					wp_list_pages("title_li=&child_of=$parent2&depth=1");
					echo "</ul>";
				}
				else
				{
					$parent1 = $wp_query->post->post_parent;
					//NUR Menue 1 mit Geschwistern aktueller Seite (Kinder von $parent1)
					echo "<ul class='submenus'>";
					wp_list_pages("title_li=&child_of=$parent1&depth=1");
					echo "</ul>";
				}
		}
	}

	?>

Zusätzlich habe ich noch einen Schnipsel Code, den ich bei Stackxchange gefunden habe in die functions.php eingebaut.

//Three levels of hell... get ID of grandparent page
function get_grandpapa($page_id){
    $current_page = get_page( $page_id );
    if ($current_page->post_parent > 0){
        //has at least a parent
        $parent_page = get_page($current_page->post_parent);
        if ($parent_page->post_parent > 0){
            return $parent_page->post_parent;
        }else{
            return false;
        }
    }
    return false;
}

Dieser Schnipsel findet die ID der Großvaterseite heraus. So kann diese als Startpunkt für die Darstellung des Menüs verwendet werden.

Das war der ganze Zauber. So lässt sich WordPress als CMS nutzen.



Private Seiten im Menü anzeigen

Vom 29.05.2011

Problem:

Der Standard-Aufruf von Seitenmenüs in WordPress listet keine privaten Seiten. Die möchte ich aber gerne anzeigen lassen. Z. B bei Einrichtung eines privaten Benutzerbereiches.

Das Problem lässt sich z.B. mit einer Änderung der Core-Dateien regeln in der die Abfrage geändert wird. DAS will ich aber auf keinen Fall. Eine andere Lösung, die ich in einem Forum gefunden habe war eine Abfrage auf das Recht des Benutzers, private Seiten zu lesen und dann das manuelle Einfügen von Links. Auch das möchte ich nicht. Es soll doch bittschön auch komfortabel sein.

Diese Abfrage auf das Benutzerrecht hat mich aber auf eine Idee gebracht. Und hier ist meine Lösung:

1. In der Functions.php einen neuen Menübereich anlegen

function my_custom_menus() {
   register_nav_menus(
    array(
      'private-menu' => __( 'Private Seiten' )
	)
    );
}

2. Ein neues Menü mit den gewünschten Seiten erstellen

3. den folgenden Code in die Theme-Datei packen:

<?php // add private menu to your navigation menu
if(current_user_can('read_private_pages')) {
    wp_nav_menu( array( 'theme_location' => 'private-menu'));
 } ?>

Damit werden nach Anmeldung eines berechtigten Benutzers die Privaten Seiten angezeigt.

Posts aus einer Kategorie auf einer Seite listen

Vom 28.05.2011

Dieses Problem stellt sich mir immer und immer wieder. Ich möchte eine Seite namens “NEWS” haben, die sich nahtlos in mein WordPress CMS einfügt. Auf dieser Seite sollen nun meine News-Posts angezeigt werden.

Du Dummi, werden jetzt einige WordPress-Freaks sagen. Du kannst doch einfach die Kategorie anzeigen lassen. Seit den neuen Custom Menüs in WordPress kann man ja nun auch Kategorien einfach in das Menü einfügen und anzeigen lassen. Natürlich geht das. Es gibt auch einige Plugins, die ich schon probiert habe. Einen kleinen Beitrag dazu habe ich hier geschrieben Query Posts und Shortcode Any Widget benutzen um Posts auf einer Seite anzuzeigen. (<– das funktioniert) oder auch das Pages Posts Plugin sowie List Category Posts Plugin .

Ich habe zumindest einige davon ausprobiert und immer wieder das gleiche Problem gehabt (außer bei Query Posts und Shortcode Any): Es wurde zwar alles fein angezeigt, aber mein Menu-Highlighting ist zum Teufel gegangen. Ebenso haben eventuell eingerichtete Custom Sidebars nicht mehr funktioniert… Also … ein eigenes Template muss her. Eins, das die Seite als Seite belässt (also auch all ihre Eigenschaften) und trotzdem eine Liste der Posts anzeigt.

<?php if (have_posts()) : ?>
    <?php while (have_posts()) : the_post(); ?>

        <div class="entry">
          <?php the_content(); ?>
	</div><!--entry-->

      <p class="postmetadata"><?php edit_post_link('bearbeiten'); ?></p>
   <?php endwhile; ?>

 <?php
 //NEWS-Posts anzeigen
	$displayposts = new WP_Query();
	 //get posts from your news category
	 $displayposts->query('cat=1&showposts=3');
	while ($displayposts->have_posts()) : $displayposts->the_post();?>

         <div class="aktuell-beitrag">
		<a href="<?php the_permalink(); ?>"><?php the_title(); ?></a> <?php edit_post_link('E', '', ''); ?>	<br />
		<div class="post-date"><?php the_time('d.m.Y') ?></div>

                <?php  the_excerpt(); ?>
	</div>

	<?php endwhile; ?>

  <?php else : ?>
    <h2 class="center">Nicht gefunden</h2>
	<div class="entry">
    <p class="center">Diese Seite wurde leider nicht gefunden. Bitte verwenden Sie die Navigation.</p>
	</div>
  <?php endif; ?>

Das Ganze muss natürlich in ein Page-Template und dann bei der gewünschten Seite ausgewählt werden.

WordPress Custom Post Types und individuelle Templates

Vom 24.05.2011

Seit der Version 2.9. gibt es ja bei WordPress die wunderbaren Custom Post Types. Diese verwende ich z.B. für Referenzen. Dazu kann man den Custom Post Type noch um individuelle Felder erweitern. Z.B. mit Plugins wie Easy Post Type oder More Fields. In meinem Fall würde ich die Referenzen gerne auf eine bestimmte Art und Weise anzeigen lassen und dazu eine ganz individuelle Formatierung verwenden.

Dazu habe ich bei WPTavern den passenden Code-Schnipsel gefunden.

function post_type_add_template() {
$post_type = get_query_var('post_type');
if (!empty($post_type)) {
locate_template(array("{$post_type}.php","index.php"), true);
  exit;
}
}
add_action('template_redirect', 'post_type_add_template'); 

Dieser Code muss in die functions.php eingefügt werden und sucht dann nach einer Theme-Datei, die denselben Namen hat wie der jeweilige Custom Post Type. Wenn ich also wie in meinem Fall den Type “Referenzen” habe, muss ich nur eine Theme-Datei mit Namen “referenzen.php” einfügen und schon ist der Käs gegessen.

Text innerhalb von WordPress Posts oder Seiten ersetzen

Vom 11.05.2011

Heute habe ich mal wieder aus einer Notwendigkeit heraus einen Code-Schnipsel gefunden, der mir sicherlich auch in Zukunft noch gute Dienste leisten wird.

Um einen beliebigen Text mit “Suchen und Ersetzen” – Funktionalität in allen WordPress-Seiten und –Posts zu ersetzen kann im PHPMyAdmin in das SQL-Befehlsfenster folgender Code verwendet werden:

UPDATE wp_posts SET post_content = REPLACE (post_content, 'ALTER TEXT', 'NEUER TEXT')

Damit werden ALLE Vorkommnisse von “ALTER TEXT” durch “NEUER TEXT” ersetzt.

Zu beachten ist hier natürlich das Prefix. Wenn in der wp_config.php ein anderer Tabellenprefix festgelegt wurde, muss natürlich wp_posts durch meinprefix_posts ersetzt werden.

Erweiterte Benutzerinfos in WordPress – in CForms automatisch verwenden

Vom 06.05.2011

Wieder mal eine Herausforderung.

Lage: Es gibt ein “Kontaktformular” mit DEM Kontaktformular – Plugin CForms, durch das Benutzer/Kunden auf der Seite eine Bestellung abgeben können. Dieser Vorgang wiederholt sich teilweise wöchentlich. Um Fehler zu verhindern und dem Kunden die Sache einfacher zu machen wollte ich versuchen, wichtige Informationen direkt aus den Benutzerinformationen des angemeldeten Benutzers herauszulesen (Wir gehen hier davon aus, dass jeder Kunde ein WordPress Benutzerkonto benötigt, um Bestellungen abzugeben).

Für die wichtigsten Standardinformationen hat CForms schon vorgesorgt. Es gibt Variablen, die die Standard-Benutzerinformationen des angemeldeten Benutzers auslesen. Diese können dann bei der Erstellung des Formulars verwendet werden. Zum Beispiel als Default-Wert:

cforms-variable

In dem mir vorliegenden Fall wollte ich aber noch einen Schritt weiter gehen und ein paar Zusatzfelder haben, in die ich weitere benutzerspezifische Informationen eingeben kann und die später AUCH im Formular automatisch ausgefüllt werden sollten. In diesem Fall die Felder “Firmenname” und “Ansprechpartner”.

Daraus ergeben sich zwei “Aufgaben”.

1. müssen die zusätzlichen Felder beim Anlegen eines neuen Benutzers in der Maske auftauchen, damit ich die Werte für “Firmenname” und “Ansprechpartner” überhaupt eintragen kann.

2. muss CForms informiert werden, dass es diese neuen Informationen gibt und es muss jeweils eine im Formular verwendbare Variable angelegt werden ( {Firmenname} und {Ansprechpartner} )

Um den ersten Schritt zu bewältigen gab es nach einiger Recherche für mich zwei Möglichkeiten. Entweder kann ich die zusätzlichen Felder durch eine Anpassung der functions.php erreichen (hat den Vorteil, dass die Felder damit an mein Theme gebunden sind und bei einem Umzug auf ein anderes System automatisch gleich wieder mit dabei sind. Mehr Informationen zu dieser Methode gibt es bei Justin Tadlock. Seine Anleitung ist einfach zu verstehen und funktioniert hervorragend.

Die zweite Möglichkeit ist der Einsatz eines Plugins. Auch hier habe ich mehrere versucht und bin letztlich sehr zufrieden mit der Leistung von Register Plus Redux. Das Plugin bietet mir neben dem Einfügen zusätzlicher Felder auch noch weitere nützliche Anpassungsmöglichkeiten.

Ich habe mich der Einfachheit halber für die zweite Variante entschieden.

Erster Schritt ist natürlich die Installation des Plugins Register Plus Redux. Nach der Aktivierung des Plugins findet man unter “Einstellungen” die Optionen. Hier gibt es auch einen Block “Weitere Felder”. Dort können beliebige neue Felder für die Profilseite angelegt werden.

Damit ist unser erster Schritt schon abgefrühstückt. Im Profil sieht das dann so aus:

So sehen die neuen Felder im Profil aus.

Der zweite Schritt ist leider mit einem Eingriff in die Core-Dateien des Plugins CForms verbunden. Sollte dies jemand lesen, der eine bessere Idee hat bin ich natürlich sehr dankbar für Hinweise. Bis dahin mache ich es eben so: Die Datei ‘plugins/cforms/lib_aux.php wird im Bereich von Zeile 860 (bei mir… keine Garantie) durch folgende zwei Code-Zeilen ergänzt:


$m     = str_replace( '{Firmenname}',        $CurrUser->firmenname, $m );
$m     = str_replace( '{Ansprechpartner}',        $CurrUser->ansprechpartner, $m );


Damit haben wir CForms mitgeteilt, dass die beiden Variablen {Firmenname} und {Ansprechpartner} mit den Werten aus den eben erstellten Feldern befüllt werden sollen.

Damit sind wir fertig und können nun im Cforms Formular die zwei neuen Variablen verwenden.

cforms-neue-variablen

Und wenn die Informationen im Profil angegeben sind, sieht das Formular für den angemeldeten Benutzer dann so aus:

cforms-front-felder

Diese Anleitung dient in der Hauptsache meiner eigenen Dokumentation. Sollte sie für Dich hilfreich sein, freue ich mich natürlich!

Individueller User-Bereich für Kunden

Vom 05.04.2011

Heute hatte ich mal wieder einen Grund, mich in die Eingeweide von WordPress zu wühlen. Die Aufgabenstellung war folgende:

Der Besitzer der WordPress-Seite sollte in der Lage sein, Benutzer anzulegen (seine Kunden), denen dann, nachdem Sie sich am WordPress angemeldet haben eine für sie ganz individuelle Seite angezeigt wird, auf der ihnen der Admin ganz auf sie zugeschnittene Inhalte präsentieren kann. Hilfreich wäre eine solche Funktion z.B. für Designer, die ihren Kunden einen aktuellen Fortschritt ihrer Arbeit präsentieren wollen oder Fotografen, die jedem Kunden nur SEINE Hochzeitsfotos zum Ansehen geben möchten.

Also habe ich mich erst einmal auf dem “Markt” umgetan um herauszufinden, ob es so etwas schon gibt (am Besten natürlich als Plugin). Diese Suche verlief ergebnislos. Alle Plugins, die sich mit Member-Areas o.Ä. befassen arbeiten mit Rollen. Das heißt, sie geben ALLEN Benutzern einer bestimmten Rolle die Rechte auf bestimmte Seiten. In meinem Fall soll aber ein anderer Benutzer nicht auf die Seite des Kunden zugreifen können, selbst wenn er irgendwie in den Besitz der direkten URL zur Seite des anderen Benutzers käme.

In den WordPress-Foren gibt es schon einige Artikel, die sich eben mit diesem Wunsch/Problem auseinander setzen. Dort erhielt ich erste Anregungen, wie man das Problem angehen könnte. Z.B. in diesem sehr ausführlichen Beitrag von JTWilcox.

Sein Ansatz in der Zusammenfassung.

  • Es wird eine Seite mit dem Namen des Kunden angelegt (muss gleich sein)
  • Die Seite wird versteckt (auf “Privat” geschaltet)
  • Es wird ein Seiten-Template angelegt, das den Namen des Benutzers mit dem Namen der aktuellen Seite vergleicht und den Zugriff nur erlaubt, wenn sie übereinstimmen.
  • Der Benutzer wird nach Login direkt auf “seine” Seite umgeleitet (Peter’s Login Redirect)

Das ist schon nicht schlecht. Was mich allerdings noch etwas störte war die Verpflichtung, beim Erstellen der Seiten genau auf den Namen der Seite achten zu müssen, damit sie genau dem Benutzernamen des Kunden gleicht. Das Fehlerpotential hier erschien mir zu hoch.

Was ich aber durchaus übernehmen wollte war die Idee, ein spezielles Seiten-Template zu haben (für die Kunden-Seiten), das dann abfragt, ob der aktuelle Benutzer auch berechtigt ist, diese Seite zu sehen.

Um die Kontrolle über den berechtigten Benutzer zu erhalten habe ich mir vorgestellt, dass ich gerne irgendwo in den Meta-Informationen einer Seite per Drop-Down definieren würde, welcher der im Blog angelegten Benutzer (neben dem Admin) alleinigen Zugriff auf diese Seite haben dürfte. Es musste also eine Meta-Box her, in der dieses Drop-Down zu finden ist.

Auch dazu habe ich mir eine Anleitung gefunden, die mir geholfen hat, diese Aufgabe zu bewältigen. “How to create a custom WordPress Meta Box” Hier habe ich mir den Code aus dem Tutorial kopiert und leicht für meinen Zweck angepasst (Namen geändert). In die Datei, die den Inhalt der neuen Meta-Box darstellt habe ich eine User-Liste von WordPress ausgelesen und als Dropdown ausgeben lassen. (wieder mit Hilfe eines Tutorials).

Hier muss ein Ordner mit zwei Dateien ins Theme-Verzeichnis kopiert werden und die functions.php modifiziert werden. Leider weiß ich (noch) nicht, wie man das Ganze in ein komfortableres Plugin zusammenfassen kann, Es ist bei meiner Lösung noch ein wenig Handarbeit nötig (Sollte jemand Zeit und Lust haben, aus diesem Ansatz ein Plugin zu machen… gerne!!)

Nun musste im Seiten-Template (nach JTWilcox) die Abfrage leicht geändert werden, damit nun nicht mehr Seitenname mit Benutzernamen verglichen wurde, sondern Benutzername (des angemeldeten Benutzers) mit berechtigtem Benutzer (aus dem Drop-Down in den Seiteneigenschaften).

Zuletzt habe ich das Plugin “Peters Login Redirect” installiert um den neuen Benutzer direkt auf “seine” Seite zu leiten, nachdem er sich angemeldet hat.

Die Lösung, wie ich sie aktuell verwende stelle ich hier zum Download bereit (Template ist passend für “Twentyten”).

Anleitung:

Zip-Datei mit allen nötigen Dateien herunterladen. Sie enthält einen Ordner namens “user-access”. Diesen kompletten Ordner musst Du in das Verzeichnis Deines Themes kopieren. Dann musst Du Dich nochmal speziell um Functions.php und page-template-client.php kümmern. (s. Anleitung)

Dateibeschreibungen – Installationsanleitung

functions.php – Der code aus dieser Datei muss in die Datei functions.php Deines aktuellen Themes kopiert werden. Wenn Du keine functions.php hast, kopiere einfach diese in Dein Theme-Verzeichnis.

page-template-client.php – Das ist das Seiten-Template für Deine Client-Seiten. Wenn Du das Twentyten Theme verwendest kannst Du die Datei einfach in Dein Theme-Verzeichnis kopieren. Wenn Du ein anderes Theme verwendest, musst Du sie entsprechend anpassen

user-access.php – In dieser Datei befindet sich das, was in der META-Box unter dem Editor-Fenster aufgerufen wird. Also unser Dropdown mit den im System angelegten Benutzern. Falls Du mal den Text ändern willst.

user-access.css – Die CSS-Datei dazu. Die habe ich selber gar nicht angerührt. Sie stammt original aus dem Tutorial.

NOCH EIN SCHRITT

Plugin “Peter’s Login Redirect” installieren.

Bedienungsanleitung:

Wenn Du alle Dateien wie vorgegeben untergebracht hast, gehst Du wie folgt vor, um eine Kundenseite einzurichten:

1. Lege einen Benutzer für Deinen Kunden an (Rolle “Subscriber” bzw. Abonnent reicht)

2. Lege ihm eine Kundenseite an. Am Besten als Unterseite einer “Kunden”-Seite, damit nicht alles durcheinander wird

3. Verändere den Status auf “Privat”

4. Wähle das Seitentemplate “Clients” aus

5. Wähle den zugriffsberechtigten Benutzer aus dem Dropdown aus. – Seite speichern!

6. Kopiere die URL der soeben angelegten Seite

7. Unter “Einstellungen” – Login Redirects kannst Du für den Kunden ein Redirect zu “seiner” Seite anlegen. Wähle hier den Benutzer aus und füge die eben kopierte URL ein. Speichern, FERTIG.

Sooo… das war erstmal eine flotte, wahrscheinlich völlig unverständliche Zusammenfassung FÜR MICH, damit ich das Ganze in meinem stetig fortschreitenden Alter nicht vergesse. Ich hoffe, ich werde bald mal Zeit haben, die Sache zu überarbeiten und richtig präsentabel zu machen. Vielleicht hilft’s ja jemandem.

Custom Field Matrix

Vom 16.02.2011

Ich habe zwar noch keine Ahnung, wo und wie ich dieses gerade neu entdeckte Plugin verwenden werde, aber ICH WERDE es verwenden. Das ist eine weitere aufregende Erweiterung von WordPress um tolle Funktionen

Custom Field Matrix

Wunderbar!