Пользовательская таксономия и Налоговый запрос


У меня было много проблем с запуском WP_Query с tax_query в моей пользовательской таксономии.

Я на 99,9% уверен, что мой register_taxonomy правильный, так как я могу помечать сообщения правильным термином, видеть его в базе данных, и правильный термин возвращается с помощью этой функции: http://pastebin.com/18Aj1ysT .

Но когда я использую tax_query в своем WP_Query, я не получаю сообщений. Мой запрос таков:

$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 );

Он отлично работает без "tax_query". Если я что-то использую например, "talktype" => "воскресный разговор" вместо этого, используя query_var, когда я регистрирую таксономию, он просто игнорирует строку, как будто ее там не было, и печатает любые разговоры (вместо того, чтобы говорить "нет сообщений").

Вставка <?php echo $GLOBALS['nextSundayTalkQuery']->request; ?> дает мне следующее:

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

Использование идентичного кода для запроса таксономии WordPress "категория" по умолчанию работает нормально, поэтому, похоже, это связано с моей пользовательской таксономией или типом записи. Чтобы сэкономить место в этом сообщении, мой пользовательский код типа сообщения здесь:

Http://pastebin.com/LxKt2pv5

И мой пользовательский код таксономии здесь:

Http://pastebin.com/NxuuxKuG

Я пытался включить 'include_children' => false, как было предложено, но безуспешно.

Я был бы признателен за любую помощь, так как эта проблема была неразрешима в течение нескольких месяцев, когда многие люди пытались (и, к сожалению, не смогли) выяснить, в чем дело.

Author: Pete Gale, 2013-02-05

1 answers

Прежде всего, вы запускаете register_post_type на init и register_taxonomy на after_setup_theme, который вызывается после init. Это означает, что ваша пользовательская таксономия будет недоступна при регистрации типа записи. Я бы посоветовал вам удалить ключевое слово taxonomies из массива аргументов register_post_type, а затем просто зарегистрировать таксономию вручную. В вашем примере кода похоже, что вы дважды создаете ссылку тип публикации -таксономия.

Я также не уверен в 'query_var' => true, в массиве аргументов register_taxonomy. В документации говорится вы можете установить для него значение false или строку, но не указывает, что произойдет, если вы установите для него значение true. Надеюсь, WordPress будет достаточно умен, чтобы заменить его чем-то более полезным, но поскольку вы явно не устанавливаете для него что-то другое, кроме вашего имени таксономии, просто удалите его сейчас (это означает, что вместо него будет использоваться talktype).

Я просто поместил это в пустую тему, и, похоже, она работает нормально (т.Е. Печатает SQL-запрос, включая мета-запрос). Фактически выполняющий запрос вместо этого тоже отлично работает:

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(); ?>

РЕДАКТИРОВАТЬ: Просто попробовал запустить ваш код без изменений, и это действительно работает. Насколько я могу судить, бит 0 = 1 в SQL генерируется, когда не найдена указанная таксономия или термин, что означает, что INNER JOIN не может быть создан. Убедитесь, что у вас есть термин в базе данных, и что и термин, и таксономия отображаются на экране редактирования вашего сообщения тип.

Я знаю, что вы проверили и перепроверили содержимое терминов в своей базе данных, поэтому, если это все еще не решает вашу проблему, попробуйте изолировать проблему дальше. Начните с использования чистой установки WordPress, добавив только код, который я указал выше, добавив сообщение talk и присвоив ему термин sunday-talk. Это прекрасно работает, когда я пытаюсь это сделать. Также попробуйте вручную запустить SQL непосредственно в вашей базе данных, если это не сработает, можно с уверенностью сказать, что связь post/term не существует. Результирующий SQL-запрос должен выглядеть примерно так (хотя обязательно измените значение wp_term_relationships.term_taxonomy_id):

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
Author: Simon, 2017-01-03 07:36:11