webentwicklung-frage-antwort-db.com.de

Benutzerdefinierte Taxonomie und Tax_Query

Ich hatte große Probleme, einen WP_Query mit einem tax_query in meiner benutzerdefinierten Taxonomie zum Laufen zu bringen.

Ich bin mir zu 99,9% sicher, dass mein register_taxonomy korrekt ist, da ich in der Lage bin, Beiträge mit dem richtigen Begriff zu kennzeichnen, ihn in der Datenbank anzuzeigen und der richtige Begriff mit dieser Funktion zurückgegeben wird: http://Pastebin.com/ 18Aj1ysT .

Wenn ich jedoch einen tax_query in meinem WP_Query verwende, erhalte ich keine Beiträge. Meine Anfrage lautet:

$nextSundayTalkArgs = array(  
    'post_type' => 'talk',  
    'posts_per_page' => 1,  
    'tax_query' => array(  
        array(  
            'taxonomy' => 'talktype',  
            'field' => 'slug',  
            'terms' => 'sunday-talk'  
        )  
    )  
);  
$nextSundayTalkQuery = new WP_Query( $nextSundayTalkArgs );

Es funktioniert perfekt ohne 'tax_query'. Wenn ich stattdessen so etwas wie 'talktype' => 'sunday-talk' verwende und beim Registrieren der Taxonomie query_var verwende, wird die Zeile einfach ignoriert, als wäre sie nicht vorhanden, und es wird kein Vortrag ausgegeben (anstatt "keine Beiträge" zu sagen). .

Durch das Einfügen von <?php echo $GLOBALS['nextSundayTalkQuery']->request; ?> erhalte ich Folgendes:

SELECT SQL_CALC_FOUND_ROWS wp_posts.ID 
FROM wp_posts WHERE 1=1
AND 0 = 1 
AND wp_posts.post_type = 'talk' 
AND (
    wp_posts.post_status = 'publish' 
    OR wp_posts.post_author = 1 
    AND wp_posts.post_status = 'private'
) 
GROUP BY wp_posts.ID 
ORDER BY wp_posts.post_date DESC 
LIMIT 0, 1

Die Verwendung des identischen Codes für die Abfrage der Standardtaxonomie "category" in WordPress funktioniert einwandfrei. Es scheint also, dass sie mit meiner benutzerdefinierten Taxonomie oder dem Post-Typ zusammenhängt. Um Platz in diesem Beitrag zu sparen, finden Sie hier meinen benutzerdefinierten Beitragscode:

http://Pastebin.com/LxKt2pv5

und mein benutzerdefinierter Taxonomiecode ist hier:

http://Pastebin.com/NxuuxKuG

Ich habe versucht, 'include_children' => false einzuschließen, wie vorgeschlagen, aber kein Glück.

Ich würde mich über jede Hilfe freuen, da dieses Problem seit Monaten nicht mehr zu lösen ist und viele Leute versuchen (und es leider nicht schaffen), herauszufinden, was los ist.

6
Pete Gale

Zunächst führen Sie register_post_type für init und register_taxonomy für after_setup_theme aus, der nach init aufgerufen wird. Dies bedeutet, dass Ihre benutzerdefinierte Taxonomie bei der Registrierung des Beitragstyps nicht verfügbar ist. Ich würde vorschlagen, dass Sie das Schlüsselwort taxonomies aus dem Array register_post_type arguments entfernen und anschließend die Taxonomie manuell registrieren. In Ihrem Beispielcode sieht es so aus, als würden Sie den Post-Typ-Taxonomie-Link zweimal erstellen.

Ich bin mir auch nicht sicher, ob 'query_var' => true, im Array register_taxonomy arguments enthalten ist. In der Dokumentation wird angegeben, dass Sie false oder eine Zeichenfolge festlegen können, es wird jedoch nicht angegeben, was passieren wird, wenn Sie true festlegen. Hoffentlich ist WordPress klug genug, um es durch etwas Nützlicheres zu ersetzen, aber da Sie es nicht explizit auf etwas anderes als Ihren Taxonomienamen setzen, entfernen Sie es einfach für den Moment (das bedeutet, dass stattdessen talktype verwendet wird).

Ich habe dies nur in ein leeres Thema eingefügt und es scheint gut zu funktionieren (d. H. Es druckt eine SQL-Abfrage einschließlich der Meta-Abfrage). Stattdessen funktioniert auch das Ausführen einer Abfrage:

functions.php

