kelvinjayanoris
  • 0
Новичок

Пользовательские типы сообщений на страницах категорий

  • 0

Я работаю с пользовательским типом сообщений, который использует обычные категории WordPress.

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

Проблема в том, что как только я это сделаю, это повлияет и на обычные сообщения в блогах.

Конечно, я могу ограничить обычные сообщения в блоге или тип сообщения только одной категорией и создать category-ID.php для работы только с этой категорией.

Но мне интересно, есть ли более гибкое решение?

Можно ли создать шаблоны категорий, специфичные для типов сообщений, т. е. один для отображения сообщений, один для отображения пользовательских типов сообщений и т. д.?

Это вообще возможно? Если нет, то как лучше всего это обойти?

Share
  1. У меня есть решение. Ваш собственный шаблон таксономии будет называться taxonomy-{taxonomy}.php. Например, если ваша таксономия называется «cooking-categories», вы должны назвать свой файл taxonomy-cooking-categories.php.

    • 0
    • WordPress никогда, насколько мне помнится, никогда не использовался cms_ по умолчанию и всегда использовал wp_, хотя этот префикс можно изменить на каждом сайте. Правильнее всего использовать $wpdb->posts, а не угадывать какой-либо конкретный префикс.

      • 0
  2. Для пользовательских типов сообщений с пользовательской таксономией вы можете создать шаблон для этой таксономии. Ваш пользовательский шаблон таксономии будет называться taxonomy-{taxonomy}.php . Например, если бы ваша таксономия называлась «кулинарные категории», вы бы назвали свой файл taxonomy-cooking-categories.php .

    Дополнительную информацию о файлах шаблонов для специальных архивов таксономии можно найти в кодексе здесь: http://codex.wordpress.org/Template_Hierarchy#Custom_Taxonomies_display

    • 0
  3. Вы можете основываться на типе сообщения следующим образом: скажем, у вас есть category.php для обычных сообщений и your-custom-type-category.php для ваших пользовательских сообщений типа сообщений, а затем просто добавьте это в свой обычный раздел category.php в самом верху.

    <?php if (have_posts()){
        the_post();
        if( 'your_custom_type' == get_post_type( $post ) ) {
            rewind_posts();
            get_template_part('your-custom-type-category');
            exit();
        }
        rewind_posts();
    }
    ?>
    

    и теперь, когда когда-либо запрашивается категория, он будет проверять ваш пользовательский тип сообщения, и если он будет найден, он будет использовать ваш your-custom-type-category.php шаблон в качестве шаблона, и все обычные сообщения будут отображаться category.php без изменений.

    Надеюсь это поможет

    • 0
  4. Привет @Келвин Джаянорис:

    Есть ли причина, по которой вы не можете просто проверить значение $post->post_type с if..elseif оператором в вашем цикле, например:

    <?php if ($post->post_type=='foo'): ?>
    
       Put HTML for 'foo' post type here...
    
    <?php else if ($post->post_type=='bar'): ?>
    
       Put HTML for 'bar' post type here...
    
    <?php else if ($post->post_type=='post'): ?>
    
       Put HTML for 'post' post type here...
    
    <?php endif; ?>
    

    Или, если есть причина, по которой вы не можете создать свою собственную иерархию имен файлов шаблонов в виде имен файлов, таких как post-foo.php, post-foo.php, post-post.php, также внутри вашего цикла? Этот код может сделать это для него:

    <?php include("post-{$post->post_type}.php"); ?>
    
    • 0
  5. Более простой ответ, если вы не хотите создавать новые файлы или сталкиваться с проблемами, связанными с испорченными запросами, — использовать это в файле functions.php:

    function sql_where_clause($sql) {
      if (is_category()) {
        $sql = str_replace("cms_posts.post_type = 'post'", "cms_posts.post_type='post' OR cms_posts.post_type = 'news' OR cms_posts.post_type='event'", $sql); 
      }
      return $sql;
    }
    add_filter('posts_where', 'sql_where_clause');
    

    конечно, вам нужно будет изменить его, чтобы он содержал ваши пользовательские типы сообщений. Я сделал это, чтобы мой category.php реагировал на все пользовательские типы сообщений, которые я хотел, как будто они должны быть там. Спасает от многих проблем.

    Изменить: будьте осторожны с тем, на какой версии WP вы это используете. Похоже, что более старые версии WP использовали wp_posts вместо cms_posts, поэтому проверьте, какие имена таблиц вы хотите использовать, иначе вы получите странные результаты (в основном ничего не отображается).

    • 0

Оставить ответ

You must login to add an answer.