WordPress

niestandardowe typy postów – tax_query nie pokazuje żadnych wyników

  • 3 listopada, 2014
  • 5 min read
niestandardowe typy postów – tax_query nie pokazuje żadnych wyników


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.

Warto przeczytać!  Jak utworzyć suwak wideo w WordPress (prosty samouczek)

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


Źródło