Verwenden Sie eine separate benutzerdefinierte Tabelle (keine Beiträge), um Daten zum Hochladen von Dateien zu verarbeiten


7

Das Problem: Website mit über 100 Fotos pro Beitrag. Könnte möglicherweise die Post-Tabelle innerhalb weniger Jahre über 100.000 Einträge hinaus anschwellen lassen.

Das Dilemma: Ich würde mich lieber an die Standard-WP-Benutzeroberfläche halten, um Bilder / Dateien mit dem integrierten Uploader "Medien hinzufügen" zu verarbeiten. Ich möchte nach Möglichkeit die Verwendung einer separaten Dateigalerie-Implementierung vermeiden.

Die Frage: Hat jemand eine Möglichkeit gefunden, das Speichern von Daten von der posts_table in Ihre eigene benutzerdefinierte Tabelle umzuleiten, um die Dateidaten zu speichern? (ohne Kerndateien hacken zu müssen)


5
Anstatt die post_table zu ändern, verwenden Sie doch etwas wie wordpress.org/extend/plugins/hyperdb , um die Tabellen zwischen Datenbanken / Servern aufzuteilen.
Pontus Abrahamsson

1
Könnten Sie näher erläutern, was genau Ihr Anliegen ist (Leistung?) Und wie zusätzliche Tabellen es lösen? Es ist bekannt, dass WP sehr große Mengen an Posts verarbeitet (natürlich mit ausreichender Hardware).
Rarst

Vielen Dank, Pontus - HyperDB scheint an diesem Punkt über meinem Kopf zu sein. Ich prüfe es aber.
user28216

Selten - Ich bin kein DBA, aber nach Recherchen in Foren scheinen die Leute eine Verlangsamung bei etwa 50.000 post_table-Einträgen zu sehen. und abgesehen von der Aufteilung der Tabellen habe ich keine solide Lösung dafür gesehen. Die Verlangsamung scheint insbesondere im AdminPanel und in den Listenansichten Taxonomy / Category & Custom wp_query aufzutreten. Die Website wird sich stark auf Steuer- / Katzen- / benutzerdefinierte Abfrageansichten stützen, was mich am meisten beschäftigt. Ich bin mir nicht sicher, warum WP keine separate "Upload" -Tabelle abgespalten hat, damit die Posts-Tabelle nicht so schnell aufgebläht wird. Es scheint ein altes Designproblem zu sein, das bald behoben werden muss.
user28216

Rarst - Auch vergessen, in "Suchanfragen" zu erwähnen, die eine vollständige Tabelle% Schlüsselwort% Suche durchführen, könnte eine große Tabelle dramatisch verlangsamen. Ich kann sehen, dass die Seite innerhalb von 2 Jahren 5.000 Beiträge hat. Bei 100 Fotos pro Beitrag sind das 500.000 post_table-Einträge. Daher muss MySQL jetzt 500.000 Einträge für die Suche durchlaufen, gegenüber nur 5.000 Einträgen (hatten sie Uploads in eine separate Tabelle aufgeteilt). Ich bin wieder kein DBA, aber das muss die Suche dramatisch verlangsamen.
user28216

Antworten:


1

Möglicherweise gibt es eine überschaubare Möglichkeit, die Bilder vom Speichern als Anhänge (auch als Posts bezeichnet) zum Speichern in einem Array zu verschieben, das auf der Ebene der übergeordneten Posts gespeichert wird. Ich denke, es wird davon abhängen, wie viel Sie brauchen, um die Bilder zu manipulieren, zu löschen usw.

Ein Wechsel zu einem anderen Tisch könnte helfen, aber es scheint mir, dass Sie Peter ausrauben, um Paul zu bezahlen. Sicher, größere Tabellen tun weh, aber wenn diese Zeilen woanders sind und Sie noch einen Join usw. benötigen, wie viel wird gespart? Ich denke, Sie müssen möglicherweise etwas mehr aus dem Rahmen werfen, um diese Nuss zu knacken.


"Shift the images" war in der Tat meine Hoffnung. Es gibt jedoch drei Aktionen im Leben einer Datei: 1. Laden Sie Medien hoch. 2. Bearbeiten Sie die Medien. 3 Beitrag löschen (wodurch alle Medien gelöscht werden). Ich würde Hooks in allen 3 dieser Aktionen benötigen, und ich kann keine Hooks finden, die mir helfen, alle 3 zu machen.
user28216

0

Sie können manuell eine neue Tabelle in Ihrem phpMyAdmin auf dem Server erstellen (es ist offensichtlich Ihre Site, dass Sie nicht häufig auf einen neuen Server wechseln) oder natürlich die Tabellenerstellung mit einer Themeninstallation oder ähnlichem verknüpfen. Wordpress verwendet das Objekt / die Klasse $ wpdb, um eine Abfrage in der Wordpress-Datenbank durchzuführen . Dort können Sie sehen, wie Sie eine Abfrage in der WP-Datenbank ausführen. Also würde ich so etwas verwenden:

