Support » Allgemeine Fragen » ‚wp_head‘ innerhalb einer Funktion ausführen

  • Gelöst radarin

    (@radarin)


    Guten Morgen

    Mein neues Plugin benötigt eigenes CSS und JS. Derzeit schreibe ich das CSS noch in den Customizer und lade das JS indem ich es direkt in den Header rein geschrieben habe.

    Das Plugin erlaubt unterschiedliche Darstellungsweisen und verwendet dafür unterschiedliches CSS. Auch wird JS nicht in allen Fällen benötigt.

    Da andere Anwender nicht in den Dateien rum basteln müssen, und nur der jeweils nötige code geladen werden soll, habe ich mir überlegt, dies mit

    function hook_css() {
    ?>
       <style>
          .wp_head_example {
             background-color : #f1f1f1;
          }
       </style>
    <?php
    }
    add_action('wp_head', 'hook_css');

    zu lösen. Wenn ich diesen Code ins Code Snippet Plugin schreibe, funktioniert es einwandfrei. Will ich das selbe in einer Funktion ausführen, welche ich mittels add_filter ausführe, funktioniert es nicht.

    function radGlossarFrontend($wort){
       ...
       if ( $darstellung == 1 ){
          function hook_css() {
          ?>
             <style>
             .wp_head_example {
                background-color : #f1f1f1;
             }
             </style>
             <?php
          }
          add_action('wp_head', 'hook_css');
       }
    }
    add_filter('the_content', 'radGlossarFrontend');

    Das Weitere das innerhalb von $darstellung == 1 ausgeführt wird funktioniert. Das wp_head an dieser Stelle zerschiesst die Seite und fügt keinen Code in den Header.

    Der Inhalt von $darstellung definiert, was an CSS und ob JS benötigt wird.

    Gruss René

    • Dieses Thema wurde geändert vor 5 Jahren, 2 Monaten von radarin.
    • Dieses Thema wurde geändert vor 5 Jahren, 2 Monaten von radarin.
