26.7.1
·
168 commits
to main
since this release
Immutable
release. Only release title and notes can be modified.
Maho 26.7.1 is a bugfix release for the 26.7 line: no new features, no breaking changes, just fixes backported from main.
Creating Maho is a massive effort that requires all the help possible, please join our sponsorship program.
It will make all the difference in the world!

Maho rocks! 🚀
https://mahocommerce.com
https://demo.mahocommerce.com
🐛 Fixes
- Reconciled cron jobs stuck in "running" after a worker dies — a job whose worker was killed (OOM,
max_execution_time,SIGKILL) left itscron_schedulerow atrunningforever: never pruned, never reported as a failure, and shown as "Running…" in the admin grid every night. Stale rows are now reaped and reported. - Fixed migration failure when dropping a legacy index backing a foreign key —
./maho migrateaborted on older installs with MySQL error 1553 when the index being dropped was the only one covering a foreign key. - Fixed admin form values silently cleared by
Form::setValues()— hidden fields and checkboxes with a declared default lost their value on new records across three admin forms. - Fixed customer segment save blanking the name and status — saving after opening one of the AJAX grid tabs failed with "Segment name is required." because the grid filter inputs collided with the segment form fields.
- Fixed dynamic category position reset, added stock conditions and parent replacement — manual product positions in Category > Products are no longer wiped whenever a product enters or leaves a dynamic category.
- Optimized
cataloglinkrule_apply_allto scan the target catalog once per rule — the processor rescanned the whole catalog once per matched source product. On a 27.6k-product store a single rule took ~25 minutes and 718 MB, so the schedule never finished. - Fixed alignment of editable columns in admin grids — the Position input in the category products grid wrapped onto a second line and pushed the column out of alignment.
- Fixed v2 API returning 500 instead of 400 for malformed JSON request bodies — deserialization errors now surface as client errors, as they should.
Full changelog: 26.7.0...26.7.1