it-swarm.com.ru

Загрузка пользовательских сообщений с тем же тегом, что и страница

Я использую этот плагин для добавления тегов для страницы: http://wordpress.org/extend/plugins/post-tags-and-categories-for-pages/

И я добавил поддержку тегов для пользовательского поста:

function codex_custom_init() {
    $args = array(
      'public' => true,
      'has_archive' => true,
      'label'  => 'Doing',
      'taxonomies' => array('post_tag'),
      'supports' => array( 'title', 'editor', 'thumbnail', 'excerpt')
    );
    register_post_type( 'doing', $args );
}
add_action( 'init', 'codex_custom_init' );

Можно ли это сделать на каждой странице с определенным тегом, в котором я хочу отобразить связанные пользовательские сообщения, которые имеют такой же тег, что и страница? Как я могу загрузить на страницу теги, связанные с пользовательскими сообщениями?

Я пытался с этим кодом, но не показывает связанных сообщений:

  <?php
      $tags = wp_get_post_tags($post->ID);
      if ($tags) {
          echo 'Related Posts';
          $first_tag = $tags[0]->term_id;
          $args=array(
              'tag__in' => array($first_tag),
              'post__not_in' => array($post->ID),
              'posts_per_page'=>5,
              'caller_get_posts'=>1
          );
          $my_query = new WP_Query($args);
          if( $my_query->have_posts() ) {
              while ($my_query->have_posts()) : $my_query->the_post(); ?>
              <a href="<?php the_permalink() ?>" rel="bookmark" title="Permanent Link to <?php the_title_attribute(); ?>"><?php the_title(); ?></a>

               <?php
               endwhile;
          }
          wp_reset_query();
      }
  ?>
4
wpuser

Вам необходимо указать тип сообщения в аргументах WP_Query, когда вам нужно запросить любой другой тип сообщения, принимающий встроенный тип сообщения post.

По умолчанию для post_type установлено значение post, поэтому, если пользователь не установил конкретный тип сообщения вручную, WP_Query будет запрашивать сообщения из типа сообщения post

Кроме того, caller_get_posts устарела в течение очень и очень долгого времени. Если бы вы включили отладку, вы бы получили уведомление об устаревании по этому поводу. Правильные аргументы для использования это ignore_sticky_posts.

Я также не стал бы использовать глобальный $post, поскольку он ненадежен, для надежности, скорее используйте $GLOBALS['wp_the_query']->get_queried_object(). Вы можете прочитать эту тему в мой ответ здесь

get_the_tags() также быстрее, чем wp_get_post_tags(), так как последний требует дополнительного вызова db.

Последнее замечание, wp_reset_query() используется с query_posts, правильная функция для использования с WP_Query это wp_reset_postdata()

По сути, вы можете попробовать следующее

$post_id = $GLOBALS['wp_the_query']->get_queried_object_id();
$tags = get_the_tags( $post_id );
if (    $tags
     && !is_wp_error( $tags ) 
) {
    $args = [
        'post__not_in' => [$post_id],
        'post_type'    => 'doing',
        'tag__in'      => [$tags[0]->term_id],
        // Rest of your args
    ];
    $my_query = new WP_Query( $args );

    // Your loop

    wp_reset_postdata();
}
5
Pieter Goosen

Мой первый порт вызова - это вызов global $post; - так как он настраивает вас на использование $post->ID ... если вы его используете, то следующим шагом будет отображение каждой части отдельно, например,.

print_r($tags);

echo $first_tag;

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

2
Gareth Gillman