{"id":323821,"date":"2026-07-12T19:13:17","date_gmt":"2026-07-12T19:13:17","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/toolkit-pro-by-logicalframe\/"},"modified":"2026-07-12T19:12:58","modified_gmt":"2026-07-12T19:12:58","slug":"logicalframe-siteops","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/logicalframe-siteops\/","author":23513452,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.0.2","stable_tag":"1.0.2","tested":"7.0.1","requires":"6.2","requires_php":"7.4","requires_plugins":null,"header_name":"LogicalFrame SiteOps","header_author":"Irfan Nazar","header_description":"Local-first WordPress site operations utilities for content, media, database cleanup, security, activity logging, and post scheduling.","assets_banners_color":"2d70da","last_updated":"2026-07-12 19:12:58","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"https:\/\/logicalframe.com\/","rating":0,"author_block_rating":0,"active_installs":0,"downloads":34,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.2":{"tag":"1.0.2","author":"logicalframe","date":"2026-07-12 19:12:58"}},"upgrade_notice":{"1.0.2":"<p>Output-escaping refinement for the Media Manager success notice.<\/p>","1.0.1":"<p>Submission-readiness and request-validation refinements.<\/p>","1.0.0":"<p>Initial release.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3605113,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3605113,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3605113,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3605113,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.2"],"block_files":[],"assets_screenshots":[],"screenshots":[]},"plugin_section":[],"plugin_tags":[39231,17806,9034,9619,600],"plugin_category":[54],"plugin_contributors":[271278],"plugin_business_model":[],"class_list":["post-323821","plugin","type-plugin","status-publish","hentry","plugin_tags-admin-tools","plugin_tags-database-cleanup","plugin_tags-media-manager","plugin_tags-post-scheduler","plugin_tags-security","plugin_category-security-and-spam-protection","plugin_contributors-logicalframe","plugin_committers-logicalframe"],"banners":{"banner":"https:\/\/ps.w.org\/logicalframe-siteops\/assets\/banner-772x250.png?rev=3605113","banner_2x":"https:\/\/ps.w.org\/logicalframe-siteops\/assets\/banner-1544x500.png?rev=3605113","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/logicalframe-siteops\/assets\/icon-128x128.png?rev=3605113","icon_2x":"https:\/\/ps.w.org\/logicalframe-siteops\/assets\/icon-256x256.png?rev=3605113","generated":false},"screenshots":[],"raw_content":"<!--section=description-->\n<p>LogicalFrame SiteOps brings together focused utilities for routine WordPress administration without telemetry, remote tracking, remote assets, or external service calls.<\/p>\n\n<p>Modules can be enabled or disabled independently:<\/p>\n\n<ul>\n<li><strong>Admin UX:<\/strong> show post IDs, adjust list length, hide selected core dashboard widgets, and customize the admin footer.<\/li>\n<li><strong>Content Tools:<\/strong> duplicate posts and custom post types, expire published content to draft or trash, and limit retained revisions.<\/li>\n<li><strong>Media Manager:<\/strong> edit missing image alt text in bulk, review unattached media, inspect registered image sizes, and normalize new upload filenames.<\/li>\n<li><strong>Database Cleanup:<\/strong> review and manually remove spam comments, post revisions, expired transients, and orphaned post metadata.<\/li>\n<li><strong>Login Protection:<\/strong> rate-limit failed logins using salted one-way IP hashes and optionally redirect basic author-enumeration requests. This module is disabled by default.<\/li>\n<li><strong>Activity Log:<\/strong> keep a local audit trail of actions performed by SiteOps modules, with configurable retention. Raw IP storage is optional and disabled by default. The Activity Log module itself is also disabled by default.<\/li>\n<li><strong>Bulk Scheduler:<\/strong> view native WordPress scheduled posts in a local calendar, drag posts to a new future date, review a scheduled list, and import schedules from CSV.<\/li>\n<\/ul>\n\n<p>The scheduler uses WordPress core's <code>future<\/code> post status and publishing mechanism. SiteOps does not replace WordPress Cron.<\/p>\n\n<h3>Privacy<\/h3>\n\n<p>LogicalFrame SiteOps does not send telemetry, usage data, site data, credentials, or personal information to LogicalFrame or any third party.<\/p>\n\n<p>All plugin assets are included locally. The plugin does not load JavaScript, CSS, fonts, images, iframes, or APIs from remote services.<\/p>\n\n<p>The Activity Log is stored only in the site's WordPress database. Storing raw IP addresses in Activity Log entries is disabled by default and can be enabled by an administrator. When Login Protection is enabled, login throttling stores only a salted one-way hash of the direct client IP address; it does not store attempted usernames or passwords.<\/p>\n\n<h3>External services<\/h3>\n\n<p>Version 1.0.2 does not connect to any external service. It contains no social-network APIs, analytics, telemetry, license server, remote fonts, or remotely hosted JavaScript or CSS.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>logicalframe-siteops<\/code> folder to <code>\/wp-content\/plugins\/<\/code>, or install the ZIP from <strong>Plugins &gt; Add New &gt; Upload Plugin<\/strong>.<\/li>\n<li>Activate <strong>LogicalFrame SiteOps<\/strong>.<\/li>\n<li>Open <strong>SiteOps &gt; Settings<\/strong> and enable only the modules you need.<\/li>\n<li>Create a current database backup before using Database Cleanup.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20siteops%20connect%20to%20external%20services%3F\"><h3>Does SiteOps connect to external services?<\/h3><\/dt>\n<dd><p>No. Version 1.0.2 is local-first and contains no external-service integrations, remote assets, telemetry, or license checks.<\/p><\/dd>\n<dt id=\"does%20the%20scheduler%20create%20a%20separate%20queue%3F\"><h3>Does the scheduler create a separate queue?<\/h3><\/dt>\n<dd><p>No. It uses the native WordPress <code>future<\/code> post status, post dates, and core scheduled publishing.<\/p><\/dd>\n<dt id=\"what%20csv%20format%20does%20the%20scheduler%20accept%3F\"><h3>What CSV format does the scheduler accept?<\/h3><\/dt>\n<dd><p>Use either:<\/p>\n\n<pre><code>post_id,scheduled_at\n<\/code><\/pre>\n\n<p>or:<\/p>\n\n<pre><code>post_id,date,time\n<\/code><\/pre>\n\n<p>Dates are interpreted in the WordPress site timezone. Each date must be in the future, and the importing administrator must be allowed to edit and publish the referenced post.<\/p><\/dd>\n<dt id=\"does%20%22unattached%20media%22%20mean%20the%20file%20is%20unused%3F\"><h3>Does \"unattached media\" mean the file is unused?<\/h3><\/dt>\n<dd><p>No. An attachment can have no parent post while still being referenced by blocks, widgets, custom fields, theme settings, or external content. SiteOps only reports attachment status and does not automatically delete media.<\/p><\/dd>\n<dt id=\"what%20happens%20to%20plugin%20data%20on%20uninstall%3F\"><h3>What happens to plugin data on uninstall?<\/h3><\/dt>\n<dd><p>Data is preserved by default. An administrator can explicitly enable <strong>Delete SiteOps data on uninstall<\/strong> before uninstalling the plugin.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.2<\/h4>\n\n<ul>\n<li>Escaped the complete formatted bulk alt-text success message to satisfy WordPress output-escaping requirements.<\/li>\n<\/ul>\n\n<h4>1.0.1<\/h4>\n\n<ul>\n<li>Resolved Plugin Check internationalization, request-validation, and database-query notices.<\/li>\n<li>Removed the obsolete manual translation-loader call for modern WordPress versions.<\/li>\n<li>Hardened CSV upload field validation and bulk alt-text sanitization.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial WordPress.org submission under the LogicalFrame SiteOps name.<\/li>\n<li>Added seven independently toggleable, local-first modules.<\/li>\n<li>Replaced remote calendar assets with a locally implemented scheduler calendar.<\/li>\n<li>Uses native WordPress future-post scheduling.<\/li>\n<li>Added nonce, capability, sanitization, escaping, privacy, retention, and uninstall controls.<\/li>\n<\/ul>","raw_excerpt":"Local-first WordPress operations tools for content, media, cleanup, login protection, activity logging, and scheduling.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/323821","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=323821"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/logicalframe"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=323821"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=323821"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=323821"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=323821"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=323821"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=323821"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}