Ansicht von 15 Antworten - 1 bis 15 (von insgesamt 15)
  • Das kann nicht funktionieren, da du eine Funktion nicht in einer Funktion definieren kannst.

    Thread-Starter radarin

    (@radarin)

    Also das funktioniert:

    // Verschachtelte Funktionen
    add_shortcode('test-funktion-in-funktion', 'zeigeAutoren');
    function zeigeAutoren() {
      global $ausgabe;
      $ausgabe = "";
      function zeigeAutor() { global $ausgabe; $ausgabe .= "Mann"; }
      function zeigeAutorin() { global $ausgabe; $ausgabe .= " / Frau"; }
      zeigeAutor();
      zeigeAutorin();
      return $ausgabe;
    }

    Je nachdem ob das Glossar die Erklärungen in Sprechblasen oder einer Lightbox anzeigen sollen, brauche ich komplett anderes CSS, und nur die Lightbox benötigt noch JavaScript. Ich möchte ungern unnötiges Gedöns laden.

    Also das funktioniert:

    Mag sein, aber

    a) das ist programmiertechnisch sehr unsauber
    b) das funktioniert nur, weil du die Funktionen in der Funktion aufrufst.

    Thread-Starter radarin

    (@radarin)

    das funktioniert nur, weil du die Funktionen in der Funktion aufrufst.

    Das add_action macht das doch genau so. Das erscheint mir jetzt nicht logisch. Wie soll ich das denn anders machen?

    Durch das Laden des Plugins wird add_filter('the_content', 'radGlossarFrontend'); ausgeführt. Dabei kommt die Funktion radGlossarFrontend zum Einsatz. Diese packt je nach Einstellung ($darstellung 1,2 oder 3) unterschiedliches HTML um die Begriffe. Und je nach Einstellung brauche ich das Eine oder Andere CSS, und JS, oder auch nicht.
    Der nötige Code soll das Plugin in den Herder integrieren. Kann ja nicht sein, dass ein Anwender das selber da rein kopieren muss.

    Das

    function zeigeAutoren() {
      global $ausgabe;
      $ausgabe = "";
      function zeigeAutor() { global $ausgabe; $ausgabe .= "Mann"; }
      function zeigeAutorin() { global $ausgabe; $ausgabe .= " / Frau"; }
      zeigeAutor();
      zeigeAutorin();
      return $ausgabe;
    }

    ist nichts anderes als

    function zeigeAutoren() {
      global $ausgabe;
      $ausgabe = "Mann / Frau"; 
      return $ausgabe;
    }

    Wieso also überhaupt die Funktionen in der Funktion?

    • Diese Antwort wurde geändert vor 5 Jahren, 2 Monaten von bscu.
    Thread-Starter radarin

    (@radarin)

    Ich hab ein Plugin ins Verzeichnis geladen. In der PHP-Datei steht irgendwo add_filter('the_content', 'radGlossarFrontend'); drin. Das bewirkt, dass im Frontend die Funktion radGlossarFrontend ausgeführt wird.

    Diese Funktion lädt den Inhalt einer Tabelle mit Begriffen und Beschreibungen und packt bei der Seitenausgabe zusätzliches HTML um die jeweiligen Begriffe, sodass es beim überfahren des Links die Beschreibung in einer Sprechblase anzeigt. Dafür wird etwas an CSS benötigt. Dieses CSS soll das Plugin selber in den Header schreiben (oder reicht es wenn das CSS im Body steht?), resp. den Verweis auf die CSS-Datei. Dafür ist add_action('wp_head', 'hook_css'); ja da.

    Nun will ich als Alternative zu den Sprechblasen das Ganze auch als Lightbox umsetzen. Dafür wird etwas anderes an HTML um die Begriffe gepackt. Das funktioniert soweit. Hier brauche ich aber ein ANDERES CSS und ich brauche noch JS.

    Die Funktion lädt nicht nur die Begriffe, sie schaut in einer weiteren Tabelle mit den Einstellungen nach, welche Darstellung verwendet werden soll, also Sprechblase oder Lightbox. Und wenn die Funktion das weiss, dann muss sie das entsprechende CSS und JS laden.

    Deshalb muss der Aufruf add_action('wp_head', 'hook_css'); eben in meiner Funktion radGlossarFrontend drin stehen.

    Oder wie soll das anders funktionieren?

    add_action('wp_head', 'hook_css'); funktioniert in deiner Funktion nicht, weil, wenn es ausgeführt wird (in deinem ‚the_content‘ filter) die Action ‚wp_head‘ längst vorbei ist.

    Die wird nur ein Mal ausgeführt, im head (daher der Name).

    Der Filter ‚the_content‘ wird erst ausgeführt, wenn der content ausgegeben wird, da ist der head schon ausgegeben, dein Action Hook tut dort also nichts mehr.

    Thread-Starter radarin

    (@radarin)

    Ok, danke, so erscheint es mir auch logisch.

    Ich muss also in der Plugindatei eine Funktion einrichten (Darstellungsart in der DB abfragen) und diese da sofort aufrufen. Dann müsste die Funktion vor dem Header ausgeführt werden. Und in diese Funktion den wp_head einfügen.

    Du könntest es so in der art machen

    
    function hook_css() {
    // hier von wo auch immer deine darstellungsart holen
    $darstellungsart = [...];
    // hier aussteigen aus der Funktion, wenn es nicht die ist, die den style nutzen soll
    if ($darstellungsart != 1) return;
    //ansonsten styles ausgeben
    ?>
       <style>
          .wp_head_example {
             background-color : #f1f1f1;
          }
       </style>
    <?php
    }
    add_action('wp_head', 'hook_css');
    
    Thread-Starter radarin

    (@radarin)

    Konkret hab ich es jetzt so gelöst:

    <?php
    // CSS und JS in den Header laden
    function glossar_css() {
       global $wpdb;
       // Einstellungen laden
       $set = $wpdb->get_results("SELECT settings_ref, settings_value FROM ".$wpdb->prefix."rad_glossar_settings");
       $settings = array();
       foreach($set as $result){ $settings[$result->settings_ref] = $result->settings_value; }
       // Sprechblase
       if($settings[71] == 1){
          ?>
          <style>
             .css-klasse-ballon {
                color : #ffffff;
             }
          </style>
          <?php
       }
       // Lightbox
       if($settings[71] == 2){
          ?>
          <style>
             .css-klasse-lightbox {
                color : #000000;
             }
          </style>
          <?php
       }
    };
    add_action('wp_head', 'glossar_css');
    ?>

    Jetzt funktioniert es je nach Einstellung einwandfrei. Danke Dir für den Hinweis.

    Warum holst du nicht gleich nur den relevanten Eintrag anstatt die komplette Tabelle zu laden?

    $set = $wpdb->get_var("SELECT settings_value FROM ".$wpdb->prefix."rad_glossar_settings WHERE settings_ref = 71");

    Thread-Starter radarin

    (@radarin)

    ok, stimmt, ich habs auf die schnelle einfach mal aus der anderen Funktion übernommen, dort brauche ich alle Einträge.

    Thread-Starter radarin

    (@radarin)

    $wpdb->get_var funktioniert übrigens nicht. Es muss $result = $wpdb->get_row heissen. Das Array und das foreach kommt auch weg und das if heisst dann if($result->settings_value == 1){.

    get_var sollte eigentlich auch gehen, und den wert direkt in die variable schreiben

    
    $result = $wpdb->get_var(...)
    if($result == 1){ ...
    

    https://developer.wordpress.org/reference/classes/wpdb/get_var/

    Thread-Starter radarin

    (@radarin)

    Stimmt, so geht es letztendlich dann auch.

    🙂

Ansicht von 15 Antworten - 1 bis 15 (von insgesamt 15)
  • Das Thema „‚wp_head‘ innerhalb einer Funktion ausführen“ ist für neue Antworten geschlossen.