User tests: Successful: Unsuccessful:
Fixes incorrect article counts in frontend category views when articles are expired.
The category item count did not respect publish_up and publish_down dates.
Articles that were expired (Finish Publishing date in the past) were still
counted as published, causing categories to show incorrect item counts and
appear non-empty even when no articles were visible in the frontend.
This behavior can be reproduced using the core Cassiopeia template and also
affects extensions relying on Joomlaβs Categories API.
Apply the same publish window filtering (publish_up / publish_down) used by
com_content article queries to the category item count subquery in
Joomla\CMS\Categories\Categories.
Fixes #46614
| Status | New | ⇒ | Pending |
| Category | ⇒ | Libraries |
This is a valid concern thanks for raising it.
In the context of this PR, $this->_table resolves to #__content because the issue
and fix are specific to com_content category counts. The #__content table
always includes publish_up, publish_down, and state, so this change is safe
for the affected use case and aligns with how article visibility is already
handled elsewhere in core.
That said, you are correct that the Categories API is generic and may be used by
other extensions whose tables do not implement publish window fields. A fully
generic solution would require either:
I see this PR as restoring consistency for com_content (fixing a real frontend
bug where expired articles are counted as visible), while a more generic,
extension-agnostic solution could be explored separately if needed.
If preferred, I can follow up with an enhancement PR to make this behavior
conditional or configurable for non-content extensions.
This is a valid concern thanks for raising it.
You're welcome.
Although it's been raised before.
This can be seen in the various issues and PRs that have now been created.
But I'm glad it's been found and it seems to be resolved now.
I have tested this item β
successfully on 57f76ab
After applying the patch the article count in a "Category List" view was correct, and articles with an expired "Finish Publishing" date were not counted anymore.
But: I can NOT say anything about the possible mentioned implications in #40172 (comment)
I have tested this item π΄ unsuccessfully on 57f76ab
To validate the comments from the original PR that this will fail with any component that uses categories but does NOT have published up/down fields I deleted those fields from the #__contact_details table and then created a menu item to list the contacts. As expected this produces an error
Unknown column 'i.publish_up' in 'where clause'
This comment was created with the J!Tracker Application at issues.joomla.org/tracker/joomla-cms/46653.
I understand that this now works for the table of contents.
And that's also what I need in combination with Yootheme.
I understand that it doesn't work with another component that doesn't have those fields in the table.
But why didn't we test it successfully?
Because it works with the table of contents, right?
Otherwise, we now know it works, but not on all components.
How can we get this into the code now to solve the article count issue?
The problem is NOT that this change doesnt work with all components using categories
The problem is that this change BREAKS any component using categories that does not use publish_up/publish_down
That way.
I understand.
That shouldn't be necessary, of course.
Can that function then check whether the field is present or not?
| Labels |
Added:
PR-5.4-dev
|
||
@brianteeman Thank you for catching that critical issue! I've updated the PR to safely handle components without publish date fields.
Added a field existence check before applying publish date filtering:
$tableColumns = $db->getTableColumns($this->_table);
if (isset($tableColumns['publish_up']) && isset($tableColumns['publish_down'])) {
// Only apply date filtering if fields exist
}This addresses your concern from #40172 while maintaining the fix for #46614.
contacts DOES have the publish_up/down fields - I just removed them for testing purposes
Looking at the check, it will work fine for the contacts.
Because they do contain the fields, and the filter can still be activated.
Has this check already been incorporated into the PR for testing purposes?
It's great that it's now being thoroughly investigated and that they're working on a solution.
@brianteeman If you prefer, I could make this even more explicit by:
Option 1: Add a configurable option in $this->_options:
if ($this->_options['published'] == 1) {
$subQuery->where($db->quoteName($db->escape('i.' . $this->_statefield)) . ' = 1');
// Only apply if explicitly enabled via options
if (!empty($this->_options['respectPublishDates'])) {
$tableColumns = $db->getTableColumns($this->_table);
if (isset($tableColumns['publish_up']) && isset($tableColumns['publish_down'])) {
// ... date filtering
}
}
}Option 2: Only apply for com_content specifically:
if ($this->_extension === 'com_content' && $this->_options['published'] == 1) {
$tableColumns = $db->getTableColumns($this->_table);
// ... date filtering
}Which approach would you prefer? The current field-check approach seems safest to me, but I'm open to your guidance.
As the bug appears everywhere I would go for option 1
| Category | Libraries | ⇒ | Front End com_content Libraries |
@brianteeman Implemented Option 1 as suggested! The publish date filtering is now opt-in via a configurable option.
1. Added respectPublishDates option in Categories.php:
false (disabled) to maintain backward compatibility2. Enabled the option in com_content models:
components/com_content/src/Model/CategoriesModel.phpcomponents/com_content/src/Model/CategoryModel.phpBoth models now set $options['respectPublishDates'] = true; when creating Categories instances.
For com_content (Articles):
For other components (Contacts, Tags, etc.):
Safety layer:
publish_up/publish_down fields existThis approach gives each component control while fixing the bug for com_content. Ready for testing!
I've re-enabled the PR on my test site, but where can I find the options to configure this?
I look at the article or category options and don't see anything.
@webmasterab Thanks for testing! There's no UI option to configure - it's enabled automatically in the code for com_content.
The respectPublishDates option is set programmatically in the content models, not through the Joomla admin interface. It works automatically now for articles.
Test Setup:
Expected Result:
Does the article count now correctly exclude expired articles in your test?
I have tested this item β
successfully on 0823ad3
I followed the steps.
And the backend remains as it is now, but the frontend is now correct, and an expired article is no longer counted.
I'm glad this has been resolved and I can use this for my Yootheme template to display or hide items based on whether a category has no published articles.
I want to sincerely thank you for creating this solution.
And everyone who helped and contributed to this.
This is how Joomla improves.
I've also mentioned it here: https://yootheme.com/support/question/172237#answer-562033.
Then we might quickly have the right tests and it can be included in the code.
Happy with it.
I have tested this item β successfully on 57f76ab
I tested it successfully.
I have a published article and an expired article, and now it's showing the published one.
As expected.
Now that I disable the only article, it disappears, which is what we need.
Thanks for this PR.
Glad we all worked it out together and found a solution.
This comment was created with the J!Tracker Application at issues.joomla.org/tracker/joomla-cms/46653.