it-swarm.com.ru

Пользовательская таксономия с пользовательским типом сообщений не находит сообщений

Я создал собственный тип записи с именем mfg_ppn и пользовательскую таксономию под названием mfg_pp, и на них ссылаются как $this->cpt_promotion_news и $this->cpt_promotion, если вам интересно их узнать.

В админе все выглядит хорошо, и я легко могу назначить таксономию для пользовательских сообщений. Но когда я захожу на свой сайт с помощью http://example.com/promotion/company, я не получаю никаких сообщений, даже если к этому конкретному термину привязано 12 сообщений.

Вот мой код PHP, используемый для регистрации типа записи:

// Register campaign news:
register_post_type($this->cpt_promotion_news, array(
    'labels' => array(
        'name' => __('Campaign Posts', $this->plugin_locale),
        'singular_name' => __('Promotion Campaign', $this->plugin_locale),
        'menu_name' => __('Promotion', $this->plugin_locale),
        'all_items' => __('All Campaign Posts', $this->plugin_locale),
        'add_new' => __('Add New Post', $this->plugin_locale),
        'add_new_item' => __('Add New Campaign Post', $this->plugin_locale),
        'edit_item' => __('Edit Post', $this->plugin_locale),
        'new_item' => __('New Post', $this->plugin_locale),
        'view_item' => __('View Post', $this->plugin_locale),
        'search_items' => __('Search Posts', $this->plugin_locale),
        'not_found' => __('No posts found', $this->plugin_locale),
        'not_found_in_trash' => __('No posts found in trash', $this->plugin_locale),
        'parent_item_colon' => __('Post parent:', $this->plugin_locale)
    ),
    'description' => __('News for a partner promotion campaign.', $this->plugin_locale),
    'public' => true,
    'exclude_from_search' => true,
    'show_in_nav_menus' => true,
    'menu_position' => 25,
    'show_in_menu' => true,
    'map_meta_cap' => true,
    'capabilities' => array( 'manage_options' ),
    'capability_type' => 'post',
    'hierarchical' => false,
    'supports' => array( 'title', 'editor', 'thumbnail', 'comments' ),
    'taxonomies' => array( $this->cpt_promotion ),
    'has_archive' => true,
    'rewrite' => array(
        'slug' => __('promotion-post', $this->plugin_locale)
    )
));

А вот код для регистрации таксономии:

// Register promotion campaigns:
register_taxonomy($this->cpt_promotion, $this->cpt_promotion_news, array(
    'labels' => array(
        'name' => __('Promotion Campaigns', $this->plugin_locale),
        'singular_name' => __('Promotion Campaign', $this->plugin_locale),
        'menu_name' => __('All Campaigns', $this->plugin_locale),
        'all_items' => __('All Campaigns', $this->plugin_locale),
        'edit_item' => __('Edit Campaign', $this->plugin_locale),
        'view_item' => __('View Campaign', $this->plugin_locale),
        'update_item' => __('Update Campaign', $this->plugin_locale),
        'add_new_item' => __('Add New Promotion Campaign', $this->plugin_locale),
        'new_item_name' => __('New Campaign Name', $this->plugin_locale),
        'parent_item' => __('Post parent:', $this->plugin_locale),
        'parent_item_colon' => __('Post parent:', $this->plugin_locale),
        'search_items' => __('Search Campaigns', $this->plugin_locale),
        'add_or_remove_items' => __('Add or Remove Campaigns', $this->plugin_locale)
    ),
    'public' => true,
    'show_ui' => true,
    'show_in_nav_menus' => false,
    'show_tagcloud' => false,
    'show_admin_column' => true,
    'hierarchical' => true,
    'query_var' => true,
    'rewrite' => array(
        'slug' => __('promotion', $this->plugin_locale)
    )
));

Я также создал шаблон с именем taxonomy-mfg_pp, который является названием таксономии, но он никогда не выводит никаких сообщений, даже если они есть. Похоже, виновник в том, что исполняемый WP_Query ищет только сообщения, страницы и вложения, как показано ниже:

SELECT SQL_CALC_FOUND_ROWS  qADrathuFrU2_posts.ID FROM qADrathuFrU2_posts  INNER JOIN qADrathuFrU2_term_relationships ON (qADrathuFrU2_posts.ID = qADrathuFrU2_term_relationships.object_id) WHERE 1=1  AND ( qADrathuFrU2_term_relationships.term_taxonomy_id IN (1196) ) AND qADrathuFrU2_posts.post_type IN ('post', 'page', 'attachment') AND (qADrathuFrU2_posts.post_status = 'publish' OR qADrathuFrU2_posts.post_author = 1 AND qADrathuFrU2_posts.post_status = 'private') AND qADrathuFrU2_posts.post_password = ''  GROUP BY qADrathuFrU2_posts.ID ORDER BY qADrathuFrU2_posts.post_date DESC LIMIT 0, 10

Я что-то не так делаю и поступаю неправильно?

Пожалуйста, помогите мне, поскольку приближается крайний срок, и я просто не могу понять это правильно!

Заранее спасибо Джонатан

4
Jonathan

Я не знаю, как и почему, но этот код ниже решен проблемой. Мне кажется, что мне это не нужно, но, видимо, мне это нужно.

add_filter('pre_get_posts', array(&$this, 'modify_pre_query_request'));
public function modify_pre_query_request($query){
    if ($query->is_main_query()){
        if ($query->is_tax){
            $post_type = get_query_var('post_type');
            if (!$post_type){
                $post_type = array( 'post', 'YOUR POST TYPE' );
                $query->set('post_type', $post_type);
            }
        }
    }
}

Помните, что приведенный выше код предназначен для объектно-ориентированной темы. Если вы не работаете с объектно-ориентированной темой, используйте вместо этого следующий код:

add_filter('pre_get_posts', 'modify_pre_query_request');
function modify_pre_query_request($query){
    if ($query->is_main_query()){
        if ($query->is_tax){
            $post_type = get_query_var('post_type');
            if (!$post_type){
                $post_type = array( 'post', 'YOUR POST TYPE' );
                $query->set('post_type', $post_type);
            }
        }
    }
}

Спасибо за помощь!

7
Jonathan

Со всей признательностью ответу Джонатана и благодаря этому ответу , это может быть более гибкий способ решения этой проблемы, поскольку он автоматически определяет тип сообщения, и вам не нужно беспокоиться об имени типа сообщения :

add_action( 'pre_get_posts', 'dw_handle_posts' );
function dw_handle_posts( $query ) {
    if( ! $query->is_main_query() || is_admin() )
        return;

    if ( $query->is_tax ){
        $post_type = get_query_var('post_type');
        if( ! $post_type ){
            global $wp_taxonomies;
            $taxo = get_queried_object();
            $post_type = ( isset( $wp_taxonomies[$taxo->taxonomy] ) ) ? $wp_taxonomies[$taxo->taxonomy]->object_type : array();
            $query->set('post_type', $post_type);
        }
    }

    return $query;
}
0
Amin