Anpassen der WordPress-Suchformularvorlage (Genesis)

Lesezeit: 9 Minuten

Benutzeravatar von SilverLink
SilberLink

Ich wollte mein Suchformular etwas ändern, indem ich hinzufügte autocomplete="off" zur Sucheingabe.

Ich suchte zunächst nach einem einfachen Filter wie dem folgenden:

//* Customize search form input box text
add_filter( 'genesis_search_text', 'sp_search_text' );
function sp_search_text( $text ) {
    return esc_attr( 'Search my blog...' );
}

Aber weil die /genesis/lib/structure/search.php hatte keine Variable wie autocomplete="%s", dieses Attribut konnte nicht gezielt beliefert werden. Wahrscheinlich musste ich es direkt vorstellen, also habe ich das kopiert search.php vom übergeordneten Designordner in den Ordner des untergeordneten Designordners.

Der ursprüngliche Code der Datei lautete wie folgt:

<?php

/**
 * Replace the default search form with a Genesis-specific form.
 *
 * The exact output depends on whether the child theme supports HTML5 or not.
 *
 * Applies the `genesis_search_text`, `genesis_search_button_text`, `genesis_search_form_label` and
 * `genesis_search_form` filters.
 *
 * @since 0.2.0
 *
 * @return string HTML markup for search form.
 */

add_filter( 'get_search_form', 'genesis_search_form' );

function genesis_search_form() {
    $search_text = get_search_query() ? apply_filters( 'the_search_query', get_search_query() ) : apply_filters( 'genesis_search_text', __( 'Search this website', 'genesis' ) . ' &#x02026;' );

    $button_text = apply_filters( 'genesis_search_button_text', esc_attr__( 'Search', 'genesis' ) );

    $onfocus = "if ('" . esc_js( $search_text ) . "' === this.value) {this.value="";}";
    $onblur  = "if ('' === this.value) {this.value="" . esc_js( $search_text ) . "";}";

    // Empty label, by default. Filterable.
    $label = apply_filters( 'genesis_search_form_label', '' );

    $value_or_placeholder = ( get_search_query() == '' ) ? 'placeholder' : 'value';

    if ( genesis_html5() ) {

        $form  = sprintf( '<form %s>', genesis_attr( 'search-form' ) );

        if ( genesis_a11y( 'search-form' ) ) {

            if ( '' == $label )  {
                $label = apply_filters( 'genesis_search_text', __( 'Search this website', 'genesis' ) );
            }

            $form_id = uniqid( 'searchform-' );

            $form .= sprintf(
                '<meta itemprop="target" content="%s"/><label class="search-form-label screen-reader-text" for="%s">%s</label><input itemprop="query-input" type="search" name="s" id="%s" %s="%s" /><input type="submit" value="%s" /></form>',
                home_url( '/?s={s}' ),
                esc_attr( $form_id ),
                esc_html( $label ),
                esc_attr( $form_id ),
                $value_or_placeholder,
                esc_attr( $search_text ),
                esc_attr( $button_text )
            );

        } else {

            $form .= sprintf(
                '%s<meta itemprop="target" content="%s"/><input itemprop="query-input" type="search" name="s" %s="%s" /><input type="submit" value="%s"  /></form>',
                esc_html( $label ),
                home_url( '/?s={s}' ),
                $value_or_placeholder,
                esc_attr( $search_text ),
                esc_attr( $button_text )
            );
        }


    } else {

        $form = sprintf(
            '<form method="get" class="searchform search-form" action="%s" role="search" >%s<input type="text" value="%s" name="s" class="s search-input" onfocus="%s" onblur="%s" /><input type="submit" class="searchsubmit search-submit" value="%s" /></form>',
            home_url( "https://stackoverflow.com/" ),
            esc_html( $label ),
            esc_attr( $search_text ),
            esc_attr( $onfocus ),
            esc_attr( $onblur ),
            esc_attr( $button_text )
        );

    }

    return apply_filters( 'genesis_search_form', $form, $search_text, $button_text, $label );

}

Dann habe ich den Originalfilter entfernt und meinen Filter hinzugefügt:

remove_filter( 'get_search_form', 'genesis_search_form' );

add_filter( 'get_search_form', 'my_search_form' );

Und hinzugefügt autocomplete="off" zur Sucheingabe, also ist der Strom:

<?php

/**
 * Replace the default search form with a Genesis-specific form.
 *
 * The exact output depends on whether the child theme supports HTML5 or not.
 *
 * Applies the `genesis_search_text`, `genesis_search_button_text`, `genesis_search_form_label` and
 * `genesis_search_form` filters.
 *
 * @since 0.2.0
 *
 * @return string HTML markup for search form.
 */

