Wie wählt man Mysql eine Liste von Beiträgen mit Metawerten und allen relevanten Kategorien?

Ich versuche, eine Liste von Posts zu erstellen und einen Bericht anzuzeigen, der sowohl einige Metawerte für jeden Post anzeigt, als auch eine Liste aller Kategorien, an die jeder Post angehängt ist.

Ich verwende das raffinierte Export- und Berichtsmodul, um die Ergebnisse meiner Abfrage zu formatieren, und die Daten, die ich auslesen möchte, sind eine Liste von Woocommerce-Produkten.

Ich bin soweit gekommen:

SELECT wp_posts.ID, wp_posts.post_title AS Product, m2.meta_value AS _retail_price, m4.meta_value AS _stock FROM wp_posts LEFT JOIN wp_postmeta AS m2 ON m2.post_id = wp_posts.ID AND m2.meta_key = '_price' LEFT JOIN wp_postmeta AS m4 ON m4.post_id = wp_posts.ID AND m4.meta_key = '_stock' WHERE wp_posts.post_type IN ('product', 'product_variation') AND wp_posts.post_status = 'publish' ORDER BY wp_posts.ID ASC 

Das funktioniert, ich bekomme eine Liste von Posts (Produkten) mit den entsprechenden Metawerten.

Aber ich möchte jetzt eine Liste von Kategorien hinzufügen, in der jeder Beitrag aufgeführt ist, idealerweise mit einer Spalte pro Kategorie. Aber jeder Beitrag ist in mehreren Kategorien, und ich bin ratlos, wie man die Kategorien für jeden herausziehen kann.

Ich tat:

 SELECT wp_posts.ID AS ProdId, wp_posts.post_title AS Product, m1.meta_value AS _retail_price, m2.meta_value AS _stock, wp_term_relationships.*, wp_terms.* FROM wp_posts, wp_term_relationships, wp_terms LEFT JOIN wp_postmeta AS m1 ON m1.post_id = wp_posts.ID AND m1.meta_key = '_price' LEFT JOIN wp_postmeta AS m2 ON m2.post_id = wp_posts.ID AND m2.meta_key = '_stock' LEFT JOIN wp_posts posts2 ON wp_term_relationships.object_id = wp_posts.ID LEFT JOIN wp_term_taxonomy ON wp_term_taxonomy.term_taxonomy_id = wp_term_relationships.term_taxonomy_id LEFT JOIN wp_terms terms2 ON wp_terms.term_id = wp_term_relationships.term_taxonomy_id WHERE wp_posts.post_type IN ('product', 'product_variation') AND wp_posts.post_status = 'publish' AND taxonomy = 'product_cat' ORDER BY wp_posts.ID ASC 

aber das gibt mir eine # 1054 – Unbekannte Spalte ‘wp_posts.ID’ in ‘on clause’ und ich glaube ich habe meine Joins in einem Gewirr 🙁

Solutions Collecting From Web of "Wie wählt man Mysql eine Liste von Beiträgen mit Metawerten und allen relevanten Kategorien?"

