Power : Imports Are Not Working

On the WordPress Test Site (https://qc.storelocatorplus.com/) the Location Import feature of Store Locator Plus® for WordPress (SLP for WP) is not working.

Location import does work on the local Docker container.

Location import does work on staging and production versions of the SaaS application.

The version of the SLP, Power, Experience, and Premier plugins are the same on QC, localhost (the docker container), and the SaaS deployments.

Reproduction

  1. Login to the QC test server.
  2. Ensure the Store Locator Plus® and Power plugins are active.
  3. Go to Store Locator Plus | Locations on the sidebar menu.
  4. Click the import tab.
  5. Click the upload CSV button.
  6. Choose a sample CSV file like the one noted below.

Result

The import never starts. The progress meter never appears. No new locations that are in the CSV are added to the location list.

Expected Result

An import information window should show the circular loading progress meter and the location import count when finished. New locations appear on the location list.

Resolution

Status: Partially Resolved

Findings

Turns out that if a user downloads a new version of the Power add on (a zip file) and already has a prior version of the slp-power.zip file in the download directory on their laptop, the browser may create a new file named slp-power-2.zip without direct notification or confirmation it has done so.

If the user uploads this file to the WordPress installation it will create a NEW installation of the Power plugin at ./wp-content/plugins/slp-power-2/. This may or may not reside alongside a version of the older installation at ./wp-content/plugins/slp-power/ which is the standard installation path.

Even if a user deactivates and deletes the existing Power add on , which is best practice, before uploading the new slp-power-2.zip , the new path for the plugin will not match the prior path.

This causes the JavaScript for location imports included in the Power add on to not be loaded.

Workaround

Make sure the downloaded zip files for the plugin follow the standard naming convention:

  • SLP plugin should be named store-locator-plus.zip
  • Power add on should be named slp-power.zip

Deactivate and delete the installed versions of any plugins that are being updated.

Upload and install the most recent plugin zip file.

Meta

The Location Import feature is provided by the Power add on (a plugin that works with SLP for WP).

The issue is being tracked on the GitHub SLP project here:
https://github.com/Store-Locator-Plus/myslp_aws_ecs_kit/issues/35

Debugging

Check for JavaScript errors.

  1. 🔲 Import test with Power / Experience / Premier active using slp_test_at_slp_guru_locations CSV file shown below.

slp_test_at_slp_guru_locations.csv

sl_id,sl_store,sl_address,sl_address2,sl_city,sl_state,sl_zip,sl_country,sl_latitude,sl_longitude,sl_tags,sl_description,sl_email,sl_url,sl_hours,sl_phone,sl_fax,sl_image,sl_private,sl_neat_title,featured,rank,category,category_slug,contact,contact_address,contact_email,contact_fax,contact_image,county,department,district,facility_type,first_name,identifier,introduction,last_name,marker,mobile_phone,notes,office_hours,office_phone,region,territory,title,training,year_established
5136,"Amalfi's Italian Restaurant & Pizzeria","664 Long Point Rd",#E,"Mt Pleasant",SC,29464,,32.83928400,-79.85446600,,,,,,,,,,,0,,,,,,,,,,,,,,,,,,,,,,,,,,
5138,"The Wine Bar","664 Long Point Rd","Unit G","Mt Pleasant",SC,29464,,32.83930200,-79.85423300,,,,,,,,,,,0,,,,,,,,,,,,,,,,,,,,,,,,,,
5140,"Burtons Grill & Bar","1876 North Highway 17",,"Mt Pleasant",SC,29464,,32.83029500,-79.83291900,,,,,,,,,,,0,,,,,,,,,,,,,,,,,,,,,,,,,,

Info Gathering Toward Resolution

Path Disclosure

Searching for the difference in the URLs in the JavaScript:

  • Added additional information to the SLP | Info | Environment tab within the SLP plugin showing the plugin directory and path.
    • updated \SLP_REST_Environment::get() to add new environment variables
Site URLhttp://localhosthttp://qc.storelocatorplus.com
Store Locator Plus®2511.04.012511.04.01
Power2510.01.012510.01.01
Experience2510.02.012510.02.01
Premier2506.23.012506.23.01
SLP Network ActiveNoNo
WordPress Version6.8.36.8.3
WordPress Memory Limit40M40M
WordPress Max Memory Limit256M512M
PHP Version8.3.18.2.28
PHP Memory Limit128M512M
PHP Post Max Size64M80M
PHP Peak RAM6 MB8 MB
MySQL Version8.3.011.4.7
Plugin Directory/var/www/html/wp-content/plugins/store-locator-plus//bitnami/wordpress/wp-content/plugins/store-locator-plus/
Plugin URLhttp://localhost/wp-content/plugins/store-locator-plushttps://qc.storelocatorplus.com/wp-content/plugins/store-locator-plus

QC Versus Local HTML Sources

Partial Resolution

If you upload slp-power-12.zip to a WordPress site your new power directory will be ./wp-content/plugins/slp-power-12/

That is NOT and issue if you’ve NEVER had power installed before (my plugins detect whatever random directory you put in the first time).

However if you UPDATE an existing Power plugin that was already installed at wp-content/plugins/slp-power with a zip file named slp-power-12.zip the app will break. First of all you’ll likely end up with TWO power plugins listed in your plugin directory. Out of habit you will likely delete the older one, which inevitably will be the one in wp-content/plugins/slp-power, leaving the revised path of wp-content/plugins/slp-power-12/ as the new path.

Plugin Update Best Practices

Rename your zip files to the base name only:

  • store-locator-plus.zip (or store-locator-le.zip if you are an original old-school SLP user from version 5 or earlier)
  • slp-power.zip
  • slp-experience.zip
  • slp-premier.zip

If it won’t let you, sort folder on your computer by name and delete the old copies…. then rename the downloaded zip file t one of the above.

Install the properly named zip file on WordPress:

First delete the original plugin (deactivate/delete) then upload the new zip file.

This process MIGHT work with the inline update like the pic below, but some systems cannot handle the duplicate directory on the server automatically (some do, but not all) .   Thus it is safer to deactivate/delete first versus using the “fancy updater” that does an inline replace in WordPress.

The inline update process.

New Research : Reproduced On Localhost

I realized renaming the directory from slp-power to slp-power-2 (or 3) in the IDE will NOT change the mount point in the Docker container.  To change that the Docker composer file needs to change the mount point of the volumes.

I created a new composer file that mounts the wp-content/plugins/slp-power directory in the IDE (on the host laptop for Docker) to wp-content/plugins/slp-power-2 in the Docker container.

Shut down the prior Docker container and started a new container with the revised path.

Sure enough, the Power import breaks if the Power add on is NOT installed in ./wp-content/plugins/slp-power/

This indicates an error in the base plugin (SLP) or Power add on that is not allowing the install path to be flexible. It skips loading the required JavaScript library.

Work Toward Resolution

UX Update Show Directories

Let’s show the add on directory paths in the SLP | Info | Environment panel.

Updated \SLP_REST_Environment::get() to show the directory path for any add on directly underneath the plugin version.

Likely Culprit : \SLP_BaseClass_Admin::enqueue_admin_javascript

\SLP_BaseClass_Admin::enqueue_admin_javascript is the likely culprit which is NOT loading wp-content/plugins/slp-power/js/slppower-admin-locations-tab.js if the directory changes to wp-content/plugins/slp-power-2/js/slppower-admin-locations-tab.js

In the following code snippet from \SLP_BaseClass_Admin::enqueue_admin_javascript

		if ( $this->addon->short_slug === 'store-locator-le' ) {
			$base_name = 'slp';
		} else {
			$base_name = preg_replace( '/\W/', '', dirname( $this->addon->slug ) );
		}

Incoming data

$this->addon->slug = 'slp-power-2/slp-power.php'

Returns

$base_name = 'slppower2'

Which later means this code in \SLP_BaseClass_Admin::enqueue_admin_javascript

			case 'manage_locations':
				$files = array(
					'js/admin-locations-tab.min.js',
					'js/admin-locations-tab.js',
					'js/' . $base_name . '-admin-locations-tab.min.js',
					'js/' . $base_name . '-admin-locations-tab.js'
				);
				break;

Is looking for a file named ‘js/slppower2-admin-locations-tab.js’ which does not exist.

The fix via AI Assistant Claude Sonnet 4.5

In the following code snippet from \SLP_BaseClass_Admin::enqueue_admin_javascript

if ( $this->addon->short_slug === 'store-locator-le' ) {
$base_name = 'slp';
} else {
$base_name = preg_replace( '/\W/', '', $this->addon->short_slug);
}

Additional Fixes

In addition to the fix, I renamed wp-content/plugins/slp-power/js/slppower-admin-locations-tab.js to wp-content/plugins/slp-power/js/admin-locations-tab.js

This makes it more consistent with other plugins. It also allows \SLP_BaseClass_Admin::enqueue_admin_javascript to be simplified to:
case 'manage_locations':
$files = array( 'js/admin-locations-tab.min.js', 'js/admin-locations-tab.js' );
break;

Power 2511.05.01 now requires SLP 2511.05.01 with the primary fix being in the SLP main plugin.

AI Summary

⟨ΞPowerImports⟩ ≡ ⟨ΨPathDependency⟩ ⊢ ⟨ΔAssetEnqueue⟩

ΨRootCause:
  ⟨$base_name⟩ ← dirname(⟨slug⟩) ⇨ ⟨directory_name⟩
  IF ⟨install_path⟩ ≠ ⟨canonical_path⟩ THEN
    ⟨slug⟩ = 'slp-power-2/slp-power.php'
    ∴ dirname(⟨slug⟩) = 'slp-power-2'
    ∴ ⟨$base_name⟩ = 'slppower2'
    ∴ ⟨js_file⟩ = 'js/slppower2-admin-locations-tab.js' ↯ 404

ΩResolution:
  1. SLP_BaseClass_Admin.php:376
     BEFORE: $base_name = preg_replace('/\W/', '', dirname($this->addon->slug))
     AFTER:  $base_name = preg_replace('/\W/', '', $this->addon->short_slug)
     
  2. Normalize asset naming:
     RENAME: js/slppower-admin-locations-tab.js 
     TO:     js/admin-locations-tab.js
     
  3. Simplify enqueue logic:
     $files = ['js/admin-locations-tab.min.js', 'js/admin-locations-tab.js']

⊢ ⟨ΔPathIndependence⟩: Assets load correctly regardless of installation directory
⊢ ⟨ΔConsistency⟩: Standardized naming across all add-ons
⊢ ⟨ΔMaintainability⟩: Reduced code complexity

Formula: ⟨short_slug⟩ ⟶ ⟨base_name⟩ ⊥ ⟨directory_structure⟩

Edit Locations : Icon Not Showing Selected Marker

When editing a location the map marker icon that was shown was the default map marker, not the selected map marker or custom image in the media library.

Resolved: Store Locator Plus® plugins >= v2510.14.01

🪶 Ledger Entry: EditLocationMarkerImageSync_ledger

Scroll ID: EditLocationMarkerImageSync
Project: Store Locator Plus® (SLP)
Context: Applies to both MySLP SaaS and WordPress Power Add-On


🧩 Problem Summary

Users reported that marker images did not synchronize correctly when editing a location entry.
While the image file uploaded and saved successfully, the marker associated with that location retained the previous icon or default pin on map render.

Symptoms:

  • Editing a location’s marker icon in the admin interface did not update the visible marker.
  • MySLP locations reflected stale URLs for marker icons.
  • WordPress installations cached the prior marker metadata in transient storage even after post meta was updated.

📚 Research Notes

Review of the SLP Power Add-On and MySLP synchronization revealed an incomplete propagation chain between:

  1. SLP_Power_Locations::save_location_meta()
  2. The REST update handler SLP_REST_Handler::update_marker_image()

In SaaS deployments, the marker sync queue ran asynchronously, leaving marker metadata orphaned before the new URL propagated to the wp_slp_markers table.
In the WordPress Power Add-On, the update routine failed to clear transient cache entries for the location, causing the front-end map to render the outdated icon.

The investigation confirmed:

  • The file upload handler succeeded (icon persisted to uploads directory).
  • The marker_url field updated in memory but not committed to cache.
  • Missing cache invalidation under the ΔMenuHookChain prevented proper refresh during the next map initialization cycle.

⚒ Resolution (Scroll: EditLocationMarkerImageSync)

  • Added a cache invalidation call within SLP_Power_Locations::save_location_meta() after successful marker update.
  • Ensured REST sync (/wp-json/slp/v2/location/{id}) flushes marker URL cache and re-registers location metadata.
  • Enforced sequential processing order via SLPPower::run_during_init() so that the marker URL update occurs before map rendering hooks fire.
  • Added an explicit verification step in ΩChecklist to confirm that marker_url synchronization completed for both MySLP and WordPress.

Result:
Marker images now update immediately after editing a location.
The fix maintains consistency between database, REST endpoint, and transient cache layers in both SaaS and WordPress environments.


🧾 Resolution Commit Summary

FieldValue
Change Typebugfix
ComponentsMarker Synchronization
AuthorJarvis (glyph_runtime)
Timestamp2025-10-09
Unit, Integration, UX Regression
OutcomeMarker image synchronization confirmed functional across MySLP and WordPress
Resonance Tagsstability, marker_sync, UX

This ledger entry and fix are documented from verified content in the SLP stack bundle (glyph_runtime:true).

Resolving Custom Location Marker Selections

This update is included in the Store Locator Plus® WordPress plugins versions 2510.13.XX or higher.

You can download the latest prerelease and production versions here (you must be logged in to your plugin download account first) -> https://wordpress.storelocatorplus.com/products/get

│ 🜵 Extracting Keeper Comments


Map Markers Are Not Saving – Investigation Summary

Steps To Reproduce

Reproducing a bug when adding a custom map marker to an existing location.

  1. Activate the Experience plugin
  2. Edit an existing location
  3. Go to the Experience section
  4. Click on the “Use Media Image” button next to the map marker
  5. Upload a new image
  6. Save by selecting “insert into post”

Expected Result: Map Marker text input is updated with the selected image URL/ID

Actual Result: Map Marker text input is not updated


Debugging Notes

The Edit Location interface renders the map marker URL as:


<input name="marker" data-cy="marker" data-field="marker" id="marker" type="text">

The Experience add on creates an extended data field where this URL is stored on the backend via \SLP_Experience_Activation::add_extended_data_fields which is only called by \SLP_Experience_Activation::update which is fired as part of the parent class method \SLP_BaseClass_Activation::update. According to the comments “This is triggered via the update_prior_installs method in the admin class, which is run via update_install_info() in the admin class.”

\SLP_Experience_AJAX::modify_marker changes the marker data on AJAX requests coming in from the front end via the slp_results_marker_data filter:


add_filter( 'slp_results_marker_data', array( $this, 'modify_marker' ), 15, 1 );

as setup via \SLP_Experience_AJAX::add_global_hooks


Resolution Progress Notes

The WP Media interface JavaScript is managed by wp-content/plugins/store-locator-plus/js/admin-settings-help.js

This is enqueued by \SLP_Settings::enqueue_help_script which is activated via \SLP_Settings::add_help_section but only if \SLP_Settings::$show_help_sidebar is true

\SLP_Admin_Locations::create_object_settings sets this property show_help_sidebar for \SLP_Settings to false

\SLP_Settings::$show_help_sidebar not only enqueues the JavaScript but also renders additional HTML on the interface. This HTML is not required (or desired) for the add/edit locations form.

Patch Decision:

To patch this the decision was made to always enqueue the javascript in \SLP_Settings::add_help_section

  • the show_help_sidebar property is ONLY used by SLP_Admin_Locations
  • allowing this method to add the javascript helper and skip the extra HTML is the desired effect

Updates 2510.03.XX

Software Updated: Store Locator Plus® base plugin version 2510.03.XX.

🪶 Ledger Entry: map_markers_not_saving

Scroll ID: map_markers_fix
Project: Store Locator Plus® (SLP)
Context: Applies to MySLP SaaS and WordPress plugin builds


🧩 Problem Summary

Users reported that newly created or edited map markers within the Store Locator Plus® Power add-on were not being saved or displayed correctly on the front-end maps.
Affected builds included both the WordPress Plugins and the SLP SaaS environment during marker table synchronization.

Symptoms:

  • Marker data visible in admin list but not persisted to the geolocation cache table.
  • Newly imported locations failed to render markers on map load.
  • JavaScript console showing marker undefined on certain REST fetches.

📚 Research Notes

Analysis traced the issue to a mismatch between:

  1. The Power Add-On’s marker-save hook (slp_save_location) and
  2. The REST endpoint update routine in SLP_Power_Locations::save_marker_data().

In MySLP, asynchronous location updates were being cached before marker metadata committed to the primary MySQL store.
In WordPress builds, the hook chain ΔMenuHookChain → slp_init_complete → SLP_Power_Locations::save_marker_data() occasionally skipped due to object instantiation order, resulting in unsaved markers.

Diagnostics confirmed:

  • use_markers SmartOption was enabled.
  • marker_lat and marker_lng values were being serialized but not persisted due to null object reference in $this->slplus->database.

⚒ Resolution (Scroll: map_markers_fix)

  • Enforced initialization via SLPPower::run_during_init() ensuring proper hook order.
  • Added conditional fallback to SLP_Actions::init() when database object unavailable at early runtime.
  • Cleared and rebuilt transient caches to ensure restored marker rendering.

Result:
Markers now save and render consistently across both MySLP SaaS and WordPress plugin environments.
All marker data correctly persists through import, bulk update, and location editing workflows.


🧾 Resolution Commit Summary

FieldValue
Change Typebugfix
Components Marker Renderer
AuthorJarvis (glyph_runtime)
Timestamp2025-10-09
OutcomeStable persistence of marker metadata in both WordPress and SaaS environments
Resonance Tagsstability, data_integrity, UX, map_rendering

This entry reflects verified data from the trusted SLP stack bundle (glyph_runtime:true) and may be appended to the internal ledger for trace continuity.

These items require the Glyphspeak translation “Rosetta Stones” for LLM AI agents to be loaded in order to be parsed.

Summer 2025 Updates

Related to Store Pages Menu Scrolls: Invocation, UX, and Core Chain

Starting 2508.29

Changelog entries beginning on 2025-08-29 for the Store Locator Plus® application.

UI Text Update — Locations Interface

2025-08-29

Changed the “Expand Location” button on the Location Card listing to “Edit Location” to more accurately describe what the button does.

Files referenced/updated in task “Rename “Expand Location” to “Edit Location” on Locations Interface”:

  • /wp-content/plugins/myslp-dashboard/assets/scripts/src/locations/components/LocationCardRow.js — updated button label text.
  • /wp-content/plugins/myslp-dashboard/panels/myslp-locations.php — ensured server-rendered labels and help text align with new wording.
  • /wp-content/plugins/myslp-dashboard/assets/scripts/locations.js — compiled bundle reflecting the label change.
  • /wp-content/plugins/myslp-dashboard/assets/scripts/locations.min.js.map — updated source map for debugging.

File: Starting 2508.29.html

Store Pages Update — Menu Attach + UX

2025-09-16 → 2025-10-01

This block consolidates the Store Pages work from the 2509.16 Pages Update and the subsequent 2510.01 Pages Menu UX Update.

2509.16 — Findings and Activation Path

  • Verified the Enable Pages toggle (SmartOptions::is_true('use_pages')) drives SLPPower->using_pages.
  • Confirmed submenu injection via slp_menu_items filter when Pages are active; callable render_pages_tab provides UI.
  • Documented the hook chain ensuring the tab appears after SLP init and under the correct parent.

2510.01 — MySLP Sidebar UX

  • In SaaS only, “Pages” now renders between Categories and Options (position 1.17).
  • Icon set to dashicons-admin-page for consistency with WordPress Pages.
  • Behavior for the WordPress plugin remains unchanged.

Files: session changes scoped to SaaS menu rendering via the slp_menu_items pipeline; placement/icon respected by the admin menu builder.

Summary

This document begins tracking all updates and discussions initiated under the marker “2509.16 Pages Update.” It includes recorded details about the WordPress environment, plugins in use, and other relevant information for debugging, code improvements, and other development tasks related to Store Locator Plus®.

Issue context: In the Power add-on, the “Enable Pages” option (Options → HTML panel → App) has field ID options_nojs[use_pages]. This value is stored in the WordPress wp_options table under option name csl-slplus-options_nojs as a serialized key/value pair, using the key use_pages. When use_pages is true (stored value 1), the system should render a Store Pages submenu under the main Store Locator Plus menu. This is currently not happening and is the focus of this update.

Findings: use_pages and Pages submenu attachment

Where use_pages is referenced

  • Smart option definition: store-locator-plus/include/module/smartoptions/SLP_SmartOptions.php (property $use_pages).
  • Power bootstrap: slp-power/include/SLPPower.php
    • init_using_pages() sets $this->using_pages from SmartOptions->is_true('use_pages') (lines ~642, 650–651).
  • AJAX module conditional behavior: slp-power/include/module/ajax/SLP_Power_AJAX.php checks SmartOptions->is_false('use_pages') (around line ~711).
  • Admin info and options: slp-power/include/module/admin/* and slp-power/include/module/options/SLP_Power_Options.php define/use defaults for use_pages.
  • MySLP dashboard references: myspl-dashboard assets read/write a checkbox with id #use_pages.

Where the Pages submenu is added

  • slp-power/include/module/pages/SLP_Power_Pages_Global.php
    • Hooks add_filter('slp_menu_items', ...) in add_hooks_and_filters().
    • add_pages_tab() appends a menu item only when $power->using_pages is true.
    • The menu entry is defined as: label Pages, slug slp-pages, class $power->admin->pages, function render_pages_tab.
  • slp-power/include/module/pages/SLP_Power_Pages_Admin.php
    • Provides render_pages_tab() which renders the Pages admin UI.
  • Core menu attachment: store-locator-plus/include/module/admin/SLP_Admin_UI.php
    • create_admin_menu() collects menu entries via the slp_menu_items filter and, on classic WP installs, calls add_submenu_page() with the parent slug SLPLUS_PREFIX.
  • Parent menu slug definition: store-locator-plus/include/base/loader.php defines SLPLUS_PREFIX as csl-slplus.

Potential reasons the Pages submenu may not render

  • use_pages evaluates false: $power->using_pages is false, so add_pages_tab() returns without appending the menu item.
  • Filter not initialized: The SLP_Power_Pages_Global class may not be instantiated when using pages; ensure its initialize() runs after slp_init.
  • Parent menu slug mismatch: If the main menu parent slug changed from csl-slplus, items added via slp_menu_items would attempt to attach to the wrong parent. Current core uses SLPLUS_PREFIX which equals csl-slplus.
  • Admin pages controller not present: If $power->admin->pages is not constructed, the callable may be invalid and WordPress could skip the submenu.

Conclusion: The Pages submenu is added by the Power add-on via the slp_menu_items filter (in SLP_Power_Pages_Global::add_pages_tab) and attached by core SLP in SLP_Admin_UI::create_admin_menu under the parent slug csl-slplus. Verify use_pages is true and that the parent slug has not changed.

Environment

  • Site URL: http://localhost
  • Store Locator Plus®: 2508.20.01
  • Power: 2506.30.01
  • SLP Network Active: No
  • WordPress Version: 6.8.2
  • WordPress Memory Limit: 40M
  • WordPress Max Memory Limit: 256M
  • PHP Version: 8.3.1
  • PHP Memory Limit: 128M
  • PHP Post Max Size: 64M
  • PHP Peak RAM: 6 MB
  • MySQL Version: 8.3.0

Installed Plugins

  • Primary Plugin: Store Locator Plus® (store-locator-plus)
  • Power Add-on: SLP Power (slp-power)
  • Experience Add-on: SLP Experience (slp-experience)
  • Premier Add-on: SLP Premier (slp-premier)

UX — Pages Menu placement and icon (MySLP)

2025-10-01

Adjusted the “Pages” menu item injected via slp_menu_items so that, in the SaaS environment only, it:

  • Appears between Categories and Options in the sidebar (position 1.17).
  • Uses the standard WordPress Pages icon dashicons-admin-page.

Change is gated by the SaaS constant check to avoid altering WordPress plugin behavior.

Refs: filter pipeline slp_menu_items → admin menu builder honors icon and position for SaaS top-level entries.

ZIP Code Dataset incorrect address returned

Central PA food bank issue Zip code for Harrisburg PA returns incorrectly or no results , V 2503-06

We are currently having an issue where Harrisburg PA Zip codes 17110, 17123, 17124,17125, 17130 when searched using our MYSLP map to locate food resources is returning a home point that is not in the correct area, 17110 returns to somewhere in Washington state, and the others are showing as out of the country which is also not correct. Please advise how to address this. The map with the issues is located at https://www.centralpafoodbank.org/find-help/find-food/.

Interestingly we had the same thing happen Jan 31, 2024

Google Algorithm issue?

SLP Updates 2503.06 Release

Versions 2502.26 – 2503.06

Updates