remove_filter( 'get_search_form', 'genesis_search_form' );

add_filter( 'get_search_form', 'my_search_form' );

function my_search_form() {
    $search_text = get_search_query() ? apply_filters( 'the_search_query', get_search_query() ) : apply_filters( 'genesis_search_text', __( 'Search this website', 'genesis' ) . ' &#x02026;' );

    $button_text = apply_filters( 'genesis_search_button_text', esc_attr__( 'Search', 'genesis' ) );

    $onfocus = "if ('" . esc_js( $search_text ) . "' === this.value) {this.value="";}";
    $onblur  = "if ('' === this.value) {this.value="" . esc_js( $search_text ) . "";}";

    // Empty label, by default. Filterable.
    $label = apply_filters( 'genesis_search_form_label', '' );

    $value_or_placeholder = ( get_search_query() == '' ) ? 'placeholder' : 'value';

    if ( genesis_html5() ) {

        $form  = sprintf( '<form %s>', genesis_attr( 'search-form' ) );

        if ( genesis_a11y( 'search-form' ) ) {

            if ( '' == $label )  {
                $label = apply_filters( 'genesis_search_text', __( 'Search this website', 'genesis' ) );
            }

            $form_id = uniqid( 'searchform-' );

            $form .= sprintf(
                '<meta itemprop="target" content="%s"/><label class="search-form-label screen-reader-text" for="%s">%s</label><input itemprop="query-input" type="search" name="s" id="%s" %s="%s" autocomplete="off" spellcheck="false" autocorrect="off" autocapitalize="off" dir="auto" /><input type="submit" value="%s" /></form>',
                home_url( '/?s={s}' ),
                esc_attr( $form_id ),
                esc_html( $label ),
                esc_attr( $form_id ),
                $value_or_placeholder,
                esc_attr( $search_text ),
                esc_attr( $button_text )
            );

        } else {

            $form .= sprintf(
                '%s<meta itemprop="target" content="%s"/><input itemprop="query-input" type="search" name="s" %s="%s" autocomplete="off" spellcheck="false" autocorrect="off" autocapitalize="off" dir="auto" /><input type="submit" value="%s"  /></form>',
                esc_html( $label ),
                home_url( '/?s={s}' ),
                $value_or_placeholder,
                esc_attr( $search_text ),
                esc_attr( $button_text )
            );
        }


    } else {

        $form = sprintf(
            '<form method="get" class="searchform search-form" action="%s" role="search" >%s<input type="text" value="%s" name="s" class="s search-input" onfocus="%s" onblur="%s" autocomplete="off" spellcheck="false" autocorrect="off" autocapitalize="off" dir="auto" /><input type="submit" class="searchsubmit search-submit" value="%s" /></form>',
            home_url( "https://stackoverflow.com/" ),
            esc_html( $label ),
            esc_attr( $search_text ),
            esc_attr( $onfocus ),
            esc_attr( $onblur ),
            esc_attr( $button_text )
        );

    }

    return apply_filters( 'my_search_form', $form, $search_text, $button_text, $label );

}

Auf der Startseite funktioniert es derzeit einwandfrei, aber auf jeder anderen Seite werden nur der Header und die Tagline generiert. Ich konnte die Parent-Theme-Dateien direkt bearbeiten, wollte aber eine Alternative, um nicht alles durcheinander zu bringen. Irgendwelche Erkenntnisse oder Vorschläge?


Dokumentation für get_search_form

Dokumentation für genesis_search_form

Dokumentation für Genesis Snippets

  • Wo bist du my_search_form() Funktion?

    – Slava

    8. März 2017 um 14:20 Uhr

  • In der searchform.php entferne ich das Original genesis_search_form() filtern und ersetzen Sie alle Instanzen von genesis_search_form() mit my_search_form() und füge die hinzu autocomplete="off" zum Code. Die Fehler sind Fehler 500, bei dem die gesamte oder Teile der Seite weiß erscheinen, es scheint, dass der Code außerhalb seines ursprünglichen Speicherorts nicht richtig ausgeführt werden kann, aber ich wollte eine Alternative, um das direkte Bearbeiten des übergeordneten Themenrahmens zu vermeiden.

    – Silverlink

    8. März 2017 um 15:40 Uhr


  • Was ist der Grund für das Entfernen des Originals … Es sollte keinen Grund geben, dass dies Ihr neues Formular beeinflussen würde, solange Sie Ihr Formular anstelle von Genesis aufrufen.

    – Cayce K

    10. März 2017 um 20:06 Uhr

  • Dachte, dass es Konflikte geben würde. Aber es dort zu haben, half so oder so nicht.

    – Silverlink

    10. März 2017 um 20:53 Uhr

  • Auf der Startseite funktioniert es derzeit einwandfrei, aber auf jeder anderen Seite werden nur der Header und die Tagline generiert.

    – Silverlink

    10. März 2017 um 21:24 Uhr