SQL-weise müssen Sie nur einmal der Tabelle wp_posts beitreten. Wenn Sie sich den Begriffen “stuffs” anschließen, erhalten Sie mehrere Zeilen. Daher ist es wahrscheinlich am einfachsten, diese zu gruppieren und dann GROUP_CONCAT () zu verwenden, um die Begriffe in eine durch Komma getrennte Zeichenfolge zu reduzieren ( aktualisiert für LEFT-Joins ).

 global $wpdb; $sql = $wpdb->prepare( 'SELECT p.ID, p.post_title AS Product, pm1.meta_value AS _retail_price, pm2.meta_value AS _stock' . ', GROUP_CONCAT(t.name ORDER BY t.name) AS Categories' . ' FROM ' . $wpdb->posts . ' p' . ' LEFT JOIN ' . $wpdb->postmeta . ' pm1 ON pm1.post_id = p.ID AND pm1.meta_key = %s' . ' LEFT JOIN ' . $wpdb->postmeta . ' pm2 ON pm2.post_id = p.ID AND pm2.meta_key = %s' . ' LEFT JOIN ' . $wpdb->term_relationships . ' AS tr ON tr.object_id = p.ID' . ' LEFT JOIN ' . $wpdb->term_taxonomy . ' AS tt ON tr.term_taxonomy_id = tt.term_taxonomy_id AND tt.taxonomy = %s' . ' LEFT JOIN ' . $wpdb->terms . ' AS t ON tt.term_id = t.term_id' . ' WHERE p.post_type in (%s, %s) AND p.post_status = %s' . ' GROUP BY p.ID' . ' ORDER BY p.ID ASC' , '_price', '_stock', 'product_cat', 'product', 'product_variation', 'publish' ); $ret = $wpdb->get_results( $sql ); 

Risse Knöchel

In Ordnung – so ist das erste Ding zuerst.

Arbeiten mit WordPress databaseen

  1. Lesen Sie dies: https://codex.wordpress.org/Class_Reference/wpdb
  2. Vermeiden Sie Schreib-SQL-statementen außerhalb des $ wpdb-Objekts.

Vermeiden Sie es, SQL-statementen wie wp_users zu wp_users anstatt dies zu tun:

 $users = $wpdb->get_results( "SELECT FROM $wpdb->users" ); 

Dies hilft, wenn Sie das databasepräfix ändern.

Dies geschieht außerhalb von WPDB

Ihr Pseudocode könnte so lauten:

ERHALTEN SIE POSTS> ERHALTEN SIE JEDE POSTS KATEGORIEN> ERHALTEN SIE JEDE POSTS META FIELD NAMED X.

Lasst uns alle Dinge in etwas speichern, das … $all_the_things = array();

Beiträge erhalten:

 < ?php $arguments = array( 'posts_per_page' => -1, // This is a bad idea if you run this on trafficked pages. 'post_type' => array('product', 'product_variation'), 'post_status' => 'publish' ); $query = WP_Query( $arguments ); ?> 

Jetzt müssen Sie eine Schleife machen:

 < ?php while( $query->have_posts() ) { $categories = get_the_category(); $price = get_post_meta( get_the_ID(), '_price' ); ?> $stock = get_post_meta( get_the_ID(), '_stock' ); ?> $all_the_things[get_the_ID()] = array($categories, $price, $stock); } ?> 

Jetzt, wenn du willst … Ich kann das in SQL machen – aber es ist nicht ideal. Sie können nicht darauf setzen, dass die databasestruktur genau gleich bleibt oder dass Filter, die ausgeführt werden sollen, auf Daten usw. ausgeführt werden. Dinge können kompliziert werden.

Lassen Sie mich wissen, wie das funktioniert und ich kann bei Bedarf mehr Details liefern.

Mit der function get_posts() können Sie eine sehr endliche Abfrage get_posts() . Ich habe versucht, Ihre SQL-Abfrage zu verstehen und sie so zu definieren, wie ich es mit nativer WP-functionalität tun würde, könnte aber einige Details übersehen haben. Ich habe keine Ahnung, ob du dorthin gehst oder ob das funktioniert , aber WordPress soll dir die Dinge erleichtern. Erkunden Sie diese Seite für weitere Informationen . Hoffe das bringt dich näher an dein Ziel mit mehr Leichtigkeit! Im Idealfall erhalten Sie alle möglichen Beiträge, die Sie in Spalten einfügen müssen, und Sie können die $posts nach Bedarf sortieren.

 // Argument array for get_posts $args = array( 'post_type' => array( 'product', 'product_variation', ), 'meta_query' => array( 'relation' => 'OR', array('key' => '_price'), array('key' => '_stock'), ), 'tax_query' => array( array( 'taxonomy' => 'product_cat', ) ) ); // The posts delivered $posts = get_posts( $args );