Ersetzen Sie die Hauptabfrage durch die benutzerdefinierte Abfrage

Ich möchte die Hauptabfrage durch meine eigene benutzerdefinierte Abfrage ersetzen. Die Sache ist, ich möchte nicht die Mühe des manuellen Paging gehen. Ich weiß, dass es einen Filter posts_results aber ich bin nicht sicher, wie man es genau benutzt, ich konnte nicht eine Menge von Informationen darüber finden. Es sieht so aus, als ob pre_get_posts nur die Abfrage ändert, anstatt sie vollständig zu ersetzen. Ich habe versucht, meine Anfrage nur in $posts aber dann habe ich den Seitenwechsel verloren. Gibt es einen Weg dahin?

Ich verwende $posts = wpdb->get_results($query); um die Hauptabfrage durch meine eigene zu ersetzen.

$query ist mein benutzerdefiniertes SQL. Ich get_header() das Snippet oben rechts unter get_header() . Ich versuche, die Hauptabfrage auf meiner benutzerdefinierten Taxonomieseite zu bearbeiten: taxonomy-mytax.php .

Die Situation

Momentan hat mein Kunde Hersteller (Taxonomie) und Produkte (Taxonomie) dann ein aktuelles Produkt (Custom Post Type). Sie haben gebeten, Produktposts (auf der Produktkategorie page – taxonomy-producttax.php ) in einer Reihenfolge nach ihrem günstigsten Hersteller (Taxonomie) zu zeigen. Also habe ich ein zusätzliches Feld in die Herstellertaxonomie eingefügt, wo sie eine Zahl festlegen können, die einen Auftrag deklariert. Diese Nummer wird in $wpdb->terms.term_group . Jetzt versuche ich auf der Produktkategorieseite die Hauptabfrage vollständig durch eine brandneue Abfrage zu ersetzen, die alle Produkte erhält und sie in Reihenfolge durch eine Hersteller- term_group . Sowohl das Produkt als auch die Hersteller (beide Taxonomien) haben einen Auftrag, und beide werden in $wpdb->terms.term_gruop was mühsam war. Ich habe eine benutzerdefinierte Abfrage erstellt, die funktioniert, und zeigt Beiträge in der Reihenfolge der Hersteller term_group an. Ich muss nur die Hauptabfrage auf taxonomy-producttax.php mit meiner benutzerdefinierten SQL-Abfrage ersetzen, aber ich wollte nicht in manuellen Paging gehen Ich wollte alles verwenden, was WordPress eingebaut hat, um mir zu helfen.

Solutions Collecting From Web of "Ersetzen Sie die Hauptabfrage durch die benutzerdefinierte Abfrage"

Sie können die Hauptabfrage nicht durch die Ausgabe von $wpdb . Die Hauptabfrage ist ein WP_Query Objekt. $wpdb gibt ein einfaches Array oder Objekt, aber kein WP_Query Objekt zurück.

Selbst wenn Sie rohen SQL in eine Abfrage schieben könnten (etwas in meinem Hinterkopf lässt mich denken, dass Sie können, aber ich kann es nicht schwören), ist es nicht ratsam. Versuchen Sie var_dump($wp_query); und Sie werden sehen, dass neben einer SQL-Abfrage eine Menge passiert. Damit das Objekt funktioniert – einschließlich der Paginierung, die Sie wollen – müssen alle anderen Dinge korrekt eingestellt werden.

Sie müssen pre_get_posts und vielleicht andere Abfragefilter wie posts_where , um das WP_Query Objekt zu ändern und es nicht zu ersetzen. Ohne die Details zu kennen, wie @Milo und @ChipBennett es gewünscht haben, aber Sie sind zögerlich zu stellen, wird es nicht möglich sein, Ihnen viel mehr eine Antwort zu geben.

Nun, es ist eine Taxonomie-Archivseite. Was meine Abfrage tut, ist das Bestellen von Beiträgen nach einer Kategoriereihenfolge, die der Benutzer einstellt … Also würde ich die Auswahl, die Verknüpfung, die Wo, die Reihenfolge ändern müssen.

Ohne Ihren eigentlichen Code zu sehen, ist es schwierig, eine genauere Antwort zu geben. Neben dem pre_get_posts bietet WordPress jedoch mehrere Filter, um die Abfrage noch früher zu manipulieren:

  • posts_join
  • posts_orderby
  • posts_where

Es gibt wahrscheinlich keinen wirklichen Grund, warum Sie die Hauptabfrage nicht an Ihre Bedürfnisse anpassen können:

Also habe ich ein zusätzliches Feld in die Herstellertaxonomie eingefügt, wo sie eine Zahl festlegen können, die einen Auftrag deklariert. Diese Nummer wird in $wpdb->terms.term_group . Jetzt versuche ich auf der Produktkategorieseite die Hauptabfrage vollständig durch eine brandneue Abfrage zu ersetzen, die alle Produkte erhält und sie in Reihenfolge durch eine Hersteller- term_group . Sowohl das Produkt als auch die Hersteller (beide Taxonomien) haben einen Auftrag, und beide werden in $wpdb->terms.term_gruop was mühsam war. Ich habe eine benutzerdefinierte Abfrage erstellt, die funktioniert, und zeigt Beiträge in der Reihenfolge der Hersteller term_group an.