Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Page Builder, Block Editor und die interne Suche

Page Builder, Block Editor und die interne Suche

Wir können im Frontend und im Backend von WordPress suchen, aber diese Suche ist ... einfach. Es ist nur eine einfache SQL-Volltextsuche. Ihr fehlen viele Funktionen, wie Relevanz, Hervorhebung, Synonyme usw.

In Zeiten von Page Buildern und vom Block Editor kommt diese einfache interne Suche an ihre Grenzen. Die Suche funktioniert überhaupt nicht oder es gibt zu viele falsch positive Suchergebnisse.

Bei welchen Page Buildern funktioniert die Suche und warum geht sie kaputt? Was kann die Suche und was nicht? Und wie können wir sie erweitern?

Wir tauchen tief in die Suche von WordPress ein und finden heraus, was da eigentlich kaputt ist und wie man es beheben kann!

Torsten Landsiedel

September 28, 2023
Tweet

More Decks by Torsten Landsiedel

Other Decks in Programming

Transcript

  1. Page Builder, Block Editor und die interne Suche WordPress Meetup

    Hamburg – September 2023 Torsten Landsiedel @zodiac1978
  2. SELECT SQL_CALC_FOUND_ROWS wp_posts.ID FROM wp_posts WHERE 1=1 AND (((wp_posts.post_title LIKE

    '%wat%') OR (wp_posts.post_excerpt LIKE '%wat%') OR (wp_posts.post_content LIKE '%wat%'))) Wie sieht der Standard-Query genau aus?
  3. • Kategorien, Schlagwörter, eigene Taxonomien, Custom Post Types, Custom Fields

    • Kommentare • Stopwords • “-keyword” (seit 4.1) Wo und was sucht WordPress nicht?
  4. • Highlighting • AND, OR und andere Sonder-Suchen • Fuzzy

    matching / Synonyme • Suche “mit Phrase” • … Was kann die WordPress-Suche nicht?
  5. Stoppwörter nennt man (...) Wörter, die bei einer Volltextindexierung nicht

    beachtet werden, da sie sehr häufig auftreten und gewöhnlich keine Relevanz für die Erfassung des Dokumentinhalts besitzen. Was sind Stoppwörter?
  6. orderby => “relevance” (Standard für Suche // seit 3.7) Sortiert

    Suchbegriffe in der folgenden Reihenfolge: 1. Ob der gesamte Satz im Titel übereinstimmt (#1). 2. Ob alle Suchbegriffe im Titel vorkommen (<7 Suchwörter) (#2). 3. Ob einer der Suchbegriffe im Titel vorkommt (#3). 4. Ob der gesamte Satz im Auszug (#4) (oder Inhalt, #5) vorkommt. 5. Alles andere #6 Wie zeigt WordPress das Ergebnis an? (1)
  7. Wenn die Suchbegriffe einen negativen Query (-keyword) enthalten, dann versucht

    WordPress natürlich keinen “sentence match”. Wie zeigt WordPress das Ergebnis an? (2)
  8. # Enfold # Avada # PageLayer # Beaver Builder #

    Elementor # Brizy # Divi Page Builder bei denen die Suche funktioniert # Visual Composer # WPBakery Page Builder
  9. # Bricks (saves via (prefix)_postmeta/custom field) "Query Bricks data in

    search results" muss aktiviert werden! Manche erfordern Konfiguration
  10. # Breakdance Grund: In post_content ist nur das hier: "<!--

    wp:breakdance/block-breakdance-launcher /-->" Die echten Daten sind in einem custom field “breakdance_data” in (prefix)_postmeta. Manche sind kaputt …
  11. # Nimble Grund: Der Inhalt ist gespeichert unter einer anderen

    ID und einem anderen CPT (nimble_post_type), die Tabelle post_content ist schlicht leer. Leider keine Antwort nach Meldung im Supportforum: https://wordpress.org/support/topic/search-is-completely-broken/ … und es ist ihnen manchmal egal.
  12. <!-- wp:heading --> <h2>This is a heading (H2)</h2> <!-- /wp:heading

    --> Block Editor (Gutenberg) – HTML Comments
  13. <p>Elementor</p> <style>/*! elementor - v3.14.0 - 26-06-2023 */ .elementor-widget-image{text-align:center}</style> <img

    src="/plugins/elementor/assets/images/placeholder.png" title="" alt="" loading="lazy" /><link rel="stylesheet" href="/plugins/elementor/assets/css/widget-icon-box.min.css"> <h3>This is the heading</h3> Elementor – HTML / Inline Styles
  14. <!--vcv no format--><!-- vcwb/dynamicElementComment:9a2bc876 --><div class="vce-row-container" data-vce-boxed-width="true"><div class="vce-row vce-row--col-gap-30 vce-row-equal-height

    vce-row-content--top" id="el-9a2bc876" data-vce-do-apply="all el-9a2bc876"><div class="vce-row-content" data-vce-element-content="true"><!-- vcwb/dynamicElementComment:b92ba6f9 --> Visual Composer – HTML + Comments
  15. [et_pb_section fb_built="1" theme_builder_area="post_content" _builder_version="4.22.2" _module_preset="default"][et_pb_row _builder_version="4.22.2" _module_preset="default" theme_builder_area="post_content"][et_pb_column _builder_version="4.22.2" _module_preset="default"

    type="4_4" theme_builder_area="post_content"][et_pb_text _builder_version="4.22.2" _module_preset="default" theme_builder_area="post_content" hover_enabled="0" sticky_enabled="0"] <p>HyperHyper</p> [/et_pb_text][/et_pb_column][/et_pb_row][/et_pb_section] Divi – Shortcodes
  16. [fusion_builder_container type="flex" hundred_percent="no" hundred_percent_height="no" min_height_medium="" min_height_small="" min_height="" hundred_percent_height_scroll="no" align_content="stretch" flex_align_items="flex-start"

    flex_justify_content="flex-start" flex_wrap_medium="" flex_wrap_small="" flex_wrap="wrap" flex_column_spacing="" hundred_percent_height_center_content="yes" equal_height_columns="no" container_tag="div" menu_anchor="" hide_on_mobile="small-visibility,medium-visibility,large-visibility" status="published" publish_date="" class="" id="" spacing_medium="" margin_top_medium="" margin_bottom_medium="" spacing_small="" margin_top_small="" margin_bottom_small="" (...) Avada – Shortcodes
  17. <!-- wp:shortcode --> [av_one_full first min_height='' vertical_alignment='av-align-top' space='' row_boxshadow='' row_boxshadow_width='10'

    row_boxshadow_color='' custom_margin='' margin='0px' av-desktop-margin='' av-medium-margin='' av-small-margin='' av-mini-margin='' mobile_breaking='' mobile_column_order='' border='' border_style='solid' border_color='' radius='' min_col_height='' padding='' av-desktop-padding='' av-medium-padding='' av-small-padding='' av-mini-padding='' svg_div_top='' svg_div_top_color='#333333' svg_div_top_width='100' svg_div_top_height='50' (...) Enfold – Shortcodes + Comments
  18. <!-- wp:paragraph {"align":"center","backgroundColor":"very-light-gray","fontSize":"small"} --> <p class="has-text-align-center has-very-light-gray-background-color has-background has-small-font-size"><p style="color:#000000;text-align:center"

    class="has-background has-small-font-size has-very-light-gray-background-color">Gutenberg Sample Content.</p></p> <!-- /wp:paragraph --> Zu viele Ergebnisse …
  19. <!-- wp:paragraph {"align":"center","backgroundColor":"very-light-gray","fontSize":"small"} --> <p class="has-text-align-center has-very-light-gray-background-color has-background has-small-font-size"><p style="color:#000000;text-align:center"

    class="has-background has-small-font-size has-very-light-gray-background-color">Gutenberg Sample Content.</p></p> <!-- /wp:paragraph --> … denn nur gelb ist relevant …
  20. Suche nach “Image”, “Builder”, “Paragraph”, etc. sind eigentlich in keinem

    Builder möglich ohne Unmengen an falschen Suchergebnissen zu finden. Und die PageBuilder?
  21. • CPT hinzufügen • Auf CPT beschränken • Custom Fields

    hinzufügen (Performance!) • Auf einzelne Seiten (+Unterseiten) beschränken • Einzelne Seiten ausschließen • Einzelne Autoren ausschließen • Membership-Inhalte ausschließen Mögliche Ideen
  22. SELECT SQL_CALC_FOUND_ROWS wp_posts.ID FROM wp_posts INNER JOIN wp_postmeta ON wp_posts.ID

    = wp_postmeta.post_id WHERE 1=1 AND (((wp_posts.post_title LIKE '%wat%') OR (wp_posts.post_excerpt LIKE '%wat%') OR (wp_posts.post_content LIKE '%wat%') OR (wp_postmeta.meta_value LIKE '%wat%'))) Custom Fields (Performance! ❌)
  23. SELECT SQL_CALC_FOUND_ROWS wp_posts.ID FROM wp_posts INNER JOIN wp_postmeta ON wp_posts.ID

    = wp_postmeta.post_id WHERE 1=1 AND (((wp_posts.post_title LIKE '%wat%') OR (wp_posts.post_excerpt LIKE '%wat%') OR (wp_posts.post_content LIKE '%wat%') OR (wp_postmeta.meta_key = 'breakdance_data' AND wp_postmeta.meta_value LIKE '%wat%'))) Custom Fields (Performance! ✅)
  24. REGEXP_REPLACE({$wpdb->posts}.post_content, '<.+?>', '') LIKE '%{$search_query}%'"; RegEx wird jedoch einen Performance-Impact

    haben. Bessere Lösung wäre ein eigener Index (z.B. via Plugin). Nur für MySQL 8.0.4+ und MariaDB 10.0.5+
  25. Relevanssi Better Search Ivory Search WP Fast Total Search Ajax

    Search Lite Search & Filter WP Extended Search PRO SearchWP Ajax Search Search & Filter Pro Plugin-Empfehlungen: