Support » Allgemeine Fragen » PHP-Source im Text

  • Gelöst jonn10

    (@jonn10)


    Hallo Forum,
    gibt es die Möglichkeit bisher außerhalb on WordPress verwendete PHP-Codestückchen
    in WordPress-Seiten einzubauen?

Ansicht von 13 Antworten - 1 bis 13 (von insgesamt 13)
  • Am einfachsten geht das über Shortcodes. Beispiel:

    add_shortcode( 'meinphp', 'meinphp_shortcode' );
    function meinphp_shortcode() {
     // beliebigen PHP-Code
     return 'Hallo Welt';
    }

    (Häufig gemachter Fehler: die Shortcode-Funktion darf nur Inhalte zurückgeben (return), nicht ausgeben (echo).)

    Du kannst PHP auch als Code Snippets hinzufügen. Irgendwo muss es nur ausgegeben werden. Wenn du dazu nicht ein Child Theme mit modifizierten Templates anlegen möchtest, sind Shortcodes die einfachste Alternative.

    Thread-Starter jonn10

    (@jonn10)

    Zunächst vielen Dank,
    ich habe die obigen Zeilen genau so in eine Seite eingefügt.
    Wenn ich diese test, so werden diese Originalzeilen angezeigt und nicht „Hallo Welt“.
    Was habe ich da falsch gemacht?

    Wie hast du das eingefügt? Im Seiten-Editor? Dort wird es aus Sicherheitsgründen nicht als Code, sondern als Text behandelt. Sonst könnte ja jeder Benutzer beliebig Code einfügen.

    Wie ich schon schrieb, kannst du entweder das Plugin Code Snippets verwenden, es in die functions.php eines Child Theme einfügen oder ein eigenes Plugin erstellen.

    Thread-Starter jonn10

    (@jonn10)

    Ein wenig weiter bin ich schon – ich muss hinzufügen, dass WordPress für mich Neuland ist im Gegensatz zu html, PHP u.a..
    Habe das Plugin installiert und aktiviert. Dann habe ich über Hinzufügen Deinen Code eingefügt, und jetzt hänge ich.
    Unterhalb von „Übernehmen“ sind Einstellungen auszuwählen:
    – Snippet überall ausführen
    – Nur im Administrationsbereich ausführen
    – Nur im Frontend der Website ausführen
    Da habe ich natürlich Angst, etwas kaputt zu machen.
    Ich möchte ja dieses Snippet nur auf einer bestimmten Seite ausführen.
    Was muss ich also auswählen und wie füge ich es in eine meiner Seiten ein.
    Viele Fragen, aber leider fand ich keine detaillierte Anleitung im Netz
    Besten Dank im Voraus

    Es gibt in WordPress so genannte Coditional Tags, die PHP-Code nur unter bestimmten Bedingungen ausführen. Nehmen wir an, du möchtest den Code nur auf der Seite „Über uns“ ausführen. Das Conditional Tag dazu lautet

    if ( is_page( 'Über uns' ) ) {
      // dein PHP-Code
    }

    Nun ist die Frage, was diesen Code auslösen soll. Dazu gibt es verschiedene Möglichkeiten:

    1. Du verwendest eine der von WordPress zur Verfügung gestellten Schnittstellen (Hooks), z.B. wp_footer:
      add_action( 'wp_footer', 'deine_php_funktion' );
      function deine_php_function() {
        if ( is_page( 'Über uns' ) ) {
        // dein PHP-Code
        }
      }
    2. Du erstellst eine Funktion …
      function deine_php_funktion() {
        if ( is_page( 'Über uns' ) ) {
          // dein PHP-Code
        }
      }

      … und fügst in einem Child Theme an beliebiger Stelle in einem Template den Aufruf der Funktion ein:
      <?php echo deine_php_funktion(); ?>

    3. Du erstellst einen eigenen Shortcode …
      add_shortcode( 'mein_php', 'deine_php_funktion' );
      function deine_php_function() {
        if ( is_page( 'Über uns' ) ) {
        // dein PHP-Code
        }
      }

      … und fügst dann im Editor im Inhalt deiner Seite folgendes ein:
      Lorem ipsum (dein Text) … [mein_php] … weiterer Text deiner Seite

    Das Plugin Code Snippets bietet dir die Möglichkeit, Code-Snippets (nur) bei Bedarf zu aktivieren. Wenn dein Code nur im Backend arbeitet, braucht er im Frontend nicht aktiviert zu sein – deshalb die Frage, wo der Code geladen werden soll. Wenn du also z.B. möchtest, dass ein Shortcode (Variante 3) im Frontend durch deinen PHP-Code ersetzt wird, aktivierst du ihn ausschließlich fürs Frontend.

    Mit dem Plugin kannst du eigentlich nicht viel kaputt machen, weil es bei Programmierfehlern das Snippet selbst deaktiviert. Trotzdem solltest du bei solchen Änderungen immer ein Backup haben und per FTP auf die Dateien auf deinem Webserver zugreifen können.

    Thread-Starter jonn10

    (@jonn10)

    Vielen Dank für die ausführlichen Erläuterungen.
    Daran habe ich jetzt erst einmal zu knabbern.
    Ich werde mich zunächst auf die Variante 3 konzentrieren. die erscheint mir am einfachsten zu sein.

    Warum aber muss ich abfragen „if ( is_page( ‚Über uns‘ ) ) {….“
    wenn ich das „[mein_php]“ nur auf der Seite ‚Über uns‘ einfüge?

    Thread-Starter jonn10

    (@jonn10)

    Hallo,
    ich habe jetzt folgendes versucht, leider tut es nicht das, was ich will.

    function TextVonBis_shortcode($atts) {
      extract(shortcode_atts( array(
    	    'Text' => 'Text fehlt',
    	    'von'  => '1900-01-01',
    	    'bis'  => '2099-12-31'),
        $atts, 'TextVonBis'));	
      if (date('Ymd') >= $von and date('Ymd') <= $bis)
        return $Text;
    }
    add_shortcode( 'TextVonBis', 'TextVonBis_shortcode' );

    Auf der Seite:
    [TextVonBis Text='Hurra es klappt' von='2017-09-20' bis='2017-09-25']

    Es wird leider nichts angezeigt.
    Dann habe ich 3 returns hinzugefügt, um zu sehen, ob die Parameter übergeben wurden:

    
    function TextVonBis_shortcode( $atts ) {
    	extract(
    		shortcode_atts(
    			array(
    				'Text' => 'Text fehlt',
    				'von' => '1900 - 01 - 01',
    				'bis' => '2099 - 12 - 31',
    			), $atts, 'TextVonBis'
    		)
    	);
    	return $von;
    	return ' ** * ';
    	return $bis;
    	if ( date( 'Ymd' ) >= $von and date( 'Ymd' ) <= $bis ) {
    		return $Text;
    	} 
    }
    

    Es wird aber nur der erste return ausgeführt und 2017-09-20 angezeigt.
    Wo liegt mein Anfängerfehler?

    • Diese Antwort wurde geändert vor 6 Jahren, 6 Monaten von Bego Mario Garde. Grund: Code-Auszeichnung korrigiert

    Da haben sich Fehler eingeschlichen.

    • date('Ymd') gibt 20170921 zurück und kann schlecht mit 2017-09-21 verglichen werden.
    • der logische Vergleichsoperator heißt && und nicht and
    • Die Funktion bricht nach dem ersten return ab. Wenn du mehrere Werte zurückgeben möchtest, musst du sie erst in einer Funktion konkatenieren.
    • Es wäre schön, wenn du die Coding Standards einhältst (u.a. kein CamelCase bei Funktionsnamen).

    Um deinen Code zu debuggen, ist es hilfreich, wenn du die Variablen ausgibst und mit dem erwarteten Ergebnis abgleichst. So kannst du z.B. den ersten Fehler vermeiden.

    Probier mal das hier:

    
    <?php
    function textvonbis_shortcode( $atts ) {
    	$a = shortcode_atts(
    		array(
    			'text' => 'Text fehlt',
    			'von'  => '1900-01-01',
    			'bis'  => '2099-12-31',
    		), $atts
    	);
    
    	$now   = new DateTime( 'now' );
    	$date1 = new DateTime( $a['von'] );
    	$date2 = new DateTime( $a['bis'] );
    
    	if ( $now >= $date1 && $now <= $date2 ) {
    		return $a['text'];
    	} else {
    		__return_false();
    	}
    }
    
    add_shortcode( 'textvonbis', 'textvonbis_shortcode' );

    Korrektur: and ist ein zulässiger Operator (ich sehe ihn allerdings äußerst selten).

    Thread-Starter jonn10

    (@jonn10)

    Hi,
    ich bin begeistert über Deine Hilfe und Dein Fachwissen.
    Vielen Dank!

    Funktioniert das denn nun auch wie gewünscht?
    Dann könntest du noch rasch ein Plugin daraus machen. Hört sich viel komplizierter an, als es ist: Du nimmst den Code, packst ihn in eine Datei und setzt oben drüber einen Plugin-Header:

    <?php
    /*
    Plugin Name: Shortcode mit Datum
    Description: Shortcode, der Text ausgibt, wenn das aktuelle Datum in einer vorgegebenen Zeitspanne liegt.
    Author: jonn10
    Version: 1.0
    License: GPL2
    */
    
    if ( ! defined( ABSPATH ) ) {
    	die();
    }
    
    // ab hier dein PHP-Code
    function textvonbis_shortcode( $atts ) {
    	$a = shortcode_atts(
    …

    Das speicherst du, z.B. als shortcodemitdatum.php in einem Verzeichnis shortcodemitdatum, komprimierst das Verzeichnis als .zip-Datei und installierst es dann über das Plugin-Menü. Da Funktionsnamen nicht mehrfach vorkommen dürfen, musst du vor Aktivierung das Code Snippet deaktivieren.

    Thread-Starter jonn10

    (@jonn10)

    Ja, es funktioniert tadellos!
    Welche Vorteile bringt ein Plugin?
    Was bedeutet das Statement

    if ( ! defined( ABSPATH ) ) {
    	die();
    }
    

    ?

    In der Konfigurationsdatei wp-config.php wird die Konstante ABSPATH mit dem absoluten Pfad zu den WordPress-Dateien definiert.

    Mit defined( ABSPATH ) wird geprüft, ob die Konstante definiert ist. Im Umkehrschluss kann angenommen werden, dass das Plugin nicht von WordPress aufgerufen wird, wenn die Konstante nicht definiert wurde.

    Durch das if-Statement bricht die Programmausführung direkt ab, wenn das Plugin von einem Webseitenbesucher direkt und nicht über WordPress aufgerufen wird (die()).

    Hacker versuchen zuerst, möglichst viele Informationen über eine Website herauszufinden. Welche Plugins sind installiert, welche davon haben ggf. bekannte Sicherheitslücken. Wenn ein Plugin bei direktem Aufruf abbricht, wird statt Informationen nur ein leerer Bildschirm angezeigt.

    Ein eigenes Plugin hat gegenüber Snippets den Vorteil, dass nicht ein weiteres Plugin (das Plugin Code Snippets selbst) geladen werden muss. Das spart Arbeitsspeicher und verringert die Wartungskosten für die Website. (Plugins, die nicht installiert sind, müssen nicht aktualisiert werden. Was nicht aktualisiert werden muss, kostet keine Arbeitszeit. Zeit ist Geld.)

    Thread-Starter jonn10

    (@jonn10)

    Erst einmal danke,
    die Erläuterung über den Vorteil von Plugins habe ich allerdings nicht verstanden.
    Du schreibst:
    Ein eigenes Plugin hat gegenüber Snippets den Vorteil, dass nicht ein weiteres Plugin (das Plugin Code Snippets selbst) geladen werden muss.
    Das Snippet muss geladen werden, im anderen Falle aber doch das Plugin. Worin liegt da der Unterschied?
    Du schreibst:
    Das spart Arbeitsspeicher und verringert die Wartungskosten für die Website.
    Wenn etwas ausgeführt wird, muss es doch immer in den Arbeitsspeicher geladen werden?
    Du schreibst:
    Plugins, die nicht installiert sind, müssen nicht aktualisiert werden. Was nicht aktualisiert werden muss, kostet keine Arbeitszeit
    Wenn ich am Snippet nichts ändere, braucht es doch auch nicht aktualisiert werden.

Ansicht von 13 Antworten - 1 bis 13 (von insgesamt 13)
  • Das Thema „PHP-Source im Text“ ist für neue Antworten geschlossen.