niestandardowe typy postów – tax_query nie pokazuje żadnych wyników
![niestandardowe typy postów – tax_query nie pokazuje żadnych wyników](https://oen.pl/wp-content/uploads/2023/01/apple-touch-icon@2.png)
Tworzę witrynę muzycznej bazy danych z dwoma niestandardowymi typami postów: utworami i albumami. Połączyłem utwory z ich odpowiednimi albumami z niestandardową taksonomią dla ślimaka albumu. Na każdej stronie albumu próbuję uzyskać listę utworów z albumu, pobierając wszystkie utwory za pomocą a dub_album_slug
taksonomia, która pasuje do ślimaka bieżącego albumu. Oto mój kod dla tego zapytania:
global $post;
$post_slug = $post->post_name;
$args = array (
'post_type' => 'dub_track',
'tax_query' => array(
array(
'taxonomy' => 'dub_album_slug',
'field' => 'name',
'terms' => $post_slug,
),
'orderby' => 'dub_track_no',
'order' => 'ASC',
),
);
$tracks_query = new WP_Query( $args );
W tej chwili w ogóle nic nie wyświetla. Nawet jeśli ręcznie wstawię termin, o którym wiem, że istnieje i ma powiązane posty, nic się nie dzieje.
Oto kod, którego używam do wyprowadzania danych:
<?php if ($tracks_query->have_posts()) : ?>
<?php while ($tracks_query->have_posts()) : $tracks_query->the_post(); ?>
<?php echo get_the_term_list( $post->ID, 'dub_original_artist', '', ', ' ); ?>
etc.
Oto moja niestandardowa rejestracja typu postu:
//Register Track Custom Post Type
if ( ! function_exists('dub_track_custom_post_type') ) {
// Register Custom Post Type
function dub_track_custom_post_type() {
$labels = array(
'name' => _x( 'Tracks', 'Post Type General Name', 'text_domain' ),
'singular_name' => _x( 'Track', 'Post Type Singular Name', 'text_domain' ),
//...
);
$rewrite = array(
'slug' => 'track',
'with_front' => true,
'pages' => true,
'feeds' => false,
);
$args = array(
'label' => __( 'dub_track', 'text_domain' ),
'description' => __( 'Dub Tracks', 'text_domain' ),
'labels' => $labels,
'supports' => array( 'title', 'editor', 'revisions', 'custom-fields', ),
'taxonomies' => array( 'track-no', 'original-artist', 'original-title', 'original-released', 'producer', 'comment', 'album-slug', 'artist', 'riddim' ),
'hierarchical' => false,
'public' => true,
'show_ui' => true,
'show_in_menu' => true,
'show_in_nav_menus' => true,
'show_in_admin_bar' => true,
'menu_position' => 5,
'can_export' => true,
'has_archive' => true,
'exclude_from_search' => false,
'publicly_queryable' => true,
'rewrite' => $rewrite,
'capability_type' => 'post',
);
register_post_type( 'dub_track', $args );
}
// Hook into the 'init' action
add_action( 'init', 'dub_track_custom_post_type', 0 );
}
Oto moja niestandardowa rejestracja taksonomii:
//Register Album Slug Custom Taxonomy
if ( ! function_exists( 'dub_album_slug' ) ) {
// Register Custom Taxonomy
function dub_album_slug() {
$labels = array(
'name' => _x( 'Album Slug', 'Taxonomy General Name', 'text_domain' ),
'singular_name' => _x( 'Album Slug', 'Taxonomy Singular Name', 'text_domain' ),
//...
);
$rewrite = array(
'slug' => 'album-slug',
'with_front' => true,
'hierarchical' => false,
);
$args = array(
'labels' => $labels,
'hierarchical' => false,
'public' => true,
'show_ui' => true,
'show_admin_column' => true,
'show_in_nav_menus' => true,
'show_tagcloud' => true,
'rewrite' => $rewrite,
);
register_taxonomy( 'dub_album_slug', array( 'dub_track' ), $args );
}
// Hook into the 'init' action
add_action( 'init', 'dub_album_slug', 0 );
}
Oto, z czego dostaję $tracks_query->request
:
SELECT SQL_CALC_FOUND_ROWS dub_posts.ID FROM dub_posts INNER JOIN dub_term_relationships ON (dub_posts.ID = dub_term_relationships.object_id)
LEFT OUTER JOIN dub_term_relationships ON dub_posts.ID=dub_term_relationships.object_id
LEFT OUTER JOIN dub_term_taxonomy USING (term_taxonomy_id)
LEFT OUTER JOIN dub_terms USING (term_id) WHERE 1=1 AND ( dub_term_relationships.term_taxonomy_id IN (16) ) AND dub_posts.post_type="dub_track" AND (dub_posts.post_status="publish") AND (taxonomy = 'dub_track_no' OR taxonomy IS NULL) GROUP BY object_id ORDER BY GROUP_CONCAT(dub_terms.name ORDER BY name ASC) ASC LIMIT 0, 20
Nie jestem świetny w MySQL ani w sposobie działania taksonomii w bazie danych WordPress.
Po prostu pomyślałem o czymś, co może być istotne. Używam znalezionego kodu, aby uporządkować utwory według taksonomii numerów utworów. Modyfikuje zapytanie MySQL bezpośrednio, więc myślę, że może to powodować problem. tutaj:
function orderby_tax_clauses( $clauses, $wp_query ) {
global $wpdb;
$taxonomies = get_taxonomies();
foreach ($taxonomies as $taxonomy) {
if ( isset( $wp_query->query['orderby'] ) && $taxonomy == $wp_query->query['orderby'] ) {
$clauses['join'] .=<<<SQL
LEFT OUTER JOIN {$wpdb->term_relationships} ON {$wpdb->posts}.ID={$wpdb->term_relationships}.object_id
LEFT OUTER JOIN {$wpdb->term_taxonomy} USING (term_taxonomy_id)
LEFT OUTER JOIN {$wpdb->terms} USING (term_id)
SQL;
$clauses['where'] .= " AND (taxonomy = '{$taxonomy}' OR taxonomy IS NULL)";
$clauses['groupby'] = "object_id";
$clauses['orderby'] = "GROUP_CONCAT({$wpdb->terms}.name ORDER BY name ASC) ";
$clauses['orderby'] .= ( 'ASC' == strtoupper( $wp_query->get('order') ) ) ? 'ASC' : 'DESC';
}
}
return $clauses;
}
add_filter('posts_clauses', 'orderby_tax_clauses', 10, 2 );
Mam nadzieję, że możesz mi pomóc. Daj mi znać, jeśli potrzebujesz więcej kodu. Dzięki