{"id":20731607,"url":"https://github.com/ginopane/oc-blogtaxonomy-plugin","last_synced_at":"2025-04-23T22:05:50.203Z","repository":{"id":53537596,"uuid":"135481122","full_name":"GinoPane/oc-blogtaxonomy-plugin","owner":"GinoPane","description":"🏷️ A robust October CMS plugin which extends RainLab Blog with useful taxonomies","archived":false,"fork":false,"pushed_at":"2023-01-14T01:11:29.000Z","size":370,"stargazers_count":6,"open_issues_count":7,"forks_count":11,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-04-23T22:05:44.093Z","etag":null,"topics":["blog-series","october","october-cms","octobercms","octobercms-plugin","posts-series","quality","rainlab-blog","taxonomy"],"latest_commit_sha":null,"homepage":"https://octobercms.com/plugin/ginopane-blogtaxonomy","language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/GinoPane.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":".github/CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2018-05-30T18:16:57.000Z","updated_at":"2021-07-14T07:19:19.000Z","dependencies_parsed_at":"2023-02-09T18:30:38.993Z","dependency_job_id":null,"html_url":"https://github.com/GinoPane/oc-blogtaxonomy-plugin","commit_stats":null,"previous_names":[],"tags_count":48,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/GinoPane%2Foc-blogtaxonomy-plugin","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/GinoPane%2Foc-blogtaxonomy-plugin/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/GinoPane%2Foc-blogtaxonomy-plugin/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/GinoPane%2Foc-blogtaxonomy-plugin/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/GinoPane","download_url":"https://codeload.github.com/GinoPane/oc-blogtaxonomy-plugin/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":250522300,"owners_count":21444511,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["blog-series","october","october-cms","octobercms","octobercms-plugin","posts-series","quality","rainlab-blog","taxonomy"],"created_at":"2024-11-17T05:16:07.095Z","updated_at":"2025-04-23T22:05:49.756Z","avatar_url":"https://github.com/GinoPane.png","language":"PHP","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Blog Taxonomy\n\nTaxonomy extension for [RainLab Blog](https://octobercms.com/plugin/rainlab-blog) plugin.\n\n[![GitHub tag](https://img.shields.io/github/tag/ginopane/oc-blogtaxonomy-plugin.svg)](https://github.com/GinoPane/oc-blogtaxonomy-plugin)\n[![Maintainability](https://api.codeclimate.com/v1/badges/60ecdc5d75bb0e490049/maintainability)](https://codeclimate.com/github/GinoPane/oc-blogtaxonomy-plugin/maintainability)\n[![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/GinoPane/oc-blogtaxonomy-plugin/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/GinoPane/oc-blogtaxonomy-plugin/?branch=master)\n\n## Table of Contents\n* [Changes to Original Blog Plugin](#changes-to-original-blog-plugin)\n  * [Categories](#categories) \n  * [Tags](#tags)\n  * [Series](#series)\n  * [Types](#types)\n* [Translate Plugin Support](#translate-plugin-support)\n* [Migration from Other Plugins](#migration-from-other-plugins)\n* [Implementing Frontend Pages](#implementing-frontend-pages)\n  * [Post Series Navigation](#post-series-navigation)\n  * [Posts in the Series](#posts-in-the-series)\n  * [Posts With the Tag](#posts-with-the-tag)\n  * [Related Posts](#related-posts)\n  * [Series List](#series-list)\n  * [Tag List](#tag-list)\n  * [Related Series](#related-series)\n\nInspired by [Blog Tags Extension](https://octobercms.com/plugin/bedard-blogtags) and [Blog Series](https://octobercms.com/plugin/pkleindienst-blogseries)\nplugins Blog Taxonomy adds both tags and series functionality in a high quality and reliable way. Every post could belong\nto a single series and at the same time it can have multiple tags assigned.\n\n## Changes to Original Blog Plugin\n\n### Categories\n\n\u003e [Categories](https://www.wpbeginner.com/beginners-guide/categories-vs-tags-seo-best-practices-which-one-is-better/) are meant for broad grouping of your posts. Think of these as general topics or the table of contents for your site.\nCategories are there to help identify what your blog is really about. It is to assist readers finding the right type of\ncontent on your site. Categories are hierarchical, so you can define sub-categories.\n\nOriginal blog categories were enhanced with ability to add posts while being on a single category page.\n\nThey were also placed in a new tag-like style along with tags and series in their own **Taxonomy** tab of a backend CMS blog page.\n\nAlso, categories can now (since version 3.0.0) have a cover image, and an array of featured images (`cover_image` and\n`featured_images` attributes respectively). Two new backend settings were added to enable or disable this extension.\n\n### Tags\n\n\u003e Tags are meant to describe specific details of your posts. Think of these as your site’s index words. They are the\nmicro-data that you can use to micro-categorize your content. Tags are not hierarchical.\n\n### Series\n\nSeries could help you to organize your posts in a single flow of related posts.\n\n### Types\n\nSince 3.0.0 posts could have types assigned. Post types support can be enabled via backend settings for\nthe plugin. The type is a set of properties that could be associated with the post. Types are being created and edited as separated models in the backend. Each post type defines several\nproperties which are added as additional form inputs when a specific type is chosen.\n\n## Translate Plugin Support\n\nStarting from 1.5.0 version Blog Taxonomy supports [RainLab Translate](https://octobercms.com/plugin/rainlab-translate) plugin when it's installed. All tag and series fields could be translated.\n\n## Migration from Other Plugins\n\nStarting from 1.12.0 version Blog Taxonomy supports migration from other plugins. Currently supported plugins are: [BlogSeries](https://github.com/PascalKleindienst/october-blogseries-extension).\n\nThe migration is done via console command:\n\n```php artisan blogtaxonomy:migrate PKleindienst.BlogSeries```\n\nUse `-h` or `--help` to get usage help.\n\nMigration example output:\n\n```bash\n**************************************************\n*     Migration from PKleindienst.BlogSeries     *\n**************************************************\n\nMigrating series\n2 series found\nSeries \"Series 1\" =\u003e Blog Taxonomy Series \"Series 1\" (#3)\nSeries \"Series 2\" =\u003e Blog Taxonomy Series \"Series 2\" (#4)\nAll series have been migrated\n\nMigrating related series\nRelation \"#4\" =\u003e \"#3\" added\nRelation \"#3\" =\u003e \"#4\" added\nRelated series have been migrated\n\n\n Do you want to assign newly created series to posts (already assigned Blog Taxonomy series will be overwritten) (yes/no) [no]:\n \u003e yes\n\nMigrating series assigned to posts\nSeries \"#3\" has been assigned to a post\nSeries \"#4\" has been assigned to a post\nMigrated series has been assigned\n\nMigration from PKleindienst.BlogSeries finished\n```\n\n## Implementing Frontend Pages\n\n### Post Types\n\nPost types provide additional attributes which could be assigned to blog posts. Each attribute when created got its\nown `code` (like a `slug` for a Post, Tag, Series, etc.). This code can be used to access attribute values for\nindividual posts. For this purpose such methods as were added:\n\n```\ntypeAttribute(string code) - to get one attribute\ntypeAttributes() - to get all attributes\n``` \n\nSo, for example, if you have a \"Rating\" attribute with a `rating` code you can show it in the template like this:\n```\n\u003cspan\u003e{{ post.typeAttribute('rating') }}\u003c/span\u003e\n```\n\n### Components\n\nThe Blog Taxonomy plugin provides several useful components with a basic markup for frontend usage. The default markup\nis **not intended to fit to any existing frontend** theme, it is just an example, so if the default markup is not suitable for your website,\nfeel free to copy it from the default partial and replace the markup with your own.\n\nAvailable components:\n\n* **Post Series Navigation** (`seriesNavigation`) - provides navigation within the series for a single post.\n* **Posts in the Series** (`postsInSeries`) - lists all posts in the supplied series.\n* **Posts With the Tag** (`postsWithTag`) - lists all posts with the supplied tag.\n* **Related Posts** (`relatedPosts`) - provides a list of posts related by tags.\n* **Series List** (`seriesList`) - displays a list of series.\n* **Tag List** (`tagList`) - displays a list of tags.\n* **Related Series** (`relatedSeries`) - provides a list of related series.\n\n#### Post Series Navigation\n\nComponent `seriesNavigation` provides navigation within the series for a single post. You can display, for example, next and previous posts in the same series,\nshow series details and link to its page, etc.\n\nComponent properties:\n\n* **Post slug** - get series navigation for the post specified by slug value from URL parameter; e.g. if post slug is `:post`\n  the page URL must contain `:post` parameter which value will be used as post slug to retrieve the series;\n* **Series page** - CMS page which contains [`postsInSeries`](#posts-in-the-series) component and is used to display a single series content and posts;\n* **Post page** - name of the blog post page to display a single blog post content.\n\n#### Posts in the Series\n\nComponent `postsInSeries` lists all posts in the supplied series. The component supports pagination and posts ordering.\n\nAvailable properties:\n\n* **Series slug** - look up the series using the supplied slug value from this URL parameter; e.g. if series slug is `:series`\n  the page URL must contain `:series` parameter which value will be used as series slug to retrieve the series;\n* **Post order** - attribute and direction on which posts should be ordered;\n* **Page parameter** - calculate pagination based on this URL parameter;\n* **Items per page** - how many items (if any) should be displayed per page, \"0\" displays all items;\n* **Post page** - name of the blog post page to display a single blog post content;\n* **Category page** - name of the category page to display a single blog category content;\n* **Include tagged posts** - additionally include posts tagged with the tags from the current series;\n* **Include categories** - list of categories ids/slugs (can be mixed together) separated by comma; posts only with\n  these categories will be included into the list;\n* **Exclude posts** - list of post ids/slugs (can be mixed together) separated by comma; these posts will be excluded\n  from the list;\n* **Exclude categories** - list of categories ids/slugs (can be mixed together) separated by comma; posts with these\n  categories will be excluded from the list.\n\n#### Posts With the Tag\n\nComponent `postsWithTag` lists all posts with the supplied tag. The component supports pagination and posts ordering.\n\nAvailable properties:\n\n* **Tag slug** - look up the tag using the supplied slug value from this URL parameter; e.g. if tag slug is `:tag`\n  the page URL must contain `:tag` parameter which value will be used as tag slug to retrieve the tag;\n* **Include series posts** - additionally include posts which belongs to the series tagged with the current tag;\n* **Post order** - attribute and direction on which posts should be ordered;\n* **Page parameter** - calculate pagination based on this URL parameter;\n* **Items per page** - how many items (if any) should be displayed per page, \"0\" displays all items;\n* **Post page** - name of the blog post page to display a single blog post content;\n* **Category page** - name of the category page to display a single blog category content;\n* **Include categories** - list of categories ids/slugs (can be mixed together) separated by comma; posts only with\n  these categories will be included into the list;\n* **Exclude posts** - list of post ids/slugs (can be mixed together) separated by comma; these posts will be excluded\n  from the list;\n* **Exclude categories** - list of categories ids/slugs (can be mixed together) separated by comma; posts with these categories will be excluded from the list.\n\n#### Related Posts\n\nComponent `relatedPosts` provides a list of posts related by tags, e.g. posts which have some tags in common.\n\nAvailable properties:\n\n* **Post slug** - get related posts for the post specified by slug value from URL parameter; e.g. if post slug is `:post`\n  the page URL must contain `:post` parameter which value will be used as post slug to retrieve the related posts;\n* **Limit** - number of posts to display, 0 retrieves all related posts;\n* **Post order** - attribute and direction on which posts should be ordered;\n* **Post page** - name of the blog post page to display a single blog post content.\n\n#### Series List\n\nComponent `seriesList` displays a list of series.\n\nAvailable properties:\n\n* **Display empty series** - whether to show series which don't have any posts assigned or not;\n* **Limit** - number of series to display, 0 retrieves all series;\n* **Series order** - how series list should be ordered;\n* **Series page** - CMS page which contains [`postsInSeries`](#posts-in-the-series) component and is used to display a single series content and posts;\n* **Fetch related posts** - if enabled, the component will fetch related posts, so they are properly (**as published**) available via `posts` property of the series item; it does an additional request, so decreases performance a little;\n* **Include categories** - list of categories ids/slugs (can be mixed together) separated by comma; posts only with\n  these categories will be included into the post count and post list associated with the series;\n* **Exclude posts** - list of post ids/slugs (can be mixed together) separated by comma; these posts will be excluded from the post count and post list associated with the series;\n* **Exclude categories** - list of categories ids/slugs (can be mixed together) separated by comma; posts with these categories will be excluded from from the post count and post list associated with the series.\n\n#### Tag List\n\nComponent `tagList` displays a list of tags. Can be used to build a tag cloud (because post count with each tag is available).\nIt also can be used to retrieve a list of tags for specific post.\n\n\u003e Please don't forget to use different aliases for components if you use the same component several times on the same page\n(presumably for different purpose)\n\nAvailable properties:\n\n* **Display empty tags** - whether to show tags which were no assigned to any posts or not;\n* **Tag order** - how tags should be ordered;\n* **Limit** - number of tags to display, 0 retrieves all tags;\n* **Expose total count** - the component has `totalCount` property which would contain either overall amount of tags or\n  amount of tags under \"limit\" only. For example you have 10 tags overall but you use a **limit** of 5. This will make component\n  to display 5 tags only. With **Expose total count** enabled you could still get \"10\" in `totalCount`. And you'll get 5 otherwise;\n* **Fetch tagged posts** - if enabled, the component will fetch tagged posts, so they are properly (**as published**) available via `posts` property of the tag item; it does an additional request, so decreases performance a little;\n* **Include series tags** - if enabled, the component will additionally include tags applied to the post's series if\n  the post has series and the series has tags;\n* **Debug output** - allows to enable debug output to the browser's console. Need to be implemented by the theme;\n* **Fetch series post count** - if enabled, the component will additionally fetch count of posts which belong to\n  series tagged with this tag, so it will be possible to create more accurately weighed tag cloud;\n* **Include categories** - list of categories ids/slugs (can be mixed together) separated by comma; posts only with\n  these categories will be included into the post count and post list associated with the tag;\n* **Exclude posts** - list of post ids/slugs (can be mixed together) separated by comma; these posts will be excluded from the post count and post list associated with the tag;\n* **Exclude categories** - list of categories ids/slugs (can be mixed together) separated by comma; posts with these categories will be excluded from the post count and post list associated with the tag.\n\n\u003e Leave this as `false` if you do not require a whole total count, because it will give you more optimised result\n\n* **Include tag filter** - whether to include a tag filter input or not. Tag filter is a text input with some JavaScript\n  powered by [mark.js](https://markjs.io/) that allows you to filter a tag list nicely. Use it if you have a lot of tags to\n  display, because it would allow to search for a specific tag quickly. Possible values are \"Never\", \"Always\" and\n  \"When tag total count \u003e limit\". All of them are self-descriptive, but keep in mind that the last option should be used\n  when both **Limit** and **Expose total count** enabled, because you'd get probably an undesired result otherwise.\n  The component exposes `tagFilterEnabled` property which would be set to `true` when the filter assets are included and\n  the filter could be used;\n\n\u003e The default markup injects JavaScript into `{% scripts %}` placeholder so please make sure your theme has it. Also, the\ndefault code requires jQuery. If you do not have it, please make sure to adjust the code to fulfill your needs\n\n* **Post slug** - get tags for the post specified by a slug value from URL parameter; e.g. if the post slug is `:post`\n  the page URL must contain `:post` parameter which value will be used as post slug to retrieve tags;\n\n\u003e It is not required to set it to a real value unless you want to display tags specific for the post\n\n* **Tag page** - CMS page which contains [`postsWithTag`](#posts-with-the-tag) component and is used to display a single tag content (its posts);\n* **Tags page** - CMS page which probably contains [`tagList`](#tag-list) component and is used to display all tags you have;\n\n#### Related Series\n\nComponent `relatedSeries` provides a list of related series. The same list could be fetched for individual series by accessing its property `related_series`. The only difference is that the component fills urls for related series.\n\nAvailable properties:\n\n* **Series slug** - look up the related series using the supplied slug value from this URL parameter; e.g. if series slug is `:series`\n  the page URL must contain `:series` parameter which value will be used as series slug to retrieve the related series;\n* **Series page** - CMS page which contains [`postsInSeries`](#posts-in-the-series) component and is used to display a single series content and posts.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fginopane%2Foc-blogtaxonomy-plugin","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fginopane%2Foc-blogtaxonomy-plugin","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fginopane%2Foc-blogtaxonomy-plugin/lists"}