Benutzeravatar von Christos Lytras
Christos Lytras

Ich sehe das genesis_search_form Funktion gilt genesis_search_form am Ende filtern. Anstatt das Ganze neu zu schreiben genesis_search_form Funktion, die Sie verwenden können, um das Formular zu manipulieren und zu verwenden DOMDocument in einem neuen Filter, um die hinzuzufügen autocomplete gewünschtes Attribut. Probieren Sie den folgenden Code in Ihrem Child-Theme aus functions.php und schau ob es geht:

add_filter( 'genesis_search_form', 'my_search_form_filter', 5 );
function my_search_form_filter($form) {

    $document = new DOMDocument();
    $document->loadHTML($form);
    $xpath = new DOMXPath($document);
    $input = $xpath->query('//input[@name="s"]');
    if ($input->length > 0) {
        $input->item(0)->setAttribute('autocomplete', 'off');
    }

    # remove <!DOCTYPE 
    $document->removeChild($document->doctype); 
    # remove <html><body></body></html> 
    $document->replaceChild($document->firstChild->firstChild->firstChild, $document->firstChild);
    $form_html = $document->saveHTML();

    return $form_html;
}

Vergessen Sie nicht, Ihren Code zu deaktivieren, der die Standardeinstellung deaktiviert get_search_form filtern und Ihre hinzufügen.

BEARBEITEN

Der vorherige Code war falsch, bitte aktualisieren Sie ihn mit dem neuesten Code, der funktioniert. Ich habe es mit getestet genesis und genesis-child Themen.

Hier findest du meine Entwickler WordPress Seite mit der genesis Thema installiert und Sie können das Sucheingabefeld überprüfen und sehen, dass es das hat autocomplete Attribut gesetzt auf off: http://wp.dev.lytrax.net/

Und hier ist ein Screenshot, der das Eingabeelement für die Formularsuche mit dem zeigt autocomplete Attribut:

Wordpress-Screenshot

BEARBEITEN 2

Das genesis-sample Thema, verwendet das HTML5-Suchformular und enthält einige meta Tags innerhalb des Codes, die createDocumentFragment Element kann mit umgehen appendXML, daher gibt es viele Warnungen aus und kann nicht fortgesetzt werden. Sie können diese PHP-Warnungen nicht sehen, da Sie sie höchstwahrscheinlich deaktiviert haben. Bitte versuchen Sie meinen aktualisierten Code. Fügen Sie es am Ende der hinzu genesis-sample/functions.php Datei und prüfen Sie, ob sie die autocomplete Attribut.

  • Danke für Ihre Antwort. Dein Ansatz ist interessant. Aber ich denke, dass da etwas nicht stimmt, wenn ich diesen Code in den wright functions.php nur die head und eine leere body ohne Klassen werden auf allen Seiten generiert.

    – Silverlink

    10. März 2017 um 22:36 Uhr

  • @SilverLink Bitte sehen Sie sich meine aktualisierte Antwort an und probieren Sie den neuen Code aus. Vergessen Sie nicht, alle Filter und Änderungen, die Sie an den Suchfunktionen des Genesis-Themes vorgenommen haben, zu deaktivieren.

    – Christos Lytras

    10. März 2017 um 22:52 Uhr

  • Danke für den Versuch. Es tut mir so leid, aber ich kann Ihr Beispiel einfach nicht reproduzieren, selbst nachdem ich ein neues Framework und ein Genesis-Beispiel heruntergeladen habe. Jetzt werden alle Suchformulare entfernt. Ich werde versuchen, Bilder hochzuladen, um sie Ihnen bald zu zeigen.

    – Silverlink

    10. März 2017 um 23:23 Uhr

  • @SilverLink welche Version von Genesis und PHP hast du? Können Sie bitte versuchen, dies zu debuggen, indem Sie hinzufügen return 'debug: <pre>'.htmlentities($form_html).'</pre>'; bis zum Ende my_search_form_filter funktionieren und mit dem aktualisieren, was Sie anstelle der Suchfelder sehen?

    – Christos Lytras

    10. März 2017 um 23:37 Uhr

  • PHP-Version: 5.6.29. Das Ergebnis war: “debug: “

    – Silverlink

    11. März 2017 um 0:07 Uhr

1428950cookie-checkAnpassen der WordPress-Suchformularvorlage (Genesis)

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy