{"id":1127,"date":"2018-04-23T12:25:58","date_gmt":"2018-04-23T10:25:58","guid":{"rendered":"http:\/\/evileu.de\/zum-schwarzen-pinguin\/?p=1127"},"modified":"2018-04-23T12:25:58","modified_gmt":"2018-04-23T10:25:58","slug":"wordpress-autocomplete-ajax-deutsch-uebersetzung-des-tutorials-von-david-nash","status":"publish","type":"post","link":"https:\/\/evileu.de\/zum-schwarzen-pinguin\/2018\/04\/23\/wordpress-autocomplete-ajax-deutsch-uebersetzung-des-tutorials-von-david-nash\/","title":{"rendered":"WordPress Autocomplete AJAX deutsch &#8211; \u00dcbersetzung des Tutorials von David Nash"},"content":{"rendered":"<h2>\u00dcbersetzung des Tutorials von David Nash<\/h2>\n<p>Wie ich im vorigen Artikel schon erw\u00e4hnt hatte, hat David Nash in seinem Blog ein tolles <a href=\"https:\/\/davidnash.com.au\/create-an-auto-complete-field-in-wordpress\/\">Tutorial \u00fcber Autocomplete<\/a> (Auto-Vervollst\u00e4ndigen) mit Hilfe von AJAX in WordPress geschrieben. Ich habe von David die Erlaubnis, es zu \u00fcbersetzen und auf dieser Seite zur Verf\u00fcgung zu stellen. Das mache ich doch mit dem gr\u00f6ssten Vergn\u00fcgen &#8211; viel Spa\u00df beim Nachbauen, und viel Erfolg!<\/p>\n<h2>Einleitung<\/h2>\n<p>Dies wurde f\u00fcr ein Projekt mit einer umfangreichen Datenbank realisiert, mit ca. 14.000 eingetragenen Gesch\u00e4ftsadressen. Es gibt eine Anmeldungsseite, auf der die Benutzer ausw\u00e4hlen k\u00f6nnen, f\u00fcr welche Firma sie arbeiten. 14.000 sind viel zu viele Optionen f\u00fcr ein SELECT (drop-down) Feld, und ich wollte auch nicht so viel Last auf der MySQL Datenbank erzeugen.<\/p>\n<p>Meine L\u00f6sung: ein Autocomplete-Textfeld, das die WordPress-Datenbank ausliest.<\/p>\n<p>Ich gehe schrittweise vor, und stelle sicher dass jeder Schritt korrekt l\u00e4uft, ehe ich den n\u00e4chsten beginne. Hier ist das schrittweise Vorgehen:<\/p>\n<h3>Front-End JavaScript<\/h3>\n<p>Wir benutzen ein Child-Theme, weil wir ein Premium-Theme anpassen. In die functions.php kommt folgender Code, um die JavaScript-Datei zu laden:<\/p>\n<div id=\"crayon-5ad5dfe239580014829631\" class=\"crayon-syntax crayon-theme-classic-copy crayon-font-inconsolata crayon-os-pc print-yes notranslate crayon-wrapped crayon-expanded crayon-toolbar-visible\" data-settings=\" minimize scroll-mouseover wrap expand\">\n<div class=\"crayon-main\">\n<table class=\"crayon-table\">\n<tbody>\n<tr class=\"crayon-row\">\n<td class=\"crayon-code\">\n<div class=\"crayon-pre\">\n<div id=\"crayon-5ad5dfe239580014829631-1\" class=\"crayon-line\"><span class=\"crayon-t\">function<\/span> <span class=\"crayon-e\">mysite_js<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-sy\">)<\/span> <span class=\"crayon-sy\">{<\/span><\/div>\n<div id=\"crayon-5ad5dfe239580014829631-2\" class=\"crayon-line crayon-striped-line\"><span class=\"crayon-e\">wp_enqueue_script<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-s\">&#8218;mysite-js&#8216;<\/span><span class=\"crayon-sy\">,<\/span> <span class=\"crayon-e\">get_stylesheet_directory_uri<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-s\">&#8218;\/js\/mysite.js&#8216;<\/span><span class=\"crayon-sy\">,<\/span> <span class=\"crayon-t\">array<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-s\">&#8218;jquery&#8216;<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">;<\/span><\/div>\n<div id=\"crayon-5ad5dfe239580014829631-3\" class=\"crayon-line\"><span class=\"crayon-sy\">}<\/span><\/div>\n<div id=\"crayon-5ad5dfe239580014829631-4\" class=\"crayon-line crayon-striped-line\"><span class=\"crayon-e\">add_action<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-s\">&#8218;wp_enqueue_scripts&#8216;<\/span><span class=\"crayon-sy\">,<\/span> <span class=\"crayon-s\">&#8218;mysite_js&#8216;<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">;<\/span><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<div id=\"x-root\" class=\"x-root\"><\/div>\n<div class=\"x-root\">Wir legen im Child-Theme Verzeichnis die Datei \/js\/mysite.js an, die sieht so aus:<\/div>\n<div class=\"x-root\"><\/div>\n<div id=\"crayon-5ad5dfe23958c532998354\" class=\"crayon-syntax crayon-theme-classic-copy crayon-font-inconsolata crayon-os-pc print-yes notranslate crayon-wrapped crayon-expanded crayon-toolbar-visible\" data-settings=\" minimize scroll-mouseover wrap expand\">\n<div class=\"crayon-main\">\n<table class=\"crayon-table\">\n<tbody>\n<tr class=\"crayon-row\">\n<td class=\"crayon-code\">\n<div class=\"crayon-pre\">\n<div id=\"crayon-5ad5dfe23958c532998354-1\" class=\"crayon-line\"><span class=\"crayon-e\">jQuery<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-r\">document<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">ready<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-t\">function<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-sy\">$<\/span><span class=\"crayon-sy\">)<\/span> <span class=\"crayon-sy\">{<\/span><\/div>\n<div id=\"crayon-5ad5dfe23958c532998354-2\" class=\"crayon-line crayon-striped-line\"><span class=\"crayon-r\">alert<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-s\">&#8218;jQuery loaded.&#8216;<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">;<\/span><\/div>\n<div id=\"crayon-5ad5dfe23958c532998354-3\" class=\"crayon-line\"><span class=\"crayon-sy\">}<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">;<\/span><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p class=\"x-root\">Wenn man jetzt irgendeine Seite auf der Site neu l\u00e4dt, kommt &#8222;jQuery loaded&#8220; in einer JavaScript-Alertbox, das funktioniert also. Man h\u00e4tte auch console.log(\u2018hello\u2019) benutzen und die Developer Console in Chrome \u00fcberp\u00fcfen k\u00f6nnen.<\/p>\n<p class=\"x-root\">Als n\u00e4chstes habe ich mir <a href=\"https:\/\/goodies.pixabay.com\/jquery\/auto-complete\/demo.html\" target=\"_blank\">jQuery-autocomplete<\/a> heruntergeladen. Ich h\u00e4tte auch das jQuery-UI autocomplete benutzen k\u00f6nnen, aber ich benutze es sonst nicht und belasse die Sache lieber leichtgewichtig.<\/p>\n<p class=\"x-root\">Aus dem Download kopiere ich mir die Dateien jquery.auto-complete.css und jquery-autocomplete.js nach \/js\/ \u2013 das selbe Unterverzeichnis, in dem mysite.js liegt.<\/p>\n<p class=\"x-root\">Dann wird die functions.php angepasst um die Bibliothek zu laden:<\/p>\n<pre id=\"crayon-5ad5dfe239590745021249-1\" class=\"crayon-line\"><span class=\"crayon-t\">function<\/span> <span class=\"crayon-e\">mysite_js<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-sy\">)<\/span> <span class=\"crayon-sy\">{<\/span>\r\n\r\n<span class=\"crayon-e\">wp_enqueue_script<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-s\">'autocomplete'<\/span><span class=\"crayon-sy\">,<\/span> <span class=\"crayon-e\">get_stylesheet_directory_uri<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-s\">'\/js\/jquery.auto-complete.js'<\/span><span class=\"crayon-sy\">,<\/span> <span class=\"crayon-t\">array<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-s\">'jquery'<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">;<\/span>\u00a0\r\n\r\n<span class=\"crayon-e\">wp_enqueue_script<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-s\">'mysite-js'<\/span><span class=\"crayon-sy\">,<\/span> <span class=\"crayon-e\">get_stylesheet_directory_uri<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-s\">'\/js\/mysite.js'<\/span><span class=\"crayon-sy\">,<\/span> <span class=\"crayon-t\">array<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-s\">'jquery'<\/span><span class=\"crayon-sy\">,<\/span> <span class=\"crayon-s\">'autocomplete'<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">;<\/span>\u00a0\r\n\r\n<span class=\"crayon-e\">wp_enqueue_style<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-s\">'autocomplete.css'<\/span><span class=\"crayon-sy\">,<\/span> <span class=\"crayon-e\">get_stylesheet_directory_uri<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-s\">'\/js\/jquery.auto-complete.css'<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">;<\/span>\r\n<span class=\"crayon-sy\">}<\/span>\r\n\r\n<span class=\"crayon-e\">add_action<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-s\">'wp_enqueue_scripts'<\/span><span class=\"crayon-sy\">,<\/span> <span class=\"crayon-s\">'mysite_js'<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">;<\/span><\/pre>\n<p>Jetzt die Seite neu laden, und sicherstellen dass die Library in der Chrome Developer Console unter dem &#8222;Sources&#8220;-Tab auftaucht.<\/p>\n<h2>Der AJAX Code<\/h2>\n<p>Als n\u00e4chstes wird die mysite.js upgedatet, um etwas sinnvolles zu tun:<\/p>\n<pre id=\"crayon-5ad5dfe239593171213245-1\" class=\"crayon-line\"><span class=\"crayon-e\">jQuery<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-r\">document<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">ready<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-t\">function<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-sy\">$<\/span><span class=\"crayon-sy\">)<\/span> <span class=\"crayon-sy\">{<\/span>\u00a0\r\n\r\n<span class=\"crayon-sy\">$<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-s\">'#company_works_at'<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">autoComplete<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-sy\">{<\/span>\r\n<span class=\"crayon-v\">source<\/span><span class=\"crayon-o\">:<\/span> <span class=\"crayon-t\">function<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-r\">name<\/span><span class=\"crayon-sy\">,<\/span> <span class=\"crayon-v\">response<\/span><span class=\"crayon-sy\">)<\/span> <span class=\"crayon-sy\">{\r\n<\/span>\r\n<span class=\"crayon-sy\">$<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">ajax<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-sy\">{<\/span>\r\n<span class=\"crayon-v\">type<\/span><span class=\"crayon-o\">:<\/span> <span class=\"crayon-s\">'POST'<\/span><span class=\"crayon-sy\">,<\/span>\r\n<span class=\"crayon-v\">dataType<\/span><span class=\"crayon-o\">:<\/span> <span class=\"crayon-s\">'json'<\/span><span class=\"crayon-sy\">,<\/span>\r\n<span class=\"crayon-v\">url<\/span><span class=\"crayon-o\">:<\/span> <span class=\"crayon-s\">'\/wp-admin\/admin-ajax.php'<\/span><span class=\"crayon-sy\">,<\/span>\r\n<span class=\"crayon-v\">data<\/span><span class=\"crayon-o\">:<\/span> <span class=\"crayon-s\">'action=get_listing_names&amp;name='<\/span><span class=\"crayon-o\">+<\/span><span class=\"crayon-r\">name<\/span><span class=\"crayon-sy\">,<\/span>\r\n<span class=\"crayon-v\">success<\/span><span class=\"crayon-o\">:<\/span> <span class=\"crayon-t\">function<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">data<\/span><span class=\"crayon-sy\">)<\/span> <span class=\"crayon-sy\">{\r\n<\/span>\r\n<span class=\"crayon-e\">response<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">data<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">;<\/span>\r\n\r\n<span class=\"crayon-sy\">}<\/span>\r\n\r\n<span class=\"crayon-sy\">}<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">;<\/span>\r\n\r\n<span class=\"crayon-sy\">}<\/span>\r\n<span class=\"crayon-sy\">}<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">;<\/span>\r\n<span class=\"crayon-sy\">}<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">;<\/span><\/pre>\n<p id=\"crayon-5ad5dfe239593171213245-1\" class=\"crayon-line\">Dabei ist <span class=\"crayon-s\">#company_works_at das Textfeld auf der Registrierungsseite, das den Autocomplete bekommen soll. Ich bin dabei der Dokumentation auf der Autocomplete-Seite gefolgt &#8211; die Source-Funktion braucht ein &#8222;response&#8220;-Callback um zu funktionieren, dies ist die &#8222;success&#8220;-Funktion im Aufruf von jQuery $.ajax().<br \/>\n<\/span><\/p>\n<h3>Das PHP, das die AJAX Daten von WordPress schickt<\/h3>\n<p>In der functions.php kommt Folgendes hinzu:<\/p>\n<pre id=\"crayon-5ad5dfe239596148413741-1\" class=\"crayon-line\"><span class=\"crayon-c\">\/\/get listings for 'works at' on submit listing page<\/span>\r\n\r\n<span class=\"crayon-e\">add_action<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-s\">'wp_ajax_nopriv_get_listing_names'<\/span><span class=\"crayon-sy\">,<\/span> <span class=\"crayon-s\">'ajax_listings'<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">;<\/span>\r\n<span class=\"crayon-e\">add_action<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-s\">'wp_ajax_get_listing_names'<\/span><span class=\"crayon-sy\">,<\/span> <span class=\"crayon-s\">'ajax_listings'<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">;<\/span>\r\n\r\n<span class=\"crayon-t\">function<\/span> <span class=\"crayon-e\">ajax_listings<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-sy\">)<\/span> <span class=\"crayon-sy\">{<\/span>\r\n\r\n<span class=\"crayon-m\">global<\/span> <span class=\"crayon-v\">$wpdb<\/span><span class=\"crayon-sy\">;<\/span> <span class=\"crayon-c\">\/\/get access to the WordPress database object variable<\/span>\r\n\r\n<span class=\"crayon-c\">\/\/get names of all businesses<\/span>\r\n\r\n<span class=\"crayon-v\">$name<\/span> <span class=\"crayon-o\">=<\/span> <span class=\"crayon-v\">$wpdb<\/span><span class=\"crayon-o\">-&gt;<\/span><span class=\"crayon-e\">esc_like<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-e\">stripslashes<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">$_POST<\/span><span class=\"crayon-sy\">[<\/span><span class=\"crayon-s\">'name'<\/span><span class=\"crayon-sy\">]<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-s\">'%'<\/span><span class=\"crayon-sy\">;<\/span> <span class=\"crayon-c\">\/\/escape for use in LIKE statement<\/span>\r\n\r\n<span class=\"crayon-v\">$sql<\/span> <span class=\"crayon-o\">=<\/span> <span class=\"crayon-s\">\"select post_title <\/span>\r\n\r\n<span class=\"crayon-s\"> from $wpdb-&gt;posts <\/span>\r\n\r\n<span class=\"crayon-s\"> where post_title like %s <\/span>\r\n\r\n<span class=\"crayon-s\"> and post_type='job_listing' and post_status='publish'\"<\/span><span class=\"crayon-sy\">;<\/span> \r\n\r\n<span class=\"crayon-v\">$sql<\/span> <span class=\"crayon-o\">=<\/span> <span class=\"crayon-v\">$wpdb<\/span><span class=\"crayon-o\">-&gt;<\/span><span class=\"crayon-e\">prepare<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">$sql<\/span><span class=\"crayon-sy\">,<\/span> <span class=\"crayon-v\">$name<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">;<\/span>\r\n\r\n<span class=\"crayon-v\">$results<\/span> <span class=\"crayon-o\">=<\/span> <span class=\"crayon-v\">$wpdb<\/span><span class=\"crayon-o\">-&gt;<\/span><span class=\"crayon-e\">get_results<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">$sql<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">;<\/span> \r\n\r\n<span class=\"crayon-c\">\/\/copy the business titles to a simple array<\/span>\r\n\r\n<span class=\"crayon-v\">$titles<\/span> <span class=\"crayon-o\">=<\/span> <span class=\"crayon-t\">array<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">;<\/span>\r\n\r\n<span class=\"crayon-st\">foreach<\/span><span class=\"crayon-sy\">(<\/span> <span class=\"crayon-v\">$results<\/span> <span class=\"crayon-st\">as<\/span> <span class=\"crayon-v\">$r<\/span> <span class=\"crayon-sy\">)<\/span>\r\n\r\n<span class=\"crayon-v\">$titles<\/span><span class=\"crayon-sy\">[<\/span><span class=\"crayon-sy\">]<\/span> <span class=\"crayon-o\">=<\/span> <span class=\"crayon-e\">addslashes<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">$r<\/span><span class=\"crayon-o\">-&gt;<\/span><span class=\"crayon-i\">post_title<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">;<\/span>\u00a0\r\n\r\n<span class=\"crayon-k \">echo<\/span> <span class=\"crayon-e\">json_encode<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">$titles<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">;<\/span> <span class=\"crayon-c\">\/\/encode into JSON format and output<\/span>\u00a0\r\n\r\n<span class=\"crayon-k \">die<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">;<\/span> <span class=\"crayon-c\">\/\/stop \"0\" from being output<\/span>\r\n\r\n<span class=\"crayon-sy\">}<\/span><\/pre>\n<p>Das JavaScript, das den AJAX Call absetzt schickt die Daten in &#8222;name&#8220;. Ich benutze stripslashes() damit Namen mit Apostrophen etc. auch funtionieren. Ich benutze esc_like() aus Sicherheitsgr\u00fcnden. Das &#8218;%&#8216; am Ende bewirkt, dass nur auf die f\u00fchrenden Buchstaben gematcht wird. Wenn zum Beipsiel ein Benutzer &#8222;The&#8220; eingibt m\u00f6chte ich &#8222;The Best Business&#8220; sehen, und nicht &#8222;Not the best business&#8220;. Aber wenn &#8222;Not&#8220; einegegeben wird, m\u00f6chte ich &#8222;Not the best business&#8220; sehen.<\/p>\n<p><strong>Update: <\/strong>Wenn man alle Posts sehen will, das &#8222;<span id=\"crayon-5ad5dfe23959a437807105\" class=\"crayon-syntax crayon-syntax-inline crayon-theme-classic-copy crayon-theme-classic-copy-inline crayon-font-inconsolata\"><span class=\"crayon-pre crayon-code\"><span class=\"crayon-r\">and<\/span><span class=\"crayon-h\">\u00a0<\/span>post_type=<span class=\"crayon-s\">&#8218;job_listing'&#8220;<\/span><\/span><\/span> aus dem $sql oben entfernen.<\/p>\n<h2>Testen, ob es funktioniert<\/h2>\n<p>Ich klicke auf das Autocomplete-Feld, tippe drei Buchstaben und bekomme eine ziemlich rasche Reaktion. Es schl\u00e4gt mehrere Firmen vor, aus denen der Benutzer ausw\u00e4hlen kann.<\/p>\n<p>Dies ist nur ein Textfeld, und es erlaubt es dem Benutzer auch einen Namen einer Firma einzugeben, die nicht in der Datenbank ist. Wenn man m\u00f6chte k\u00f6nnte man mehr Restriktionen anlegen, und statt dem Text auch die ID der Firma speichern. Man k\u00f6nnte dann auch in einem anderen Template einen Link auf die Firma einf\u00fcgen.<\/p>\n<h2>Das war&#8217;s &#8211; so sollte es es klappen<\/h2>\n<p>Soweit das Tutorial von David Nash. <a href=\"https:\/\/davidnash.com.au\/create-an-auto-complete-field-in-wordpress\/\">Hier noch einmal der Link zu seinem Blog<\/a>. Es lohnt sich, dort auch einmal durch die Kommentare durchzuschauen, da sind noch viele wertvolle Tipps drin.<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u00dcbersetzung des Tutorials von David Nash Wie ich im vorigen Artikel schon erw\u00e4hnt hatte, hat David Nash in seinem Blog ein tolles Tutorial \u00fcber Autocomplete (Auto-Vervollst\u00e4ndigen) mit Hilfe von AJAX in WordPress geschrieben. Ich habe von David die Erlaubnis, es zu \u00fcbersetzen und auf dieser Seite zur Verf\u00fcgung zu stellen. Das mache ich doch mit [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[46,7,4,2],"tags":[],"_links":{"self":[{"href":"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-json\/wp\/v2\/posts\/1127"}],"collection":[{"href":"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-json\/wp\/v2\/comments?post=1127"}],"version-history":[{"count":5,"href":"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-json\/wp\/v2\/posts\/1127\/revisions"}],"predecessor-version":[{"id":1132,"href":"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-json\/wp\/v2\/posts\/1127\/revisions\/1132"}],"wp:attachment":[{"href":"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-json\/wp\/v2\/media?parent=1127"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-json\/wp\/v2\/categories?post=1127"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-json\/wp\/v2\/tags?post=1127"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}