[Gelöst] Meta Title aus Daten einer externen DB generieren
-
Hallo zusammen,
auf meiner MADtrash.com Webseite liste ich etwa über 8000 Detailseiten über MAD Magazin Sammlerstücke. Vor einigen Monaten konvertierte ich die Seite zu einer WordPress Seite. Da ich aber keine Lust hatte, für alle 8000 Detailseiten einen post zu erstellen, werden die Informationen aus einer externen DB gelesen und mittels „php code for posts“ in einem einzigen post integriert. Die ID zum Sammlerstück übergebe ich vorher per url. Das funktioniert soweit ganz gut und verlässlich!!
Mein letztes Problem ist die dynamische Gestaltung des META titles. Das dynamische Setzen dieses Elements muss natürlich vor dem Aufruf der header.php geschehen. Hier habe ich eine Funktion angelegt, welche anhand der URL id den Titel des Sammlerstücks in der externen DB liest und als title php Variable ausgibt. Im header.php meines themes habe ich natürlich die PHP variable zwischen die title tags gesetzt. Leider bleibt nach dem Laden der entsprechenden Seite das Title Tag leer…kurzum, es funktioniert einfach nicht.
Hat jemand von euch einen besseren Tipp oder Hinweis für die Lösung meines Problems??
Bin für jede Hilfe dankbar!!
Gruss, Maddest
-
Hallo,
du gibst die Variable auch mit echo aus?
Zeig doch bitte mal Code, dann können wir dir evt auch helfen.Gruß
FrankHallo Frank,
vielen Dank für Deine schnelle Antwort.
Hier ist der code, den ich meinem theme vor dem Aufruf der header.php gesetzt habe. Den Zugangscode für meine Datenbank und die Namen der Tabellen habe ich durch xxx ersetzt:
function createMetaTitle($id) { $pretitle = array( "usa" => "US", "arg" => "Argentinian", "aus" => "Australian", "bra" => "Brasilian", "chn" => "Chinese", "den" => "Danish", "fin" => "Finish", "fra" => "French", "ger" => "German", "gbr" => "British", "gre" => "Greek", "ned" => "Dutch", "hun" => "Hungarian", "isl" => "Icelandic", "ind" => "Indian", "isr" => "Israeli", "ita" => "Italian", "mex" => "Mexican", "nor" => "Norwegian", "pur" => "Puerto Rico", "que" => "Quebec", "rsa" => "South African", "spa" => "Spanish", "swe" => "Swedish", "tur" => "Turkish", "hol" => "Dutch", "saf" => "South African", "jap" => "Japanese", "can" => "Canadian", "spa" => "Spanish", "taw" => "Taiwan", "?" => "Unknown"); $id_first = substr($id,0,2); $mydb = new wpdb('xxx','xxx','xxx','localhost'); if($id_first == 01) { $rows = $mydb->get_results("SELECT number,country,edition,date FROM xxx WHERE id = ".$id); if($rows->number == 0) $rows->number = ''; else $rows->number = '#'.$rows->number; if($rows->country == 'swe' || ($rows->country == 'den' && $rows->edition == 1) || $rows->country == 'fin' || $rows->country == 'nor') { $year = substr($rows->date,0,4); $title = $pretitle[$rows->country]." MAD Magazine ".$year." ".$rows->number; } else { $title = $pretitle[$rows->country]." MAD Magazine ".$rows->number; } } if($id_first == 02) { $rows = $mydb->get_results("SELECT category,number,country,title FROM xxx WHERE id = ".$id); $item['title'] = getSpecialTitle($item['series'],$row[4],$item['number']); if($rows->number == 0) $rows->number = ''; else $rows->number = '#'.$rows->number; $rows_series = $mydb->get_results("SELECT category FROM satiredb_lookup_cat_special WHERE id = ".$rows->category); if($rows_series->category == "Miscellaneous") $title = $rows->title." ".$rows->number; else $title = $rows_series->category." ".$rows->number; } if($id_first == 03) { $rows = $mydb->get_results("SELECT title,country,number FROM satiredb_madbook WHERE id = ".$id); if($rows->number != 0 || !empty($rows->number)) { if($rows->number == 0) $rows->number = ''; else $rows->number = '#'.$rows->number; $title = $rows->title.' '.$rows->number; } else { $title = $rows->title; } } if($id_first == 04) { $rows = $mydb->get_results("SELECT title,country FROM xxx WHERE id = ".$id); $title = $rows->title; } if($id_first == 0) { $rows = $mydb->get_results("SELECT country,title,number FROM xxx WHERE id = ".$id); if($rows->number == 0 || empty($rows->number)) { $title = $rows->title; } else { if($rows->number == 0) $rows->number = ''; else $rows->number = '#'.$rows->number; $title = $rows->title." ".$rows->number; } } return $title; } $collectible_id = $_GET['collectible_id']; $title = createMetaTitle($collectible_id);
In der header.php versuche den Titel mit echo $title; auszugeben.
Hallo,
wenn das wirklich dein Code ist, dann ist deine Seite anfällig für SQL Injections ( http://de.wikipedia.org/wiki/SQL-Injection ).
Du übergibst deinen Parameter ungeprüft an deine Query. Er muss nur eine gültige id_first generieren.
eine URL ala xxx?collectible_id=01;BöserSQLCode wird bei dir zu
SELECT number,country,edition,date FROM xxx WHERE id = 01;BöserSQLCode
Bitte schau die Prepared Statements an https://codex.wordpress.org/Class_Reference/wpdb#Protect_Queries_Against_SQL_Injection_Attacks
Ansonsten kann ich auf die schnelle nichts sehen warum dein Titel leer ist. Zeigt er das Verhalten denn bei allen ID oder nur bei bestimmten Gruppen? 01xxxx, 02xxxx usw.
Ich würde mal den Debug Modus aktivieren ( https://codex.wordpress.org/Debugging_in_WordPress ) ob WordPress was zu melden hat. Wenn das nichts bringt, dann mit nem Debugger da mal durch steppen oder, wenn nicht zu hand, dann mal ein paar echos einstreuen.
Gruß
FrankHallo Frank,
wieder vielen Dank für die Tipps. Für das XSS Problem habe ich eine extra Funktion eingebaut, die solche gefährlichen Zeichenketten rausfiltert 🙂
Mittlerweile konnte ich das Problem einkreisen. Irgendwie ist es mir nicht möglich die $title Variable in die header.php zu übergeben. Nach einer Weile Google fand ich Lösungen, die schon anderen geholfen haben:
http://wordpress.org/support/topic/pass-variables-from-templates-into-header?replies=6
http://wordpress.org/support/topic/passing-value-through-get_header-to-headerphp?replies=9
Bei mir klappt es aber trotzdem nicht. Vielleicht lässt es die aktuelle WordPress Version nicht mehr zu. Ich stehe vor einem Rätsel, aber bleibe dran!
Ich habe das Problem jetzt halbwegs gelöst. Die komplette Funktion habe ich nun in die header.php verschoben -> so funktioniert es!
Diese Lösung ist allerdings nicht ganz zufriedenstellend. Bei einem Theme update wird die header.php überschrieben. Naja, damit kann man aber leben…
Tausend Dank nochmals für die super Unterstützung!!
Hallo,
dafür gibt es das Konzept der Childthmes
http://wpmeetup-hannover.de/2013/02/28/childthemes-was-ist-das-und-wie-kann-ich-das-selbst-nutzen/Gruß
FrankHabe Deinen Artikel eben gelesen. Diese Methode ist natürlich viel eleganter. Ohne Frage werde ich dieses Konzept in den nächsten Tagen bei mir realisieren 😉
Vielen Dank!!
Hallo,
bitte sehr. Dann erweitere ich den Titel dieses Threads um ein [Gelöst]
Gruß
Frank
- Das Thema „[Gelöst] Meta Title aus Daten einer externen DB generieren“ ist für neue Antworten geschlossen.