Compare commits

...

6 Commits

Author SHA1 Message Date
gitea-actions[bot] df99f2499e chore(version): pre-release bump to 01.06.01-dev [skip ci]
Publish to Composer / Publish Package (release) Successful in 6s
2026-06-29 06:40:51 +00:00
jmiller 50c1b2ba9f refactor: replace Joomla-7-deprecated APIs (forward compatibility)
Universal: Pre-Release / Build Pre-Release (${{ inputs.stability || github.ref_name }}) (push) Successful in 15s
Removes accessors deprecated in Joomla 5 and slated for removal in 7
(extension already runs on 6; this future-proofs for 7):
- Factory::getDbo() -> Factory::getContainer()->get(DatabaseInterface::class)
  across plugins, controllers, static helpers, and the install script
- Factory::getUser() -> Factory::getApplication()->getIdentity()
- Factory::getSession() -> Factory::getApplication()->getSession()
- jexit(Text::_('JINVALID_TOKEN')) -> throw new \RuntimeException(..., 403),
  consistent with the access-denied checks already in those controllers

Note: SQL update-version concern is already resolved — the release bumped
to 01.05.00, which matches the 01.05.00.sql update slot.

(cherry picked from commit d6fb2816cf)
2026-06-29 01:39:51 -05:00
jmiller b66387bacb refactor: rename MokoJoomOpenGraph -> MokoSuiteOpenGraph; require Joomla 6+
Product rename (display name / docs / comments / language strings only —
technical element names mokoog/com_mokoog/MokoOG namespace unchanged):
- Replace "MokoJoom" -> "MokoSuite" across 55 files
- Fixes the update-site license lookup in script.php, which matched the
  old "%MokoJoomOpenGraph%" name and would never find a "MokoSuite" site

Joomla 6 compatibility:
- script.php: minimumJoomla 4.0.0 -> 6.0.0, minimumPhp 8.1.0 -> 8.2.0,
  and actually enforce the Joomla floor in preflight() (was PHP-only)
- Add PKG_MOKOOG_JOOMLA_VERSION_ERROR language strings (en-GB, en-US)
- openapi.yaml + README state Joomla 6.0+ requirement
- Audit confirmed the codebase already uses only Joomla-6-supported APIs

