Support » Allgemeine Fragen » Script aus Core (zer)stört Layout ab Kommentar-Sektion

  • Gelöst pezi

    (@pezi)


    Hallo!
    Hoffe alle erholt und OK?

    Folgender Fall:
    Steady, ein Mitgliedsschaftsdienst (dessen Funktion zu 95% auf deren Server sind, werden ua. auch mittels zvg. WP Plugin integriert) verfügt ua. über einen Switch, um Inhalte für Mitglieder zu zeigen oder zu verstecken.

    Das schaut so aus:
    <script type='steady-switch' data-when="subscription">Hallo Mitglied!</script>
    oder so:
    <script type='steady-switch' data-when="no-subscription">Werde Mitglied!</script>

    Das funzt im Editor bestens.

    Aha, da kann ich doch Mitgliedern anbieten, etwa die (bei uns normalerweise nicht öffentliche (*)) Kommentarfunktion zu nutzen.

    Also machte ich folgendes in die single.php des Childs:
    <script type='steady-switch' data-when="subscription"><?php comments_template(); ?></script>
    Auch das funzt bestens! Nur jene per, Steady eingeloggte Mitglieder sehen die Kommentar-Sektion. Passt!

    Aber:
    Während es für alle User toll aussieht – ist für uns selber, für die in WP eingeloggten Nutzer eine Design-Katastrophe passiert: Die Sidebar fällt komplett aus der Struktur, tümpelt irgendwo herum, uvam. mehr ist im Eimer!

    100 Versuche, das zu reparieren schlugen fehl.
    Es ist auch nicht allein das Switch Script, sondern passiert nur, wenn man damit die Kommentar-Sektion einblendet und in WP angemeldet ist.

    Nach langer Suche fand ich aber die Ursache:
    Ein JS, welches von der \wp-includes\comment-template.php (ca. Zeile 1300) verursacht diesen Konflikt.
    Das schaut so aus:

    function wp_comment_form_unfiltered_html_nonce() {
    	$post    = get_post();
    	$post_id = $post ? $post->ID : 0;
    	if ( current_user_can( 'unfiltered_html' ) ) {
    		wp_nonce_field( 'unfiltered-html-comment_' . $post_id, '_wp_unfiltered_html_comment_disabled', false );
    		echo "<script>(function(){if(window===window.parent){document.getElementById('_wp_unfiltered_html_comment_disabled').name='_wp_unfiltered_html_comment';}})();</script>\n";
    	}
    }

    Baue ich diese Funktion aus, wird das <script> (s. letzte Zeile) nicht mehr in die Kommentar-Sektion der angemeldeten Nutzer eingeschleust und alles funzt bestens!

    So, jetzt die eigentlichen Fragen:
    1. Am Core herumbasteln ist nicht ok und nicht nachhaltig:
    Wie kann man diese Funktion also anders „ausbauen“, abschalten, …? (Da keine BN-Funktion des Themes, fällt überschreiben weg?)
    2. Vmtl. regelt diese Funktion die Erlaubnis, wer HTML im Kommentarfeld verwenden darf. Wenn das weg ist, darf dann jeder HTML verwenden? Problem, oder?

    Danke für etwaigen Input!

    PS: Diese Site geht ab 01/2022 erst neu online. Bis dahin kann ich nur die üblichen Screenshots liefern.

    PS 2: Das Thema beschäftigt mich nun schon länger und von jenem, die es wissen könnten, kommt keine Antwort.

    *) Bisher war diese Funktion bei uns noch mit if (is_user_logged_in()) nur für Autoren zugänglich

Ansicht von 5 Antworten - 1 bis 5 (von insgesamt 5)
  • Ich zitiere mal aus <script>: The Script element:

    Das HTML-Element <script> dient zur Einbettung von ausführbarem Code oder Daten; in der Regel wird es zur Einbettung von oder zum Verweis auf JavaScript-Code verwendet. Das <script>-Element kann auch mit anderen Sprachen verwendet werden, z. B. mit der Shader-Programmiersprache GLSL von WebGL und JSON.

    Innerhalb eines <script>-Tags ein weiteres <script>-Tag auszuführen dürfte nicht valide sein.

    Ich würde die Anzeige von WordPress-Templates eher über is_user_logged_in() regeln. (https://developer.wordpress.org/reference/functions/is_user_logged_in/)

    Thread-Starter pezi

    (@pezi)

    Innerhalb eines <script>-Tags ein weiteres <script>-Tag auszuführen dürfte nicht valide sein.

    Danke, ja stimmt, jetzt isses klar.
    Das kommt im Endeffekt verschachtelt heraus … Sh…

    is_user_logged_in() war, wie gesagt bis jetzt, nur für Autoren usw.

    Doch wenn wir Steady Mitgliedern das Kommentieren erlauben wollen, geht das nur per „Steady Switch“, per JS. Denn diese Mitglieder sind keine in WP angemeldeten Nutzer …

    Ups, klar, Sorry.

    Vielleicht hilft diese Anleitung weiter?
    https://get.steadyhq.help/hc/de/articles/360001801198

    Thread-Starter pezi

    (@pezi)

    Die Paywall ist kein Problem (außer das diese einfachst aushebelbar ist, egal ob als JS Header-Code oder als WP-Plugin)

    Im Falle der Kommentarsektion geht halt nur der Steady Switch und der geht halt nicht, weil ausgerechnet hier ein weiteres JS von WP drin sitzt …

    Ok, wenn man Steady, also auch deren Paywall als JS einbaut, verdeckt diese ab da alles. Nicht nur den Beitrag ab der Schranke, sondern alles. Dh. auch eine Kommentarsektion.
    Aber: Damit werden auch wichtige Teile verdeckt: Footer, Navi mit Impressum zb. usw. Wenn man diese Elemente auch nach oben legen kann – es bleibt auch ein verhunztes Design.
    Daher ists besser, Steady per Plugin einzubauen …

    Thread-Starter pezi

    (@pezi)

    Gelöst!

    Das (von \wp-includes\comment-template.php in die Kommentarsektion eingeschleuste) Script regelt ja, ob der BN ungefiltertes HTML verwenden darf.
    current_user_can( 'unfiltered_html' )
    Wenn ja, gibt echo das (in meinen Fall störende) JS-Script aus, welches (vmtl.) dem Kommentarfeld diese Erlaubnis mitteilt.

    Welcher BN darf den ungefiltertes HTML verwenden?
    Hm, gute Frage. Wie es scheint, nur der Admin und der Redakteur: Stimmt!
    Für alle untergeordneten Rollen wäre alles rotscha!

    Wer kann die Rollen Rechte einfach regeln?
    Oh, ja der User Role Editor!
    Ergo habe ich auch der Rolle Redakteur die Erlaubnis zum ungefiltertes HTML entzogen und es funzt!
    Nun wird dieses Script (für alle Rollen außer dem Admin) nicht mehr erzeugt und da die unzulässige Verschachtelung (im Steady Switch Script) wegfällt – ist das DOM wieder ok!

    Pfuhhhhhh …

Ansicht von 5 Antworten - 1 bis 5 (von insgesamt 5)
  • Das Thema „Script aus Core (zer)stört Layout ab Kommentar-Sektion“ ist für neue Antworten geschlossen.