<?php
global $wpdb; // Object must be globalized.

$wpdb->query("
CREATE TABLE IF NOT EXISTS ".$wpdb->prefix."new_table (
    id bigint(20) unsigned NOT NULL AUTO_INCREMENT,
    post_id bigint(20) NOT NULL,
    image_url varchar(250) NOT NULL,
    PRIMARY KEY (id),
    KEY post_id (post_id)
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ");
?>

Sie können es in eine Funktion einfügen und es beispielsweise mit theme_init oder ähnlichem verknüpfen. Ändern Sie die Felder nach Ihren Wünschen. Ein anderer Weg ist dbDelta () Funktion, die einige spezifische Regeln hat und weil der , dass ich den richtigen Grund der Verwendung es nicht sehen (vielleicht einige da ist und ich bin falsch) - Sie können alles darüber finden hier (I Ich kann wegen Wiederholung keine weiteren Permalinks setzen. Entschuldigung: D)

Nachdem Sie die Tabelle erstellt haben, können Sie sie beliebig bearbeiten. Sie können die Registrierung dieser Anhänge in eine neue Tabelle einbinden. Sie können auch eine Funktion einbinden, die verhindert, dass Anhänge in die Posts-Tabelle eingefügt werden. Aufgrund der geringen Anzahl von Spalten (wie zum Beispiel Postmeta-Tabellen) ist es meiner Meinung nach leicht und daher muss die Manipulation bei der Bearbeitung dieser Bilder verbessert werden.


Es gibt dbDelta()für diese Aufgabe.
Kaiser

0

Ich nehme an, wenn Sie die Informationen wirklich in einer anderen Tabelle speichern möchten, könnten Sie dies tun, aber das Problem besteht darin, dies sofort zu verwalten. Das Hinzufügen von Details wie der Post-ID ist einfach, da dies Teil des globalen Post-Objekts ist Die Bild-URL (für eine gerade hochgeladene Datei) ist nicht.

Das Problem ist, dass die Medien über die integrierte WordPress-Benutzeroberfläche in eine eigene Tabelle aufgenommen werden müssen, indem sie mit dem Medien-Uploader hochgeladen werden müssen, der Zeilen in der Beitragstabelle als Anhangstypen erstellt, wodurch das ursprüngliche Ziel verfehlt wird .

Um Zeilen aus anderen Tabellen zu entfernen, wenn ein Beitrag gelöscht wird, können Sie Folgendes tun:

add_action('admin_init', 'codex_init');
function codex_init() {
if (current_user_can('delete_posts')):
    // todo: remove records when posts are removed
    add_action('delete_post', 'post_sync', 10);
endif;
}

function post_sync($pid) {
    global $wpdb;
    // no need to check, just delete and watch our for number of records deleted
    return $wpdb->query($wpdb->prepare('DELETE FROM custom_table_name WHERE post_id = %d', $pid));
 }

Weitere Informationen zu den Hooks erhalten Sie hier: http://codex.wordpress.org/Plugin_API/Action_Reference/


-1

Könnten Sie versuchen, ein Plugin zu verwenden? Ich habe Typen von wp-types.com verwendet und es ist ein Vergnügen für Bilder. Es speichert alle Informationen als Metadaten und ermöglicht es Ihnen, alles auch über die Benutzeroberfläche zu verwalten:

http://wp-types.com/home/types-manage-post-types-taxonomy-and-custom-fields/

Als zusätzlichen Bonus werden alle Bilder dann auf dem Hauptbildschirm der Benutzeroberfläche angezeigt und nicht hinter der Schaltfläche zum Hinzufügen von Medien versteckt, was Benutzer, mit denen ich mich befasst habe, manchmal verwirrt. Es werden auch alle verschiedenen Miniaturbildgrößen erstellt. Wenn Sie alle Dateidaten als Post-Metadaten behalten, bedeutet dies, dass beim Entfernen von Bildern auch das Meta entfernt wird, wodurch die Datenbank aufgeräumt bleibt.


1
Die Frage betrifft eine separate Tabelle . Das von Ihnen empfohlene Plugin macht das nicht.
Fuxia

Tatsächlich speichert das Plugin es in der Tabelle wp_postmeta, die von der Tabelle wp_posts getrennt ist :)
Terry Kernan

-1

Sie haben erwähnt, dass Sie keine separate Galerie verwenden möchten, aber dies ist die richtige Methode, um dies zu erreichen. Wählen Sie eine Galerie und ein Plugin aus, mit dem Sie einen Beitrag entweder per Shortcode oder über ein benutzerdefiniertes Feld anhängen können. Auf diese Weise haben Sie die volle Kontrolle über die Beiträge und die Galerien. Sie können auch das erweiterte benutzerdefinierte Feld-Plugin (Repeater-Feld aktiviert) verwenden, um eine Galerie im benutzerdefinierten Feldbereich der Beiträge zu erstellen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.