Anderer Ansatz: WordPress ähnliche Artikel durch Statifizierung anzeigen

2 Kommentare Autor: Jürgen (jdo)

Auf dieser Seite befindet sich unser Script, mit dem wir ähnliche Artikel statifizieren und in einer Datei ablegen. Wie man das Script einsetzt (installiert) und in WordPress verwendet haben wir auf Seite Drei oder in der README-Datei des ZIP-Pakets (Download) niedergeschrieben. Dort finden Sie auch, wie man das Ding wieder komplett los wird (Deinstallation).

$bb_timestamp = "bb_timestamp"; // Datei, die den UNIX-Timestamp aufbewahrt
$bb_update_interval = 21600; // minimales Intervall für ein Update in Sekunden (Schutz vor Missbrauch - hier 6 Stunden)
if (!is_file("./bb_timestamp")) { // wenn keine Datei existiert, leg sie an
$handler = fopen($bb_timestamp, "w+");
$last_update = time() - $bb_update_interval;
fwrite($handler, $last_update);
fclose($handler);
}
$last_update = file($bb_timestamp);
$time_now = time();
if ($last_update[0]+$bb_update_interval < $time_now) {
$handler = fopen($bb_timestamp, "w+");
fwrite($handler, time()); // Zeitstempel erneuern
fclose($handler);
// includes für eigene Scripte, damit ich trotzdem die WordPress-Funktionen nutzen kann
include_once("./wp-config.php");
include_once("./wp-load.php");
include_once("./wp-includes/wp-db.php");
// weitere Konfiguration
$table_prefix = "wp_"; // wird bei der Installation angegeben, in den meisten Fällen wohl wp_
$related_limit = 5; // Maximale Anzahl der anzuzeigenden Artikel
$bb_post_tag_array = array();
$sql = "SELECT " . $table_prefix . "term_relationships.object_id, " . $table_prefix . "term_taxonomy.term_id," . $table_prefix . "posts.post_title FROM " . $table_prefix . "term_relationships LEFT JOIN " . $table_prefix."term_taxonomy ON " . $table_prefix . "term_relationships.term_taxonomy_id = " . $table_prefix . "term_taxonomy.term_taxonomy_id LEFT JOIN " . $table_prefix . "posts ON " . $table_prefix . "term_relationships.object_id = " . $table_prefix . "posts.ID WHERE " . $table_prefix . "term_taxonomy.taxonomy=\"post_tag\" AND " . $table_prefix . "posts.post_status = \"publish\""; // Jede Tag-ID mit zugehöriger Artikel-ID abfragen, deren Status veröffentlicht ist
$result = mysql_query($sql);
echo mysql_error();
while ($bb_post_id = mysql_fetch_row($result))
{
$count_keys = count($bb_post_tag_array[$bb_post_id[0]]); // bereits vorhandene Schlüssel zählen
$next_key = $count_keys; // nächster Wert für den Schlüssel
$bb_post_tag_array[$bb_post_id[0]][$next_key] = $bb_post_id[1]; // Tag-ID dem mehrdimensionalem Array, dessen Schlüssel die Artikel-ID ist anfügen
$bb_title_permalink[$bb_post_id[0]] = array($bb_post_id[2], get_permalink($bb_post_id[0]));
}
$to_compare = array();
foreach ($bb_post_tag_array as $bb_post_key => $bb_post_value) {
array_push($to_compare, $bb_post_key); // Array der zu vergleichenden Artikel-IDs erzeugen
}
foreach ($to_compare as $cmp_post_id) { // alle zu vergleichenden Artikel-IDs durchgehen und ...
foreach ($bb_post_tag_array as $bb_post_key => $bb_post_value) { // ... mit allen anderen vergleichen
if ($cmp_post_id != $bb_post_key) { // Artikel nicht mit sich selbst vergleichen. Ich weiß, dass ich mir ähnlich bin :)
$cmp_result = array_intersect($bb_post_tag_array[$cmp_post_id], $bb_post_tag_array[$bb_post_key]); // gmeinsame TAG-IDs herausfinden
$related_array[$cmp_post_id][$bb_post_key] = count($cmp_result); // Anzahl der gleichen Tags in Array schreiben, dessen Schlüssel wiederum die Artikel-ID ist
}
}
}
foreach ($related_array as $r_key => $r_value) {
$related_ids = array();
arsort($r_value); // das Array nach größter Anzahl der gemeinsamen Tags sortieren
$r_value = array_slice($r_value, 0, $related_limit, true); // Anzahl der verwandten Artikel limittieren
foreach ($r_value as $r_post_key => $r_post_value) {
if (!empty($r_post_value)) { // keine Übereinstimmung kann auch nicht verwandt sein
array_push($related_ids, array($r_post_key, $r_post_value)); // IDs der verwandten Artikel in ein neues Array schreiben
}
}
$related_sorted[$r_key] = $related_ids;
}
$serialized_array = serialize($related_sorted); // für das Schreiben in die Datei vorbereiten
$serialized_title_plink = serialize($bb_title_permalink); // für das Schreiben in die Datei vorbereiten

$filename_temp = "related_temp";
$filename = "related_articles";
$handler = fopen($filename_temp, "w+"); // Temporäre Datei öffnen
fwrite($handler, $serialized_array); // Temporäre Datei füllen
fwrite($handler, "\r\n"); // Zeilenumbruch
fwrite($handler, $serialized_title_plink); // Temporäre Datei füllen
fclose($handler); // Temporäre Datei schließen
rename($filename_temp, $filename); // Datei umbenennen
}

Seiten: 1 2 3




 Alle Kommentare als Feed abonnieren

2 Kommentare zu “Anderer Ansatz: WordPress ähnliche Artikel durch Statifizierung anzeigen”

  1. Salim says:

    Hallo Jürgen,

    du triffst den Nagel auf den Kopf. GENAU diese Gedanken, zum Thema "wie eine verwandte Posts Abfrage auszusehen hat", hatte ich auch. Da ich allerdings keine Programmierkenntnisse besitze, war ich schon am verzweifeln, und dachte, ich müsste doch so ein blödes standart PlugIn nutzen.

    Einzig über die Performance mache ich mir ein wenig sorgen. Ich denke, ich werde es einfach ausprobieren! Vielen Dank!

    • jdo says:

      Also meine Datei, die die verwandten Beiträge enthält ist nun knapp 800 KByte groß. Und das bei über 2100 Beiträgen ... die Performance scheint ok zu sein. Kommt natürlich auch immer auf den Server an, wo das liegt.