// Add post types of "Talk" and "Event"
function nc_custom_post_types() {
    register_post_type( 'talk',
        array(
            'labels' => array(
                'name' => __( 'Talks' ),
                'singular_name' => __( 'Talk' )
            ),
            'public' => true,
            'has_archive' => true,
        )
    );


    // Add new "talktype" taxonomy to "talk" post type
    register_taxonomy('talktype', 'talk', array(
        'hierarchical' => true,
        // This array of options controls the labels displayed in the WordPress Admin UI
        'labels' => array(
            'name' => _x( 'Talk Types', 'taxonomy general name' ),
            'singular_name' => _x( 'Talk Type', 'taxonomy singular name' ),
            'search_items' =>  __( 'Search Talk Types' ),
            'all_items' => __( 'All Talk Types' ),
            'parent_item' => __( 'Parent Talk Type' ),
            'parent_item_colon' => __( 'Parent Talk Type:' ),
            'edit_item' => __( 'Edit Talk Type' ),
            'update_item' => __( 'Update Talk Type' ),
            'add_new_item' => __( 'Add New Talk Type' ),
            'new_item_name' => __( 'New Talk Type Name' ),
            'menu_name' => __( 'Talk Types' ),
        ),
        // Control the slugs used for this taxonomy
        'rewrite' => array(
            'slug' => 'talktype',
            'with_front' => false, // Don't display the category base before "/locations/"
            'hierarchical' => true // This will allow URL's like "/locations/boston/cambridge/"
        ),
    ));
}
add_action( 'init', 'nc_custom_post_types' );

/* For testing purposes
add_action('wp', 'test');
function test() {

    $nextSundayTalkArgs = array(
        'post_type' => 'talk',
        'posts_per_page' => 1,
        'tax_query' => array(
            array(
                'taxonomy' => 'talktype',
                'field' => 'slug',
                'terms' => 'sunday-talk'
            )
        )
    );
    $nextSundayTalkQuery = new WP_Query( $nextSundayTalkArgs );

    var_dump($nextSundayTalkQuery->request);
    die();
}
*/

function sunday_query_args() {

    $nextSundayTalkArgs = array(
        'post_type' => 'talk',
        'posts_per_page' => 1,
        'tax_query' => array(
            array(
                'taxonomy' => 'talktype',
                'field' => 'slug',
                'terms' => 'sunday-talk'
            )
        )
    );

    return $nextSundayTalkArgs;
}

index.php

<?php get_header(); ?>
<?php query_posts(sunday_query_args()); ?>
<div id="content">
    <?php while ( have_posts() ) : the_post(); ?>    
         <article id="post-<?php the_ID(); ?>" <?php post_class(); ?>>
            <h1 class="entry-title"><?php the_title(); ?></h1>
            <div class="entry-content">
                <?php the_content(); ?>
            </div>
        </article>
    <?php endwhile; ?>
</div>
<?php get_sidebar(); ?>
<?php get_footer(); ?>

EDIT: Ich habe gerade versucht, Ihren Code unverändert auszuführen, und das funktioniert auch. Soweit ich weiß, wird das 0 = 1-Bit in der SQL generiert, wenn entweder die angegebene Taxonomie oder der angegebene Begriff nicht gefunden wird. Dies bedeutet, dass der INNER JOIN nicht erstellt werden kann. Stellen Sie sicher, dass Sie den Begriff in Ihrer Datenbank haben und dass sowohl der Begriff als auch die Taxonomie im Bearbeitungsbildschirm Ihres Beitragstyps angezeigt werden.

Ich weiß, dass Sie den Begriff Inhalt Ihrer Datenbank überprüft und doppelt überprüft haben. Wenn dies Ihr Problem immer noch nicht löst, versuchen Sie, das Problem weiter einzugrenzen. Beginnen Sie mit einer sauberen WordPress-Installation, indem Sie nur den oben angegebenen Code hinzufügen, eine talk Nachricht hinzufügen und ihr den sunday-talk Begriff zuweisen. Das funktioniert gut, wenn ich es versuche. Versuchen Sie auch, den SQL-Code manuell direkt in Ihrer Datenbank auszuführen. Wenn dies nicht funktioniert, können Sie mit Sicherheit sagen, dass die Post-Term-Beziehung nicht vorhanden ist. Die resultierende SQL-Abfrage sollte ungefähr so ​​aussehen (stellen Sie jedoch sicher, dass Sie den Wert von wp_term_relationships.term_taxonomy_id ändern):

SELECT SQL_CALC_FOUND_ROWS  wp_posts.ID FROM wp_posts  INNER JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id) WHERE 1=1  AND ( wp_term_relationships.term_taxonomy_id IN (4) ) AND wp_posts.post_type = 'talk' AND (wp_posts.post_status = 'publish') GROUP BY wp_posts.ID ORDER BY wp_posts.post_date DESC LIMIT 0, 1
7
Simon