Как я могу запросить пользовательский тип сообщения с пользовательской таксономией?

26

По какой-то причине я считаю трудным захватить какие-либо посты с помощью пользовательской таксономии ... может кто-нибудь разгадать мою глупость?

 $args = array(
    'post_type' => 'adverts',
    'advert_tag' => 'politics' // Doesn't seem to work.
  );

query_posts($args); 

while ( have_posts() ) : the_post();
 //Show Posts
endwhile;

Таксономическая декларация:

add_action( 'init', 'add_custom_taxonomy', 0 );
function add_custom_taxonomy() {
register_taxonomy('advert_tag', 'Adverts', array(
  'hierarchical' => true,
  'labels' => array(
    'name' => _x( 'Advert Tags', 'taxonomy general name' ),
    'singular_name' => _x( 'Advert Tag', 'taxonomy singular name' ),
    'search_items' =>  __( 'Search Advert Tags' ),
    'all_items' => __( 'All Advert Tags' ),
    'parent_item' => __( 'Parent Advert Tag' ),
    'parent_item_colon' => __( 'Parent Advert Tag:' ),
    'edit_item' => __( 'Edit Advert Tag' ),
    'update_item' => __( 'Update Advert Tag' ),
    'add_new_item' => __( 'Add New Advert Tag' ),
    'new_item_name' => __( 'New Advert Tag Name' ),
    'menu_name' => __( 'Advert Tags' ),
  ),
  'rewrite' => array(
    'slug' => 'advert-tags',
    'with_front' => false,
    'hierarchical' => true
  ),
));
  }

Пользовательская декларация типа сообщения:

  add_action( 'init', 'create_post_type' );
  function create_post_type() {
    register_post_type( 'Adverts',
    array(
        'labels' => array(
            'name' => __( 'Adverts' ),
            'singular_name' => __( 'Advert'),
            'add_new' => __( 'Add New' ),
            'add_new_item' => __( 'Add a New Advert' ),
            'edit' => __( 'Edit' ),
            'edit_item' => __( 'Edit Advert' ),
            'new_item' => __( 'New Advert' ),
            'view' => __( 'View' ),
            'view_item' => __( 'View Advert' ),
            'search_items' => __( 'Search Adverts' ),
            'not_found' => __( 'No Adverts found' ),
            'not_found_in_trash' => __( 'No Adverts found in Trash' ),
            ),
        'supports' => array(
                'title',
                'thumbnail',
            ),
        'has_archive' => true,
        'menu_position' => 10,
        'public' => true,
        'rewrite' => array( 'slug' => 'adverts' ),
        'taxonomies' => array('advert_tag')
    )
);

}

Стивен
источник

Ответы:

37

Елки всех не использовать query_posts()когда - либо , прочитать об этом здесь: Когда вы должны использовать WP_Query против query_posts () против get_posts ()? ,

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

$the_query = new WP_Query( array(
    'post_type' => 'Adverts',
    'tax_query' => array(
        array (
            'taxonomy' => 'advert_tag',
            'field' => 'slug',
            'terms' => 'politics',
        )
    ),
) );

while ( $the_query->have_posts() ) :
    $the_query->the_post();
    // Show Posts ...
endwhile;

/* Restore original Post Data 
 * NB: Because we are using new WP_Query we aren't stomping on the 
 * original $wp_query and it does not need to be reset.
*/
wp_reset_postdata();
Евгений Мануйлов
источник
2
Просто заметил, что, кажется, тянет все посты с пользовательским типом поста "Реклама". Однако, похоже, это делает работу: $ the_query = new WP_Query (array ('post_type' => 'Adverts', 'advert_tag' => 'policy'));
Стивен
@Stephen {tax} устарел с версии 3.1 в пользу {tax_query} и {tax_query}. это все еще работает, но мы не должны использовать устаревшие функции. tax_query используется с массивом запросов таксономии. я работал над пользовательским типом поста FAQ, и он работал для меня почти так же, как аргумент {tax} таксономии в WP_Query.
Аамер Шахзад
16

Я использую этот запрос для извлечения пользовательских сообщений (FAQs Posts) с его пользовательской таксономией (faq_category). поскольку параметр {taxonomy} в аргументах WP_Query устарел с версии v.3.1 и введен {tax_query}. Ниже приведен код, который отлично работает.

$query = new WP_Query( array(
    'post_type' => 'faqs',          // name of post type.
    'tax_query' => array(
        array(
            'taxonomy' => 'faq_category',   // taxonomy name
            'field' => 'term_id',           // term_id, slug or name
            'terms' => 48,                  // term id, term slug or term name
        )
    )
) );

while ( $query->have_posts() ) : $query->the_post();
    // do stuff here....
endwhile;

/**
 * reset the orignal query
 * we should use this to reset wp_query
 */
wp_reset_query();
Аамер Шахзад
источник
Это правильный ответ - принятый ответ не будет фильтроваться по таксономии, поскольку для tax_query требуется массив массивов. Этот вложенный метод важен для того, чтобы заставить это работать. Спасибо за ваш ответ)
Том Дайер
да, вы правы, добро пожаловать, Том Дайер
Аамер Шахзад
Да, этот также помог мне заставить шаблон таксономии работать. Спасибо!
user3135691
Эй, @AamerShahzad У меня точно такой же вопрос, и я использовал твой ответ, но страница не тянет ни одной записи. Вы можете помочь мне здесь? stackoverflow.com/questions/55783769/…
Desi
-1

Этот ответ больше не действителен, так как WordPress изменяет информацию о параметрах таксономии. пожалуйста, используйте этот способ. Это сработает. Меня устраивает. «tax_query» заменяется на «tax». надеюсь, это сработает.

$the_query = new WP_Query( array(
    'post_type' => 'Adverts',
    'tax' => array(
        array (
            'taxonomy' => 'advert_tag',
            'field' => 'slug',
            'terms' => 'politics',
        )
    ),
) );

while ( $the_query->have_posts() ) :
    $the_query->the_post();
    // Show Posts ...
endwhile;

/* Restore original Post Data 
 * NB: Because we are using new WP_Query we aren't stomping on the 
 * original $wp_query and it does not need to be reset.
*/
wp_reset_postdata();
mamunuzaman
источник
Это полная противоположность - taxбыл старый путь, tax_queryэто текущий (v3.1 +) путь.
WebElaine
Ну, я работаю v4.5, и это работает со мной
mamunuzaman
WP известен своей обратной совместимостью. Старый способ все еще работает, но он устарел, так что в конечном итоге он может быть удален и безопаснее использовать более новый метод.
WebElaine