dev/wordpress#73 - Be more forgiving about slash in wpBasePage
authorTim Otten <totten@civicrm.org>
Wed, 2 Sep 2020 23:34:27 +0000 (16:34 -0700)
committerTim Otten <totten@civicrm.org>
Thu, 3 Sep 2020 01:10:55 +0000 (18:10 -0700)
Overview
--------

The correct functioning of `wpBasePage` depends on whether the administrator
omitted or added a trailing slash.  This is apparent on URLs with a trailing slash, eg

```
http://wpmaster.bknix:8001/civicrm/contribute/transact/?reset=1&id=1
```

Make it less sensitive.

Before
------

URL is OK with default setting `wpBasePage=civicrm`

URL fails with setting `wpBasePage=civicrm/`

After
-----

URL is OK with either setting `wpBasePage=civicrm` or `wpBasePage=civicrm/`

Technical Details
-----------------

I believe the old symptom arose because of the formula which produces the WP
rewrite rules (`'^' .  $config->wpBasePage .  '/([^?]*)?'`) expects that
there is no trailing slash. You could theoretically patch there, but this
seems like it'll provide more thorough normalization.

When testing, the results affect the WP rewrite rules, so you may need to be particularly
aggressive about clearing caches whenever you make a change in code or settings, eg

```
wp cache flush ; cv flush;  wp rewrite flush
```

CRM/Core/Config/MagicMerge.php
CRM/Utils/System/WordPress.php

index 88110b643209d61da95f64316165909ba28c7c92..6050c22a2dacd034cb06d50abce96178b29a55fd 100644 (file)
@@ -170,7 +170,6 @@ class CRM_Core_Config_MagicMerge {
       'userFrameworkUsersTableName' => ['setting'],
       'verpSeparator' => ['setting'],
       'wkhtmltopdfPath' => ['setting'],
-      'wpBasePage' => ['setting'],
       'wpLoadPhp' => ['setting'],
 
       // "path" properties are managed via Civi::paths and $civicrm_paths
@@ -204,6 +203,7 @@ class CRM_Core_Config_MagicMerge {
       // @todo remove geocodeMethod. As of Feb 2018, $config->geocodeMethod works but gives a deprecation warning.
       'geocodeMethod' => ['callback', 'CRM_Utils_Geocode', 'getProviderClass'],
       'defaultCurrencySymbol' => ['callback', 'CRM_Core_BAO_Country', 'getDefaultCurrencySymbol'],
+      'wpBasePage' => ['callback', 'CRM_Utils_System_WordPress', 'getBasePage'],
     ];
   }
 
index 4e86eb89bf9f37a415b734a6ef2327ad5258b146..61f499bd4bd6782e4992ce7b68160e00fcf03ada 100644 (file)
  */
 class CRM_Utils_System_WordPress extends CRM_Utils_System_Base {
 
+  /**
+   * Get a normalized version of the wpBasePage.
+   */
+  public static function getBasePage() {
+    return rtrim(Civi::settings()->get('wpBasePage'), '/');
+  }
+
   /**
    */
   public function __construct() {