(cherry picked from commit 7fb7e38762)
2026-06-29 01:39:47 -05:00
jmiller 5a696b0e46 docs(api): require Joomla 6.0+ in OpenAPI metadata
(cherry picked from commit 5ea422d75e)
2026-06-29 01:39:13 -05:00
jmiller d9087ac420 fix: harden input handling and output safety (#79)
- canonical_url: sanitize via sanitizeUrl() (scheme allowlist) instead of
  bare trim() — closes stored-XSS via addHeadLink() on the public frontend
- AI endpoint: replace die('Invalid Token') with a clean event result,
  and strip_tags + truncate article_title to 200 chars before use
- SitemapBuilder: whitelist changefreq against the sitemap spec enum,
  intval() noindex IDs, strict in_array comparison
- MokoOG: log a WARNING when sitemap.xml write fails instead of ignoring it

(cherry picked from commit b77054b769)
2026-06-29 01:39:13 -05:00
Jonathan Miller dbf726e148 fix: use mysqli driver in component manifest for Joomla 4/5/6
The install/uninstall/update SQL sections used driver="mysql" which
doesn't match the active mysqli driver, causing "SQL File not found"
on fresh installs and silently skipping schema updates on upgrades.

(cherry picked from commit 3fb5a87be9)
2026-06-29 01:39:12 -05:00
67 changed files with 159 additions and 134 deletions
+2 -2
View File
@@ -1,4 +1,4 @@
# MokoJoomOpenGraph # MokoSuiteOpenGraph
Open Graph, Twitter Card, and social sharing meta tag management for Joomla. Per-article SEO with auto-generation fallback. Open Graph, Twitter Card, and social sharing meta tag management for Joomla. Per-article SEO with auto-generation fallback.
@@ -9,7 +9,7 @@ Open Graph, Twitter Card, and social sharing meta tag management for Joomla. Per
| **Package** | `pkg_mokoog` | | **Package** | `pkg_mokoog` |
| **Language** | PHP 8.1+ | | **Language** | PHP 8.1+ |
| **Branch** | develop on `dev`, merge to `main` (protected) | | **Branch** | develop on `dev`, merge to `main` (protected) |
| **Wiki** | [MokoJoomOpenGraph Wiki](https://git.mokoconsulting.tech/MokoConsulting/MokoJoomOpenGraph/wiki) | | **Wiki** | [MokoSuiteOpenGraph Wiki](https://git.mokoconsulting.tech/MokoConsulting/MokoSuiteOpenGraph/wiki) |
## Commands ## Commands
+1 -1
View File
@@ -5,7 +5,7 @@
# FILE INFORMATION # FILE INFORMATION
# DEFGROUP: Gitea.Workflow # DEFGROUP: Gitea.Workflow
# INGROUP: mokocli.Automation # INGROUP: mokocli.Automation
# VERSION: 01.04.11 # VERSION: 01.06.01
# BRIEF: Auto-create feature branch when an issue is opened # BRIEF: Auto-create feature branch when an issue is opened
name: "Universal: Issue Branch" name: "Universal: Issue Branch"
+2 -1
View File
@@ -1,6 +1,6 @@
# Changelog # Changelog
<!-- VERSION: 01.04.11 --> <!-- VERSION: 01.06.01 -->
All notable changes to MokoSuiteOpenGraph will be documented in this file. All notable changes to MokoSuiteOpenGraph will be documented in this file.
@@ -61,6 +61,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
- Database table `#__mokoog_tags` with multilingual unique key - Database table `#__mokoog_tags` with multilingual unique key
### Fixed ### Fixed
- Fix SQL driver attribute `mysql``mysqli` in component manifest preventing fresh installs
- Add exception logging to BatchController batch skip (#76) - Add exception logging to BatchController batch skip (#76)
- Align form maxlength attributes with DB schema limits (#77) - Align form maxlength attributes with DB schema limits (#77)
- Add `strip_tags()` input sanitization on OG text fields (#79) - Add `strip_tags()` input sanitization on OG text fields (#79)
+2 -2
View File
@@ -1,8 +1,8 @@
# MokoSuiteOpenGraph # MokoSuiteOpenGraph
<!-- VERSION: 01.04.11 --> <!-- VERSION: 01.06.01 -->
Open Graph, Twitter Card, and social sharing meta tag management for Joomla 4/5/6. Open Graph, Twitter Card, and social sharing meta tag management for Joomla 6 and higher.
## Overview ## Overview
+1 -1
View File
@@ -23,7 +23,7 @@ DEFGROUP: Template-Joomla
INGROUP: Template-Joomla.Documentation INGROUP: Template-Joomla.Documentation
REPO: https://git.mokoconsulting.tech/MokoConsulting/Template-Joomla REPO: https://git.mokoconsulting.tech/MokoConsulting/Template-Joomla
PATH: /SECURITY.md PATH: /SECURITY.md
VERSION: 01.04.11 VERSION: 01.06.01
BRIEF: Security vulnerability reporting and handling policy BRIEF: Security vulnerability reporting and handling policy
--> -->
+2
View File
@@ -7,6 +7,8 @@ info:
REST API for managing Open Graph, SEO meta, and structured-data tags in REST API for managing Open Graph, SEO meta, and structured-data tags in
Joomla via the MokoSuiteOpenGraph extension. Joomla via the MokoSuiteOpenGraph extension.
**Requires Joomla 6.0 or higher.**
The API follows Joomla's Web Services conventions and returns responses in The API follows Joomla's Web Services conventions and returns responses in
[JSON:API](https://jsonapi.org/) format. All endpoints require [JSON:API](https://jsonapi.org/) format. All endpoints require
authentication via a Joomla API token. authentication via a Joomla API token.
+4 -3
View File
@@ -1,7 +1,8 @@
; MokoJoomOpenGraph - Package System Language File ; MokoSuiteOpenGraph - Package System Language File
; Copyright (C) 2026 Moko Consulting. All rights reserved. ; Copyright (C) 2026 Moko Consulting. All rights reserved.
; License: GPL-3.0-or-later ; License: GPL-3.0-or-later
PKG_MOKOOG="MokoJoomOpenGraph" PKG_MOKOOG="MokoSuiteOpenGraph"
PKG_MOKOOG_DESCRIPTION="Complete Open Graph, Twitter Card, and social sharing meta tag management for Joomla. Control how every page appears when shared on Facebook, Twitter/X, LinkedIn, WhatsApp, and more." PKG_MOKOOG_DESCRIPTION="Complete Open Graph, Twitter Card, and social sharing meta tag management for Joomla. Control how every page appears when shared on Facebook, Twitter/X, LinkedIn, WhatsApp, and more."
PKG_MOKOOG_PHP_VERSION_ERROR="MokoJoomOpenGraph requires PHP %s or later." PKG_MOKOOG_PHP_VERSION_ERROR="MokoSuiteOpenGraph requires PHP %s or later."
PKG_MOKOOG_JOOMLA_VERSION_ERROR="MokoSuiteOpenGraph requires Joomla %s or later."
+4 -3
View File
@@ -1,7 +1,8 @@
; MokoJoomOpenGraph - Package System Language File ; MokoSuiteOpenGraph - Package System Language File
; Copyright (C) 2026 Moko Consulting. All rights reserved. ; Copyright (C) 2026 Moko Consulting. All rights reserved.
; License: GPL-3.0-or-later ; License: GPL-3.0-or-later
PKG_MOKOOG="MokoJoomOpenGraph" PKG_MOKOOG="MokoSuiteOpenGraph"
PKG_MOKOOG_DESCRIPTION="Complete Open Graph, Twitter Card, and social sharing meta tag management for Joomla. Control how every page appears when shared on Facebook, Twitter/X, LinkedIn, WhatsApp, and more." PKG_MOKOOG_DESCRIPTION="Complete Open Graph, Twitter Card, and social sharing meta tag management for Joomla. Control how every page appears when shared on Facebook, Twitter/X, LinkedIn, WhatsApp, and more."
PKG_MOKOOG_PHP_VERSION_ERROR="MokoJoomOpenGraph requires PHP %s or later." PKG_MOKOOG_PHP_VERSION_ERROR="MokoSuiteOpenGraph requires PHP %s or later."
PKG_MOKOOG_JOOMLA_VERSION_ERROR="MokoSuiteOpenGraph requires Joomla %s or later."
@@ -1,7 +1,7 @@
<?php <?php
/** /**
* @package MokoJoomOpenGraph * @package MokoSuiteOpenGraph
* @subpackage com_mokoog.api * @subpackage com_mokoog.api
* @author Moko Consulting <hello@mokoconsulting.tech> * @author Moko Consulting <hello@mokoconsulting.tech>
* @copyright Copyright (C) 2026 Moko Consulting. All rights reserved. * @copyright Copyright (C) 2026 Moko Consulting. All rights reserved.
@@ -47,7 +47,7 @@ class TagsController extends ApiController
throw new \RuntimeException('content_type and content_id are required', 400); throw new \RuntimeException('content_type and content_id are required', 400);
} }
$db = Factory::getDbo(); $db = Factory::getContainer()->get(\Joomla\Database\DatabaseInterface::class);
$query = $db->getQuery(true) $query = $db->getQuery(true)
->select($db->quoteName('id')) ->select($db->quoteName('id'))
->from($db->quoteName('#__mokoog_tags')) ->from($db->quoteName('#__mokoog_tags'))
@@ -1,7 +1,7 @@
<?php <?php
/** /**
* @package MokoJoomOpenGraph * @package MokoSuiteOpenGraph
* @subpackage com_mokoog.api * @subpackage com_mokoog.api
* @author Moko Consulting <hello@mokoconsulting.tech> * @author Moko Consulting <hello@mokoconsulting.tech>
* @copyright Copyright (C) 2026 Moko Consulting. All rights reserved. * @copyright Copyright (C) 2026 Moko Consulting. All rights reserved.
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!-- <!--
* @package MokoJoomOpenGraph * @package MokoSuiteOpenGraph
* @subpackage com_mokoog * @subpackage com_mokoog
* @author Moko Consulting <hello@mokoconsulting.tech> * @author Moko Consulting <hello@mokoconsulting.tech>
* @copyright Copyright (C) 2026 Moko Consulting. All rights reserved. * @copyright Copyright (C) 2026 Moko Consulting. All rights reserved.
+1 -1
View File
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!-- <!--
* @package MokoJoomOpenGraph * @package MokoSuiteOpenGraph
* @subpackage com_mokoog * @subpackage com_mokoog
* @author Moko Consulting <hello@mokoconsulting.tech> * @author Moko Consulting <hello@mokoconsulting.tech>
* @copyright Copyright (C) 2026 Moko Consulting. All rights reserved. * @copyright Copyright (C) 2026 Moko Consulting. All rights reserved.
@@ -1,9 +1,9 @@
; MokoJoomOpenGraph - Component Language File ; MokoSuiteOpenGraph - Component Language File
; Copyright (C) 2026 Moko Consulting. All rights reserved. ; Copyright (C) 2026 Moko Consulting. All rights reserved.
; License: GPL-3.0-or-later ; License: GPL-3.0-or-later
COM_MOKOOG="MokoJoomOpenGraph" COM_MOKOOG="MokoSuiteOpenGraph"
COM_MOKOOG_TAGS_TITLE="MokoJoomOpenGraph - Tag Manager" COM_MOKOOG_TAGS_TITLE="MokoSuiteOpenGraph - Tag Manager"
COM_MOKOOG_SUBMENU_TAGS="Tags" COM_MOKOOG_SUBMENU_TAGS="Tags"
COM_MOKOOG_NO_TAGS="No Open Graph tags have been created yet. Tags are created automatically when you edit articles or menu items." COM_MOKOOG_NO_TAGS="No Open Graph tags have been created yet. Tags are created automatically when you edit articles or menu items."
COM_MOKOOG_TABLE_CAPTION="Table of Open Graph tags" COM_MOKOOG_TABLE_CAPTION="Table of Open Graph tags"
@@ -1,6 +1,6 @@
; MokoJoomOpenGraph - Component System Language File ; MokoSuiteOpenGraph - Component System Language File
; Copyright (C) 2026 Moko Consulting. All rights reserved. ; Copyright (C) 2026 Moko Consulting. All rights reserved.
; License: GPL-3.0-or-later ; License: GPL-3.0-or-later
COM_MOKOOG="MokoJoomOpenGraph" COM_MOKOOG="MokoSuiteOpenGraph"
COM_MOKOOG_DESCRIPTION="Manage Open Graph and social sharing tags for all your content. View, edit, and batch-process OG metadata." COM_MOKOOG_DESCRIPTION="Manage Open Graph and social sharing tags for all your content. View, edit, and batch-process OG metadata."
@@ -1,9 +1,9 @@
; MokoJoomOpenGraph - Component Language File ; MokoSuiteOpenGraph - Component Language File
; Copyright (C) 2026 Moko Consulting. All rights reserved. ; Copyright (C) 2026 Moko Consulting. All rights reserved.
; License: GPL-3.0-or-later ; License: GPL-3.0-or-later
COM_MOKOOG="MokoJoomOpenGraph" COM_MOKOOG="MokoSuiteOpenGraph"
COM_MOKOOG_TAGS_TITLE="MokoJoomOpenGraph - Tag Manager" COM_MOKOOG_TAGS_TITLE="MokoSuiteOpenGraph - Tag Manager"
COM_MOKOOG_SUBMENU_TAGS="Tags" COM_MOKOOG_SUBMENU_TAGS="Tags"
COM_MOKOOG_NO_TAGS="No Open Graph tags have been created yet. Tags are created automatically when you edit articles or menu items." COM_MOKOOG_NO_TAGS="No Open Graph tags have been created yet. Tags are created automatically when you edit articles or menu items."
COM_MOKOOG_TABLE_CAPTION="Table of Open Graph tags" COM_MOKOOG_TABLE_CAPTION="Table of Open Graph tags"
@@ -1,6 +1,6 @@
; MokoJoomOpenGraph - Component System Language File ; MokoSuiteOpenGraph - Component System Language File
; Copyright (C) 2026 Moko Consulting. All rights reserved. ; Copyright (C) 2026 Moko Consulting. All rights reserved.
; License: GPL-3.0-or-later ; License: GPL-3.0-or-later
COM_MOKOOG="MokoJoomOpenGraph" COM_MOKOOG="MokoSuiteOpenGraph"
COM_MOKOOG_DESCRIPTION="Manage Open Graph and social sharing tags for all your content. View, edit, and batch-process OG metadata." COM_MOKOOG_DESCRIPTION="Manage Open Graph and social sharing tags for all your content. View, edit, and batch-process OG metadata."
+5 -5
View File
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!-- <!--
* @package MokoJoomOpenGraph * @package MokoSuiteOpenGraph
* @subpackage com_mokoog * @subpackage com_mokoog
* @author Moko Consulting <hello@mokoconsulting.tech> * @author Moko Consulting <hello@mokoconsulting.tech>
* @copyright Copyright (C) 2026 Moko Consulting. All rights reserved. * @copyright Copyright (C) 2026 Moko Consulting. All rights reserved.
@@ -8,7 +8,7 @@
--> -->
<extension type="component" method="upgrade"> <extension type="component" method="upgrade">
<name>com_mokoog</name> <name>com_mokoog</name>
<version>01.04.11</version> <version>01.06.01</version>
<creationDate>2026-05-23</creationDate> <creationDate>2026-05-23</creationDate>
<author>Moko Consulting</author> <author>Moko Consulting</author>
<authorEmail>hello@mokoconsulting.tech</authorEmail> <authorEmail>hello@mokoconsulting.tech</authorEmail>
@@ -23,17 +23,17 @@
<install> <install>
<sql> <sql>
<file driver="mysql" charset="utf8">sql/install.mysql.sql</file> <file driver="mysqli" charset="utf8">sql/install.mysql.sql</file>
</sql> </sql>
</install> </install>
<uninstall> <uninstall>
<sql> <sql>
<file driver="mysql" charset="utf8">sql/uninstall.mysql.sql</file> <file driver="mysqli" charset="utf8">sql/uninstall.mysql.sql</file>
</sql> </sql>
</uninstall> </uninstall>
<update> <update>
<schemas> <schemas>
<schemapath type="mysql">sql/updates/mysql</schemapath> <schemapath type="mysqli">sql/updates/mysql</schemapath>
</schemas> </schemas>
</update> </update>
+3 -3
View File
@@ -1,7 +1,7 @@
<?php <?php
/** /**
* @package MokoJoomOpenGraph * @package MokoSuiteOpenGraph
* @subpackage com_mokoog * @subpackage com_mokoog
* @author Moko Consulting <hello@mokoconsulting.tech> * @author Moko Consulting <hello@mokoconsulting.tech>
* @copyright Copyright (C) 2026 Moko Consulting. All rights reserved. * @copyright Copyright (C) 2026 Moko Consulting. All rights reserved.
@@ -23,7 +23,7 @@ class Com_MokoOGInstallerScript
*/ */
public function install(InstallerAdapter $parent): void public function install(InstallerAdapter $parent): void
{ {
echo '<p>MokoJoomOpenGraph component installed successfully.</p>'; echo '<p>MokoSuiteOpenGraph component installed successfully.</p>';
} }
/** /**
@@ -35,6 +35,6 @@ class Com_MokoOGInstallerScript
*/ */
public function update(InstallerAdapter $parent): void public function update(InstallerAdapter $parent): void
{ {
echo '<p>MokoJoomOpenGraph component updated successfully.</p>'; echo '<p>MokoSuiteOpenGraph component updated successfully.</p>';
} }
} }
@@ -1,7 +1,7 @@
<?php <?php
/** /**
* @package MokoJoomOpenGraph * @package MokoSuiteOpenGraph
* @subpackage com_mokoog * @subpackage com_mokoog
* @author Moko Consulting <hello@mokoconsulting.tech> * @author Moko Consulting <hello@mokoconsulting.tech>
* @copyright Copyright (C) 2026 Moko Consulting. All rights reserved. * @copyright Copyright (C) 2026 Moko Consulting. All rights reserved.
@@ -1,5 +1,5 @@
-- --
-- MokoJoomOpenGraph - Database Schema -- MokoSuiteOpenGraph - Database Schema
-- Copyright (C) 2026 Moko Consulting. All rights reserved. -- Copyright (C) 2026 Moko Consulting. All rights reserved.
-- License: GPL-3.0-or-later -- License: GPL-3.0-or-later
-- --
@@ -1,5 +1,5 @@
-- --
-- MokoJoomOpenGraph - Uninstall -- MokoSuiteOpenGraph - Uninstall
-- --
DROP TABLE IF EXISTS `#__mokoog_tags`; DROP TABLE IF EXISTS `#__mokoog_tags`;
@@ -1,5 +1,5 @@
-- --
-- MokoJoomOpenGraph 01.01.00 — Add SEO meta management columns -- MokoSuiteOpenGraph 01.01.00 — Add SEO meta management columns
-- --
ALTER TABLE `#__mokoog_tags` ALTER TABLE `#__mokoog_tags`
@@ -1,5 +1,5 @@
-- --
-- MokoJoomOpenGraph 01.02.00 — Add multilingual OG tag support -- MokoSuiteOpenGraph 01.02.00 — Add multilingual OG tag support
-- --
ALTER TABLE `#__mokoog_tags` ALTER TABLE `#__mokoog_tags`
@@ -1,5 +1,5 @@
-- --
-- MokoJoomOpenGraph 01.03.00 - Add og_video column -- MokoSuiteOpenGraph 01.03.00 - Add og_video column
-- --
ALTER TABLE `#__mokoog_tags` ADD COLUMN `og_video` VARCHAR(512) NOT NULL DEFAULT '' AFTER `og_type`; ALTER TABLE `#__mokoog_tags` ADD COLUMN `og_video` VARCHAR(512) NOT NULL DEFAULT '' AFTER `og_type`;
@@ -1,5 +1,5 @@
-- --
-- MokoJoomOpenGraph 01.04.00 - Add event_data and recipe_data columns -- MokoSuiteOpenGraph 01.04.00 - Add event_data and recipe_data columns
-- --
ALTER TABLE `#__mokoog_tags` ADD COLUMN `event_data` TEXT NULL AFTER `og_video`; ALTER TABLE `#__mokoog_tags` ADD COLUMN `event_data` TEXT NULL AFTER `og_video`;
@@ -0,0 +1 @@
/* 01.06.01 — no schema changes */
@@ -27,13 +27,13 @@ class BatchController extends BaseController
*/ */
public function count(): void public function count(): void
{ {
Session::checkToken('get') || jexit(Text::_('JINVALID_TOKEN')); Session::checkToken('get') || throw new \RuntimeException(Text::_('JINVALID_TOKEN'), 403);
if (!Factory::getApplication()->getIdentity()->authorise('core.create', 'com_mokoog')) { if (!Factory::getApplication()->getIdentity()->authorise('core.create', 'com_mokoog')) {
throw new \RuntimeException(Text::_('JLIB_APPLICATION_ERROR_ACCESS_FORBIDDEN'), 403); throw new \RuntimeException(Text::_('JLIB_APPLICATION_ERROR_ACCESS_FORBIDDEN'), 403);
} }
$db = Factory::getDbo(); $db = Factory::getContainer()->get(\Joomla\Database\DatabaseInterface::class);
$query = $db->getQuery(true) $query = $db->getQuery(true)
->select('COUNT(*)') ->select('COUNT(*)')
->from($db->quoteName('#__content', 'c')) ->from($db->quoteName('#__content', 'c'))
@@ -60,7 +60,7 @@ class BatchController extends BaseController
*/ */
public function process(): void public function process(): void
{ {
Session::checkToken('get') || jexit(Text::_('JINVALID_TOKEN')); Session::checkToken('get') || throw new \RuntimeException(Text::_('JINVALID_TOKEN'), 403);
if (!Factory::getApplication()->getIdentity()->authorise('core.create', 'com_mokoog')) { if (!Factory::getApplication()->getIdentity()->authorise('core.create', 'com_mokoog')) {
throw new \RuntimeException(Text::_('JLIB_APPLICATION_ERROR_ACCESS_FORBIDDEN'), 403); throw new \RuntimeException(Text::_('JLIB_APPLICATION_ERROR_ACCESS_FORBIDDEN'), 403);
@@ -69,7 +69,7 @@ class BatchController extends BaseController
$app = Factory::getApplication(); $app = Factory::getApplication();
$limit = min($app->getInput()->getInt('limit', 50), 200); $limit = min($app->getInput()->getInt('limit', 50), 200);
$db = Factory::getDbo(); $db = Factory::getContainer()->get(\Joomla\Database\DatabaseInterface::class);
$query = $db->getQuery(true) $query = $db->getQuery(true)
->select($db->quoteName([ ->select($db->quoteName([
'c.id', 'c.title', 'c.metadesc', 'c.introtext', 'c.fulltext', 'c.images', 'c.id', 'c.title', 'c.metadesc', 'c.introtext', 'c.fulltext', 'c.images',
@@ -1,7 +1,7 @@
<?php <?php
/** /**
* @package MokoJoomOpenGraph * @package MokoSuiteOpenGraph
* @subpackage com_mokoog * @subpackage com_mokoog
* @author Moko Consulting <hello@mokoconsulting.tech> * @author Moko Consulting <hello@mokoconsulting.tech>
* @copyright Copyright (C) 2026 Moko Consulting. All rights reserved. * @copyright Copyright (C) 2026 Moko Consulting. All rights reserved.
@@ -36,14 +36,14 @@ class ImportExportController extends BaseController
*/ */
public function export(): void public function export(): void
{ {
Session::checkToken('get') || jexit(Text::_('JINVALID_TOKEN')); Session::checkToken('get') || throw new \RuntimeException(Text::_('JINVALID_TOKEN'), 403);
if (!Factory::getApplication()->getIdentity()->authorise('core.manage', 'com_mokoog')) { if (!Factory::getApplication()->getIdentity()->authorise('core.manage', 'com_mokoog')) {
throw new \RuntimeException(Text::_('JLIB_APPLICATION_ERROR_ACCESS_FORBIDDEN'), 403); throw new \RuntimeException(Text::_('JLIB_APPLICATION_ERROR_ACCESS_FORBIDDEN'), 403);
} }
$app = Factory::getApplication(); $app = Factory::getApplication();
$db = Factory::getDbo(); $db = Factory::getContainer()->get(\Joomla\Database\DatabaseInterface::class);
// Join with #__content to get article titles for reference // Join with #__content to get article titles for reference
$query = $db->getQuery(true) $query = $db->getQuery(true)
@@ -102,7 +102,7 @@ class ImportExportController extends BaseController
*/ */
public function import(): void public function import(): void
{ {
Session::checkToken() || jexit(Text::_('JINVALID_TOKEN')); Session::checkToken() || throw new \RuntimeException(Text::_('JINVALID_TOKEN'), 403);
$identity = Factory::getApplication()->getIdentity(); $identity = Factory::getApplication()->getIdentity();
@@ -161,7 +161,7 @@ class ImportExportController extends BaseController
return; return;
} }
$db = Factory::getDbo(); $db = Factory::getContainer()->get(\Joomla\Database\DatabaseInterface::class);
$header = fgetcsv($handle); $header = fgetcsv($handle);
$created = 0; $created = 0;
$updated = 0; $updated = 0;
@@ -1,7 +1,7 @@
<?php <?php
/** /**
* @package MokoJoomOpenGraph * @package MokoSuiteOpenGraph
* @subpackage com_mokoog * @subpackage com_mokoog
* @author Moko Consulting <hello@mokoconsulting.tech> * @author Moko Consulting <hello@mokoconsulting.tech>
* @copyright Copyright (C) 2026 Moko Consulting. All rights reserved. * @copyright Copyright (C) 2026 Moko Consulting. All rights reserved.
@@ -1,7 +1,7 @@
<?php <?php
/** /**
* @package MokoJoomOpenGraph * @package MokoSuiteOpenGraph
* @subpackage com_mokoog * @subpackage com_mokoog
* @author Moko Consulting <hello@mokoconsulting.tech> * @author Moko Consulting <hello@mokoconsulting.tech>
* @copyright Copyright (C) 2026 Moko Consulting. All rights reserved. * @copyright Copyright (C) 2026 Moko Consulting. All rights reserved.
@@ -1,7 +1,7 @@
<?php <?php
/** /**
* @package MokoJoomOpenGraph * @package MokoSuiteOpenGraph
* @subpackage com_mokoog * @subpackage com_mokoog
* @author Moko Consulting <hello@mokoconsulting.tech> * @author Moko Consulting <hello@mokoconsulting.tech>
* @copyright Copyright (C) 2026 Moko Consulting. All rights reserved. * @copyright Copyright (C) 2026 Moko Consulting. All rights reserved.
@@ -1,7 +1,7 @@
<?php <?php
/** /**
* @package MokoJoomOpenGraph * @package MokoSuiteOpenGraph
* @subpackage com_mokoog * @subpackage com_mokoog
* @author Moko Consulting <hello@mokoconsulting.tech> * @author Moko Consulting <hello@mokoconsulting.tech>
* @copyright Copyright (C) 2026 Moko Consulting. All rights reserved. * @copyright Copyright (C) 2026 Moko Consulting. All rights reserved.
@@ -1,7 +1,7 @@
<?php <?php
/** /**
* @package MokoJoomOpenGraph * @package MokoSuiteOpenGraph
* @subpackage com_mokoog * @subpackage com_mokoog
* @author Moko Consulting <hello@mokoconsulting.tech> * @author Moko Consulting <hello@mokoconsulting.tech>
* @copyright Copyright (C) 2026 Moko Consulting. All rights reserved. * @copyright Copyright (C) 2026 Moko Consulting. All rights reserved.
@@ -13,7 +13,7 @@ defined('_JEXEC') or die;
use Joomla\CMS\Factory; use Joomla\CMS\Factory;
use Joomla\CMS\Language\Text; use Joomla\CMS\Language\Text;
$db = Factory::getDbo(); $db = Factory::getContainer()->get(\Joomla\Database\DatabaseInterface::class);
// Total published articles // Total published articles
$db->setQuery($db->getQuery(true)->select('COUNT(*)')->from('#__content')->where('state = 1')); $db->setQuery($db->getQuery(true)->select('COUNT(*)')->from('#__content')->where('state = 1'));
@@ -1,7 +1,7 @@
<?php <?php
/** /**
* @package MokoJoomOpenGraph * @package MokoSuiteOpenGraph
* @subpackage com_mokoog * @subpackage com_mokoog
* @author Moko Consulting <hello@mokoconsulting.tech> * @author Moko Consulting <hello@mokoconsulting.tech>
* @copyright Copyright (C) 2026 Moko Consulting. All rights reserved. * @copyright Copyright (C) 2026 Moko Consulting. All rights reserved.
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!-- <!--
* @package MokoJoomOpenGraph * @package MokoSuiteOpenGraph
* @subpackage plg_content_mokoog * @subpackage plg_content_mokoog
* @author Moko Consulting <hello@mokoconsulting.tech> * @author Moko Consulting <hello@mokoconsulting.tech>
* @copyright Copyright (C) 2026 Moko Consulting. All rights reserved. * @copyright Copyright (C) 2026 Moko Consulting. All rights reserved.
@@ -1,4 +1,4 @@
; MokoJoomOpenGraph - Content Plugin Language File ; MokoSuiteOpenGraph - Content Plugin Language File
; Copyright (C) 2026 Moko Consulting. All rights reserved. ; Copyright (C) 2026 Moko Consulting. All rights reserved.
; License: GPL-3.0-or-later ; License: GPL-3.0-or-later
@@ -1,6 +1,6 @@
; MokoJoomOpenGraph - Content Plugin System Language File ; MokoSuiteOpenGraph - Content Plugin System Language File
; Copyright (C) 2026 Moko Consulting. All rights reserved. ; Copyright (C) 2026 Moko Consulting. All rights reserved.
; License: GPL-3.0-or-later ; License: GPL-3.0-or-later
PLG_CONTENT_MOKOOG="Content - MokoJoomOpenGraph" PLG_CONTENT_MOKOOG="Content - MokoSuiteOpenGraph"
PLG_CONTENT_MOKOOG_DESCRIPTION="Adds Open Graph fields to article and menu item edit forms for per-page social sharing control." PLG_CONTENT_MOKOOG_DESCRIPTION="Adds Open Graph fields to article and menu item edit forms for per-page social sharing control."
@@ -1,4 +1,4 @@
; MokoJoomOpenGraph - Content Plugin Language File ; MokoSuiteOpenGraph - Content Plugin Language File
; Copyright (C) 2026 Moko Consulting. All rights reserved. ; Copyright (C) 2026 Moko Consulting. All rights reserved.
; License: GPL-3.0-or-later ; License: GPL-3.0-or-later
@@ -1,6 +1,6 @@
; MokoJoomOpenGraph - Content Plugin System Language File ; MokoSuiteOpenGraph - Content Plugin System Language File
; Copyright (C) 2026 Moko Consulting. All rights reserved. ; Copyright (C) 2026 Moko Consulting. All rights reserved.
; License: GPL-3.0-or-later ; License: GPL-3.0-or-later
PLG_CONTENT_MOKOOG="Content - MokoJoomOpenGraph" PLG_CONTENT_MOKOOG="Content - MokoSuiteOpenGraph"
PLG_CONTENT_MOKOOG_DESCRIPTION="Adds Open Graph fields to article and menu item edit forms for per-page social sharing control." PLG_CONTENT_MOKOOG_DESCRIPTION="Adds Open Graph fields to article and menu item edit forms for per-page social sharing control."
@@ -1,5 +1,5 @@
/** /**
* @package MokoJoomOpenGraph * @package MokoSuiteOpenGraph
* @subpackage plg_content_mokoog * @subpackage plg_content_mokoog
* @copyright Copyright (C) 2026 Moko Consulting. All rights reserved. * @copyright Copyright (C) 2026 Moko Consulting. All rights reserved.
* @license GPL-3.0-or-later * @license GPL-3.0-or-later
@@ -2,7 +2,7 @@
"$schema": "https://developer.joomla.org/schemas/json-schema/web_assets.json", "$schema": "https://developer.joomla.org/schemas/json-schema/web_assets.json",
"name": "plg_content_mokoog", "name": "plg_content_mokoog",
"version": "01.00.00", "version": "01.00.00",
"description": "MokoJoomOpenGraph Content Plugin Assets", "description": "MokoSuiteOpenGraph Content Plugin Assets",
"license": "GPL-3.0-or-later", "license": "GPL-3.0-or-later",
"assets": [ "assets": [
{ {
@@ -1,5 +1,5 @@
/** /**
* @package MokoJoomOpenGraph * @package MokoSuiteOpenGraph
* @subpackage plg_content_mokoog * @subpackage plg_content_mokoog
* @author Moko Consulting <hello@mokoconsulting.tech> * @author Moko Consulting <hello@mokoconsulting.tech>
* @copyright Copyright (C) 2026 Moko Consulting. All rights reserved. * @copyright Copyright (C) 2026 Moko Consulting. All rights reserved.
@@ -1,7 +1,7 @@
<?php <?php
/** /**
* @package MokoJoomOpenGraph * @package MokoSuiteOpenGraph
* @subpackage plg_content_mokoog * @subpackage plg_content_mokoog
* @author Moko Consulting <hello@mokoconsulting.tech> * @author Moko Consulting <hello@mokoconsulting.tech>
* @copyright Copyright (C) 2026 Moko Consulting. All rights reserved. * @copyright Copyright (C) 2026 Moko Consulting. All rights reserved.
@@ -1,14 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!-- <!--
* @package MokoJoomOpenGraph * @package MokoSuiteOpenGraph
* @subpackage plg_content_mokoog * @subpackage plg_content_mokoog
* @author Moko Consulting <hello@mokoconsulting.tech> * @author Moko Consulting <hello@mokoconsulting.tech>
* @copyright Copyright (C) 2026 Moko Consulting. All rights reserved. * @copyright Copyright (C) 2026 Moko Consulting. All rights reserved.
* @license GNU General Public License version 3 or later; see LICENSE * @license GNU General Public License version 3 or later; see LICENSE
--> -->
<extension type="plugin" group="content" method="upgrade"> <extension type="plugin" group="content" method="upgrade">
<name>Content - MokoJoomOpenGraph</name> <name>Content - MokoSuiteOpenGraph</name>
<version>01.04.11</version> <version>01.06.01</version>
<creationDate>2026-05-23</creationDate> <creationDate>2026-05-23</creationDate>
<author>Moko Consulting</author> <author>Moko Consulting</author>
<authorEmail>hello@mokoconsulting.tech</authorEmail> <authorEmail>hello@mokoconsulting.tech</authorEmail>
@@ -1,7 +1,7 @@
<?php <?php
/** /**
* @package MokoJoomOpenGraph * @package MokoSuiteOpenGraph
* @subpackage plg_content_mokoog * @subpackage plg_content_mokoog
* @author Moko Consulting <hello@mokoconsulting.tech> * @author Moko Consulting <hello@mokoconsulting.tech>
* @copyright Copyright (C) 2026 Moko Consulting. All rights reserved. * @copyright Copyright (C) 2026 Moko Consulting. All rights reserved.
@@ -1,7 +1,7 @@
<?php <?php
/** /**
* @package MokoJoomOpenGraph * @package MokoSuiteOpenGraph
* @subpackage plg_content_mokoog * @subpackage plg_content_mokoog
* @author Moko Consulting <hello@mokoconsulting.tech> * @author Moko Consulting <hello@mokoconsulting.tech>
* @copyright Copyright (C) 2026 Moko Consulting. All rights reserved. * @copyright Copyright (C) 2026 Moko Consulting. All rights reserved.
@@ -187,7 +187,7 @@ final class MokoOGContent extends CMSPlugin implements SubscriberInterface
$contentType = $supportedContexts[$context]; $contentType = $supportedContexts[$context];
$contentId = (int) $article->id; $contentId = (int) $article->id;
$db = Factory::getDbo(); $db = Factory::getContainer()->get(\Joomla\Database\DatabaseInterface::class);
$query = $db->getQuery(true) $query = $db->getQuery(true)
->delete($db->quoteName('#__mokoog_tags')) ->delete($db->quoteName('#__mokoog_tags'))
->where($db->quoteName('content_type') . ' = ' . $db->quote($contentType)) ->where($db->quoteName('content_type') . ' = ' . $db->quote($contentType))
@@ -208,7 +208,7 @@ final class MokoOGContent extends CMSPlugin implements SubscriberInterface
*/ */
private function loadOgData(string $contentType, int $contentId, string $language = '*'): ?object private function loadOgData(string $contentType, int $contentId, string $language = '*'): ?object
{ {
$db = Factory::getDbo(); $db = Factory::getContainer()->get(\Joomla\Database\DatabaseInterface::class);
$query = $db->getQuery(true) $query = $db->getQuery(true)
->select($db->quoteName([ ->select($db->quoteName([
'og_title', 'og_description', 'og_image', 'og_type', 'og_video', 'og_title', 'og_description', 'og_image', 'og_type', 'og_video',
@@ -239,7 +239,7 @@ final class MokoOGContent extends CMSPlugin implements SubscriberInterface
*/ */
private function saveOgData(string $contentType, int $contentId, array $ogData, string $language = '*'): void private function saveOgData(string $contentType, int $contentId, array $ogData, string $language = '*'): void
{ {
$db = Factory::getDbo(); $db = Factory::getContainer()->get(\Joomla\Database\DatabaseInterface::class);
// Check if record exists for this content + language // Check if record exists for this content + language
$query = $db->getQuery(true) $query = $db->getQuery(true)
@@ -274,7 +274,7 @@ final class MokoOGContent extends CMSPlugin implements SubscriberInterface
'seo_title' => strip_tags(trim($ogData['seo_title'] ?? '')), 'seo_title' => strip_tags(trim($ogData['seo_title'] ?? '')),
'meta_description' => strip_tags(trim($ogData['meta_description'] ?? '')), 'meta_description' => strip_tags(trim($ogData['meta_description'] ?? '')),
'robots' => trim($robots), 'robots' => trim($robots),
'canonical_url' => trim($ogData['canonical_url'] ?? ''), 'canonical_url' => $this->sanitizeUrl($ogData['canonical_url'] ?? ''),
'published' => 1, 'published' => 1,
'modified' => Factory::getDate()->toSql(), 'modified' => Factory::getDate()->toSql(),
]; ];
@@ -1,4 +1,4 @@
; MokoJoomOpenGraph - System Plugin Language File ; MokoSuiteOpenGraph - System Plugin Language File
; Copyright (C) 2026 Moko Consulting. All rights reserved. ; Copyright (C) 2026 Moko Consulting. All rights reserved.
; License: GPL-3.0-or-later ; License: GPL-3.0-or-later
@@ -1,6 +1,6 @@
; MokoJoomOpenGraph - System Plugin System Language File ; MokoSuiteOpenGraph - System Plugin System Language File
; Copyright (C) 2026 Moko Consulting. All rights reserved. ; Copyright (C) 2026 Moko Consulting. All rights reserved.
; License: GPL-3.0-or-later ; License: GPL-3.0-or-later
PLG_SYSTEM_MOKOOG="System - MokoJoomOpenGraph" PLG_SYSTEM_MOKOOG="System - MokoSuiteOpenGraph"
PLG_SYSTEM_MOKOOG_DESCRIPTION="Injects Open Graph and Twitter Card meta tags into every page for optimal social media sharing previews." PLG_SYSTEM_MOKOOG_DESCRIPTION="Injects Open Graph and Twitter Card meta tags into every page for optimal social media sharing previews."
@@ -1,4 +1,4 @@
; MokoJoomOpenGraph - System Plugin Language File ; MokoSuiteOpenGraph - System Plugin Language File
; Copyright (C) 2026 Moko Consulting. All rights reserved. ; Copyright (C) 2026 Moko Consulting. All rights reserved.
; License: GPL-3.0-or-later ; License: GPL-3.0-or-later
@@ -1,6 +1,6 @@
; MokoJoomOpenGraph - System Plugin System Language File ; MokoSuiteOpenGraph - System Plugin System Language File
; Copyright (C) 2026 Moko Consulting. All rights reserved. ; Copyright (C) 2026 Moko Consulting. All rights reserved.
; License: GPL-3.0-or-later ; License: GPL-3.0-or-later
PLG_SYSTEM_MOKOOG="System - MokoJoomOpenGraph" PLG_SYSTEM_MOKOOG="System - MokoSuiteOpenGraph"
PLG_SYSTEM_MOKOOG_DESCRIPTION="Injects Open Graph and Twitter Card meta tags into every page for optimal social media sharing previews." PLG_SYSTEM_MOKOOG_DESCRIPTION="Injects Open Graph and Twitter Card meta tags into every page for optimal social media sharing previews."
+1 -1
View File
@@ -1,7 +1,7 @@
<?php <?php
/** /**
* @package MokoJoomOpenGraph * @package MokoSuiteOpenGraph
* @subpackage plg_system_mokoog * @subpackage plg_system_mokoog
* @author Moko Consulting <hello@mokoconsulting.tech> * @author Moko Consulting <hello@mokoconsulting.tech>
* @copyright Copyright (C) 2026 Moko Consulting. All rights reserved. * @copyright Copyright (C) 2026 Moko Consulting. All rights reserved.
+3 -3
View File
@@ -1,14 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!-- <!--
* @package MokoJoomOpenGraph * @package MokoSuiteOpenGraph
* @subpackage plg_system_mokoog * @subpackage plg_system_mokoog
* @author Moko Consulting <hello@mokoconsulting.tech> * @author Moko Consulting <hello@mokoconsulting.tech>
* @copyright Copyright (C) 2026 Moko Consulting. All rights reserved. * @copyright Copyright (C) 2026 Moko Consulting. All rights reserved.
* @license GNU General Public License version 3 or later; see LICENSE * @license GNU General Public License version 3 or later; see LICENSE
--> -->
<extension type="plugin" group="system" method="upgrade"> <extension type="plugin" group="system" method="upgrade">
<name>System - MokoJoomOpenGraph</name> <name>System - MokoSuiteOpenGraph</name>
<version>01.04.11</version> <version>01.06.01</version>
<creationDate>2026-05-23</creationDate> <creationDate>2026-05-23</creationDate>
<author>Moko Consulting</author> <author>Moko Consulting</author>
<authorEmail>hello@mokoconsulting.tech</authorEmail> <authorEmail>hello@mokoconsulting.tech</authorEmail>
@@ -1,7 +1,7 @@
<?php <?php
/** /**
* @package MokoJoomOpenGraph * @package MokoSuiteOpenGraph
* @subpackage plg_system_mokoog * @subpackage plg_system_mokoog
* @author Moko Consulting <hello@mokoconsulting.tech> * @author Moko Consulting <hello@mokoconsulting.tech>
* @copyright Copyright (C) 2026 Moko Consulting. All rights reserved. * @copyright Copyright (C) 2026 Moko Consulting. All rights reserved.
@@ -241,7 +241,7 @@ final class MokoOG extends CMSPlugin implements SubscriberInterface
// Pinterest article:tag rich pins (from Joomla content tags) // Pinterest article:tag rich pins (from Joomla content tags)
if ($option === 'com_content' && $view === 'article' && $id > 0) { if ($option === 'com_content' && $view === 'article' && $id > 0) {
$db = Factory::getDbo(); $db = Factory::getContainer()->get(\Joomla\Database\DatabaseInterface::class);
$tagQuery = $db->getQuery(true) $tagQuery = $db->getQuery(true)
->select($db->quoteName('t.title')) ->select($db->quoteName('t.title'))
->from($db->quoteName('#__tags', 't')) ->from($db->quoteName('#__tags', 't'))
@@ -467,7 +467,7 @@ final class MokoOG extends CMSPlugin implements SubscriberInterface
return $this->loadOgDataByMenu((int) $menuItem->id) ?: $empty; return $this->loadOgDataByMenu((int) $menuItem->id) ?: $empty;
} }
$db = Factory::getDbo(); $db = Factory::getContainer()->get(\Joomla\Database\DatabaseInterface::class);
$query = $db->getQuery(true) $query = $db->getQuery(true)
->select('*') ->select('*')
->from($db->quoteName('#__mokoog_tags')) ->from($db->quoteName('#__mokoog_tags'))
@@ -493,7 +493,7 @@ final class MokoOG extends CMSPlugin implements SubscriberInterface
*/ */
private function loadOgDataByType(string $contentType, int $contentId): ?object private function loadOgDataByType(string $contentType, int $contentId): ?object
{ {
$db = Factory::getDbo(); $db = Factory::getContainer()->get(\Joomla\Database\DatabaseInterface::class);
$lang = Factory::getLanguage()->getTag(); $lang = Factory::getLanguage()->getTag();
$query = $db->getQuery(true) $query = $db->getQuery(true)
@@ -520,7 +520,7 @@ final class MokoOG extends CMSPlugin implements SubscriberInterface
*/ */
private function loadOgDataByMenu(int $menuId): ?object private function loadOgDataByMenu(int $menuId): ?object
{ {
$db = Factory::getDbo(); $db = Factory::getContainer()->get(\Joomla\Database\DatabaseInterface::class);
$lang = Factory::getLanguage()->getTag(); $lang = Factory::getLanguage()->getTag();
$query = $db->getQuery(true) $query = $db->getQuery(true)
@@ -615,7 +615,7 @@ final class MokoOG extends CMSPlugin implements SubscriberInterface
// Fallback: check the article's category for an image // Fallback: check the article's category for an image
if ($view === 'article') { if ($view === 'article') {
$db = Factory::getDbo(); $db = Factory::getContainer()->get(\Joomla\Database\DatabaseInterface::class);
$catQuery = $db->getQuery(true) $catQuery = $db->getQuery(true)
->select($db->quoteName('cat.params')) ->select($db->quoteName('cat.params'))
->from($db->quoteName('#__categories', 'cat')) ->from($db->quoteName('#__categories', 'cat'))
@@ -674,7 +674,7 @@ final class MokoOG extends CMSPlugin implements SubscriberInterface
return $cache[$id]; return $cache[$id];
} }
$db = Factory::getDbo(); $db = Factory::getContainer()->get(\Joomla\Database\DatabaseInterface::class);
$query = $db->getQuery(true) $query = $db->getQuery(true)
->select($db->quoteName([ ->select($db->quoteName([
'a.title', 'a.introtext', 'a.fulltext', 'a.images', 'a.title', 'a.introtext', 'a.fulltext', 'a.images',
@@ -832,7 +832,10 @@ final class MokoOG extends CMSPlugin implements SubscriberInterface
$changefreq = $this->params->get('sitemap_changefreq', 'weekly'); $changefreq = $this->params->get('sitemap_changefreq', 'weekly');
$xml = SitemapBuilder::generate($changefreq); $xml = SitemapBuilder::generate($changefreq);
SitemapBuilder::writeToFile($xml);
if (!SitemapBuilder::writeToFile($xml)) {
\Joomla\CMS\Log\Log::add('MokoOG: Failed to write sitemap.xml — check file permissions', \Joomla\CMS\Log\Log::WARNING, 'mokoog');
}
} }
/** /**
@@ -850,7 +853,10 @@ final class MokoOG extends CMSPlugin implements SubscriberInterface
return; return;
} }
\Joomla\CMS\Session\Session::checkToken() or die('Invalid Token'); if (!\Joomla\CMS\Session\Session::checkToken()) {
$event->setArgument('result', ['Invalid Token']);
return;
}
if (!$this->params->get('ai_enabled', 0)) { if (!$this->params->get('ai_enabled', 0)) {
$event->setArgument('result', ['AI generation is not enabled']); $event->setArgument('result', ['AI generation is not enabled']);
@@ -868,7 +874,7 @@ final class MokoOG extends CMSPlugin implements SubscriberInterface
$input = $app->getInput(); $input = $app->getInput();
$field = $input->getString('field', 'title'); $field = $input->getString('field', 'title');
$articleTitle = $input->getString('article_title', ''); $articleTitle = mb_substr(strip_tags($input->getString('article_title', '')), 0, 200);
$prompt = $field === 'title' $prompt = $field === 'title'
? "Generate a concise, engaging social media sharing title (max 60 characters) for an article titled: \"$articleTitle\". Return only the title text, no quotes or explanation." ? "Generate a concise, engaging social media sharing title (max 60 characters) for an article titled: \"$articleTitle\". Return only the title text, no quotes or explanation."
@@ -941,20 +947,20 @@ final class MokoOG extends CMSPlugin implements SubscriberInterface
*/ */
private function warnMissingLicenseKey(): void private function warnMissingLicenseKey(): void
{ {
$session = Factory::getSession(); $session = Factory::getApplication()->getSession();
if ($session->get('mokoog.license_warned', false)) { if ($session->get('mokoog.license_warned', false)) {
return; return;
} }
$user = Factory::getUser(); $user = Factory::getApplication()->getIdentity();
if ($user->guest || !$user->authorise('core.manage')) { if ($user->guest || !$user->authorise('core.manage')) {
return; return;
} }
try { try {
$db = Factory::getDbo(); $db = Factory::getContainer()->get(\Joomla\Database\DatabaseInterface::class);
$query = $db->getQuery(true) $query = $db->getQuery(true)
->select($db->quoteName('extra_query')) ->select($db->quoteName('extra_query'))
@@ -1005,7 +1011,7 @@ final class MokoOG extends CMSPlugin implements SubscriberInterface
} }
try { try {
$db = Factory::getDbo(); $db = Factory::getContainer()->get(\Joomla\Database\DatabaseInterface::class);
$query = $db->getQuery(true) $query = $db->getQuery(true)
->select('p.id, p.sku, p.price, p.currency, p.stock_qty') ->select('p.id, p.sku, p.price, p.currency, p.stock_qty')
->select('c.title AS name, c.introtext AS description, c.images') ->select('c.title AS name, c.introtext AS description, c.images')
@@ -37,7 +37,7 @@ class JsonLdBuilder
$article = $cachedArticle; $article = $cachedArticle;
if (!$article) { if (!$article) {
$db = Factory::getDbo(); $db = Factory::getContainer()->get(\Joomla\Database\DatabaseInterface::class);
$query = $db->getQuery(true) $query = $db->getQuery(true)
->select($db->quoteName([ ->select($db->quoteName([
'a.created', 'a.modified', 'a.publish_up', 'a.created', 'a.modified', 'a.publish_up',
@@ -179,7 +179,7 @@ class JsonLdBuilder
$product = $cachedProduct; $product = $cachedProduct;
if (!$product) { if (!$product) {
$db = Factory::getDbo(); $db = Factory::getContainer()->get(\Joomla\Database\DatabaseInterface::class);
$query = $db->getQuery(true) $query = $db->getQuery(true)
->select('p.sku, p.price, p.currency, p.stock_qty') ->select('p.sku, p.price, p.currency, p.stock_qty')
->from($db->quoteName('#__mokosuite_crm_products', 'p')) ->from($db->quoteName('#__mokosuite_crm_products', 'p'))
@@ -32,7 +32,10 @@ class SitemapBuilder
*/ */
public static function generate(string $changefreq = 'weekly'): string public static function generate(string $changefreq = 'weekly'): string
{ {
$db = Factory::getDbo(); $allowed = ['always', 'hourly', 'daily', 'weekly', 'monthly', 'yearly', 'never'];
$changefreq = \in_array($changefreq, $allowed, true) ? $changefreq : 'weekly';
$db = Factory::getContainer()->get(\Joomla\Database\DatabaseInterface::class);
// Get all published articles // Get all published articles
$query = $db->getQuery(true) $query = $db->getQuery(true)
@@ -51,7 +54,7 @@ class SitemapBuilder
->where($db->quoteName('robots') . ' LIKE ' . $db->quote('%noindex%')); ->where($db->quoteName('robots') . ' LIKE ' . $db->quote('%noindex%'));
$db->setQuery($noindexQuery); $db->setQuery($noindexQuery);
$noindexIds = $db->loadColumn(); $noindexIds = array_map('intval', $db->loadColumn());
$root = rtrim(Uri::root(), '/'); $root = rtrim(Uri::root(), '/');
$xml = '<?xml version="1.0" encoding="UTF-8"?>' . "\n"; $xml = '<?xml version="1.0" encoding="UTF-8"?>' . "\n";
@@ -66,7 +69,7 @@ class SitemapBuilder
foreach ($articles as $article) { foreach ($articles as $article) {
// Skip noindexed // Skip noindexed
if (in_array((int) $article->id, $noindexIds)) { if (\in_array((int) $article->id, $noindexIds, true)) {
continue; continue;
} }
@@ -1,5 +1,5 @@
; MokoJoomOpenGraph - Web Services Plugin Language File ; MokoSuiteOpenGraph - Web Services Plugin Language File
; Copyright (C) 2026 Moko Consulting. All rights reserved. ; Copyright (C) 2026 Moko Consulting. All rights reserved.
; License: GPL-3.0-or-later ; License: GPL-3.0-or-later
PLG_WEBSERVICES_MOKOOG="Web Services - MokoJoomOpenGraph" PLG_WEBSERVICES_MOKOOG="Web Services - MokoSuiteOpenGraph"
@@ -1,6 +1,6 @@
; MokoJoomOpenGraph - Web Services Plugin System Language File ; MokoSuiteOpenGraph - Web Services Plugin System Language File
; Copyright (C) 2026 Moko Consulting. All rights reserved. ; Copyright (C) 2026 Moko Consulting. All rights reserved.
; License: GPL-3.0-or-later ; License: GPL-3.0-or-later
PLG_WEBSERVICES_MOKOOG="Web Services - MokoJoomOpenGraph" PLG_WEBSERVICES_MOKOOG="Web Services - MokoSuiteOpenGraph"
PLG_WEBSERVICES_MOKOOG_DESCRIPTION="Exposes MokoJoomOpenGraph OG tag data via Joomla's REST API at /api/index.php/v1/mokoog/tags." PLG_WEBSERVICES_MOKOOG_DESCRIPTION="Exposes MokoSuiteOpenGraph OG tag data via Joomla's REST API at /api/index.php/v1/mokoog/tags."
@@ -1,5 +1,5 @@
; MokoJoomOpenGraph - Web Services Plugin Language File ; MokoSuiteOpenGraph - Web Services Plugin Language File
; Copyright (C) 2026 Moko Consulting. All rights reserved. ; Copyright (C) 2026 Moko Consulting. All rights reserved.
; License: GPL-3.0-or-later ; License: GPL-3.0-or-later
PLG_WEBSERVICES_MOKOOG="Web Services - MokoJoomOpenGraph" PLG_WEBSERVICES_MOKOOG="Web Services - MokoSuiteOpenGraph"
@@ -1,6 +1,6 @@
; MokoJoomOpenGraph - Web Services Plugin System Language File ; MokoSuiteOpenGraph - Web Services Plugin System Language File
; Copyright (C) 2026 Moko Consulting. All rights reserved. ; Copyright (C) 2026 Moko Consulting. All rights reserved.
; License: GPL-3.0-or-later ; License: GPL-3.0-or-later
PLG_WEBSERVICES_MOKOOG="Web Services - MokoJoomOpenGraph" PLG_WEBSERVICES_MOKOOG="Web Services - MokoSuiteOpenGraph"
PLG_WEBSERVICES_MOKOOG_DESCRIPTION="Exposes MokoJoomOpenGraph OG tag data via Joomla's REST API at /api/index.php/v1/mokoog/tags." PLG_WEBSERVICES_MOKOOG_DESCRIPTION="Exposes MokoSuiteOpenGraph OG tag data via Joomla's REST API at /api/index.php/v1/mokoog/tags."
@@ -1,7 +1,7 @@
<?php <?php
/** /**
* @package MokoJoomOpenGraph * @package MokoSuiteOpenGraph
* @subpackage plg_webservices_mokoog * @subpackage plg_webservices_mokoog
* @author Moko Consulting <hello@mokoconsulting.tech> * @author Moko Consulting <hello@mokoconsulting.tech>
* @copyright Copyright (C) 2026 Moko Consulting. All rights reserved. * @copyright Copyright (C) 2026 Moko Consulting. All rights reserved.
@@ -1,14 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!-- <!--
* @package MokoJoomOpenGraph * @package MokoSuiteOpenGraph
* @subpackage plg_webservices_mokoog * @subpackage plg_webservices_mokoog
* @author Moko Consulting <hello@mokoconsulting.tech> * @author Moko Consulting <hello@mokoconsulting.tech>
* @copyright Copyright (C) 2026 Moko Consulting. All rights reserved. * @copyright Copyright (C) 2026 Moko Consulting. All rights reserved.
* @license GNU General Public License version 3 or later; see LICENSE * @license GNU General Public License version 3 or later; see LICENSE
--> -->
<extension type="plugin" group="webservices" method="upgrade"> <extension type="plugin" group="webservices" method="upgrade">
<name>Web Services - MokoJoomOpenGraph</name> <name>Web Services - MokoSuiteOpenGraph</name>
<version>01.04.11</version> <version>01.06.01</version>
<creationDate>2026-05-23</creationDate> <creationDate>2026-05-23</creationDate>
<author>Moko Consulting</author> <author>Moko Consulting</author>
<authorEmail>hello@mokoconsulting.tech</authorEmail> <authorEmail>hello@mokoconsulting.tech</authorEmail>
@@ -1,7 +1,7 @@
<?php <?php
/** /**
* @package MokoJoomOpenGraph * @package MokoSuiteOpenGraph
* @subpackage plg_webservices_mokoog * @subpackage plg_webservices_mokoog
* @author Moko Consulting <hello@mokoconsulting.tech> * @author Moko Consulting <hello@mokoconsulting.tech>
* @copyright Copyright (C) 2026 Moko Consulting. All rights reserved. * @copyright Copyright (C) 2026 Moko Consulting. All rights reserved.
@@ -1,7 +1,7 @@
<?php <?php
/** /**
* @package MokoJoomOpenGraph * @package MokoSuiteOpenGraph
* @subpackage plg_webservices_mokoog * @subpackage plg_webservices_mokoog
* @author Moko Consulting <hello@mokoconsulting.tech> * @author Moko Consulting <hello@mokoconsulting.tech>
* @copyright Copyright (C) 2026 Moko Consulting. All rights reserved. * @copyright Copyright (C) 2026 Moko Consulting. All rights reserved.
@@ -38,7 +38,7 @@ final class MokoOGWebServices extends CMSPlugin implements SubscriberInterface
} }
/** /**
* Register API routes for MokoJoomOpenGraph. * Register API routes for MokoSuiteOpenGraph.
* *
* Endpoints: * Endpoints:
* GET /api/index.php/v1/mokoog/tags - List all OG tags * GET /api/index.php/v1/mokoog/tags - List all OG tags
+1 -1
View File
@@ -8,7 +8,7 @@
<extension type="package" method="upgrade"> <extension type="package" method="upgrade">
<name>Package - MokoSuiteOpenGraph</name> <name>Package - MokoSuiteOpenGraph</name>
<packagename>mokoog</packagename> <packagename>mokoog</packagename>
<version>01.04.11</version> <version>01.06.01</version>
<creationDate>2026-05-23</creationDate> <creationDate>2026-05-23</creationDate>
<author>Moko Consulting</author> <author>Moko Consulting</author>
<authorEmail>hello@mokoconsulting.tech</authorEmail> <authorEmail>hello@mokoconsulting.tech</authorEmail>
+18 -8
View File
@@ -1,7 +1,7 @@
<?php <?php
/** /**
* @package MokoJoomOpenGraph * @package MokoSuiteOpenGraph
* @author Moko Consulting <hello@mokoconsulting.tech> * @author Moko Consulting <hello@mokoconsulting.tech>
* @copyright Copyright (C) 2026 Moko Consulting. All rights reserved. * @copyright Copyright (C) 2026 Moko Consulting. All rights reserved.
* @license GNU General Public License version 3 or later; see LICENSE * @license GNU General Public License version 3 or later; see LICENSE
@@ -15,8 +15,8 @@ use Joomla\CMS\Language\Text;
class Pkg_MokoOGInstallerScript class Pkg_MokoOGInstallerScript
{ {
protected $minimumJoomla = '4.0.0'; protected $minimumJoomla = '6.0.0';
protected $minimumPhp = '8.1.0'; protected $minimumPhp = '8.2.0';
@@ -33,6 +33,16 @@ class Pkg_MokoOGInstallerScript
return false; return false;
} }
if (version_compare(JVERSION, $this->minimumJoomla, '<'))
{
Factory::getApplication()->enqueueMessage(
Text::sprintf('PKG_MOKOOG_JOOMLA_VERSION_ERROR', $this->minimumJoomla),
'error'
);
return false;
}
$this->saveDownloadKey(); $this->saveDownloadKey();
return true; return true;
@@ -45,7 +55,7 @@ class Pkg_MokoOGInstallerScript
if ($type === 'install') if ($type === 'install')
{ {
$db = Factory::getDbo(); $db = Factory::getContainer()->get(\Joomla\Database\DatabaseInterface::class);
foreach (['system', 'content', 'webservices'] as $folder) foreach (['system', 'content', 'webservices'] as $folder)
{ {
@@ -69,7 +79,7 @@ class Pkg_MokoOGInstallerScript
{ {
try try
{ {
$db = \Joomla\CMS\Factory::getDbo(); $db = \Joomla\CMS\Factory::getContainer()->get(\Joomla\Database\DatabaseInterface::class);
$db->setQuery( $db->setQuery(
$db->getQuery(true) $db->getQuery(true)
->select($db->quoteName('us.extra_query')) ->select($db->quoteName('us.extra_query'))
@@ -93,7 +103,7 @@ class Pkg_MokoOGInstallerScript
try try
{ {
$db = \Joomla\CMS\Factory::getDbo(); $db = \Joomla\CMS\Factory::getContainer()->get(\Joomla\Database\DatabaseInterface::class);
$db->setQuery( $db->setQuery(
$db->getQuery(true) $db->getQuery(true)
->select($db->quoteName('us.update_site_id')) ->select($db->quoteName('us.update_site_id'))
@@ -123,12 +133,12 @@ class Pkg_MokoOGInstallerScript
{ {
try try
{ {
$db = \Joomla\CMS\Factory::getDbo(); $db = \Joomla\CMS\Factory::getContainer()->get(\Joomla\Database\DatabaseInterface::class);
$db->setQuery( $db->setQuery(
$db->getQuery(true) $db->getQuery(true)
->select([$db->quoteName('update_site_id'), $db->quoteName('extra_query')]) ->select([$db->quoteName('update_site_id'), $db->quoteName('extra_query')])
->from($db->quoteName('#__update_sites')) ->from($db->quoteName('#__update_sites'))
->where('(' . $db->quoteName('name') . ' LIKE ' . $db->quote('%MokoJoomOpenGraph%') . ' OR ' . $db->quoteName('location') . ' LIKE ' . $db->quote('%MokoJoomOpenGraph%') . ')') ->where('(' . $db->quoteName('name') . ' LIKE ' . $db->quote('%MokoSuiteOpenGraph%') . ' OR ' . $db->quoteName('location') . ' LIKE ' . $db->quote('%MokoSuiteOpenGraph%') . ')')
->setLimit(1) ->setLimit(1)
); );
$site = $db->loadObject(); $site = $db->loadObject();