Genesis – Suchformular anpassen

Ich wollte meine Suchform etwas ändern, indem ich autocomplete="off" zur Sucheingabe hinzufüge.

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...' ); } 

Da die /genesis/lib/structure/search.php keine Variable wie autocomplete="%s" enthielt, konnte dieses Attribut nicht gezielt verwendet werden. Ich musste es wahrscheinlich direkt einführen, also kopierte ich die search.php aus dem übergeordneten Design-Ordner in den untergeordneten Design-Ordner.

Der ursprüngliche Code der Datei war der folgende:

 <?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' ) . ' …' ); $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( '
', 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( '
', 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', esc_html( $label ), home_url( '/?s={s}' ), $value_or_placeholder, esc_attr( $search_text ), esc_attr( $button_text ) ); } } else { $form = sprintf( '', home_url( '/' ), 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 ursprünglichen Filter entfernt und meinen Filter hinzugefügt:

 remove_filter( 'get_search_form', 'genesis_search_form' ); add_filter( 'get_search_form', 'my_search_form' ); 

Und fügte autocomplete="off" zur Sucheingabe hinzu, also lautet die aktuelle:

 <?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' ) . ' …' ); $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( '
', 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( '
', 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', esc_html( $label ), home_url( '/?s={s}' ), $value_or_placeholder, esc_attr( $search_text ), esc_attr( $button_text ) ); } } else { $form = sprintf( '', home_url( '/' ), 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 ); }

Es funktioniert derzeit perfekt auf der Homepage, aber auf jeder anderen Seite werden nur der Header und der Slogan generiert.


Aktualisieren

Ich habe einige Tests durchgeführt und die Quelle des Problems gefunden, bei der die Seiten nicht generiert wurden. Sie wurde in der Datei functions.php von dieser Site abgerufen:

 //* Add the search bar add_filter( 'wp_nav_menu_items', 'sp_menu_items', 10, 2 ); function sp_menu_items( $items, $args ) { $items .= sprintf( '', get_search_form( false ) ); return $items; } 

und den aktuellen Code hatte ich in der searchform.php , von dieser Website abgerufen

 <?php add_filter( 'genesis_search_form', 'my_search_form', 10, 1); function my_search_form( $form ) { $search_text = get_search_query() ? apply_filters( 'the_search_query', get_search_query() ) : apply_filters( 'genesis_search_text', __( 'Search this website', 'genesis' ) . ' …' ); $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'; $form = sprintf( '
', home_url( '/?s={s}' ), esc_attr( $form_id ), esc_html( $label ), esc_attr( $form_id ), esc_attr( $search_text ), esc_attr( $button_text ) ); return $form; }

Wenn Sie in der functions.php entfernen oder beides functions.php werden alle Seiten korrekt angezeigt. Irgendeine Idee warum?


Dokumentation für get_search_form

Dokumentation für genesis_search_form

Dokumentation für Genesis Snippets

Solutions Collecting From Web of "Genesis – Suchformular anpassen"

Ich bin mir nicht sicher, warum Sie einen Fehler von 500 bekommen. Wahrscheinlich, weil Sie versuchen, eine function zu verwenden, bevor sie definiert wurde.

Aber ich denke du gehst das Problem falsch an. Genesis stellt einen Filter bereit, bevor das Suchformular zurückgegeben wird. Warum nicht einfach einen Filter zum genesis_search_form Hook genesis_search_form ?

Sie können den Filter zu Ihrer Child-Theme-Datei functions.php hinzufügen:

 add_filter( 'genesis_search_form', function( $form, $search_text, $button_text, $label ) { return str_replace( 'type="search"', 'type="search" autocomplete="off" spellcheck="false" autocorrect="off" autocapitalize="off" dir="auto"', $form ); }, 10, 4 ); 

Alternative Methode (ungetestet, sollte aber funktionieren) mit substr_replace() :

 add_filter( 'genesis_search_form', function( $form, $search_text, $button_text, $label ) { $insert = ' autocomplete="off" spellcheck="false" autocorrect="off" autocapitalize="off" dir="auto"'; $needle = 'type="search"'; $where = strpos( $form, $needle ) + strlen( $needle ); return substr_replace( $form, $insert, $where, 0 ); }, 10, 4 ); 

Sie bekommen einen Fehler von 500, weil Sie in sprintf() keine function als Argument haben sprintf() . Versuche dies:

 //* Add the search bar add_filter( 'wp_nav_menu_items', 'sp_menu_items', 10, 2 ); function sp_menu_items( $items, $args ) { $form = get_search_form( false ); $items .= sprintf( '', $form ); return $items; }