Yoast / wordpress-seo

Yoast SEO for WordPress
https://yoast.com/wordpress/plugins/seo/
Other
1.77k stars 894 forks source link

Premium: Remove install/activate nag for Yoast SEO when using both as mu-plugins #18706

Open fiskhandlarn opened 2 years ago

fiskhandlarn commented 2 years ago

Is your feature request related to a problem? Please describe.

when we run yoast/wordpress-seo and yoast/wordpress-seo-premium as mu-plugins (courtesy of roots/bedrock-autoloader) we still get the nag to activate the base plugin:

Yoast SEO 19.3 must be installed and activated in order to use Yoast SEO Premium.

Describe the solution you'd like

this is a patch for wordpress-seo-premium/src/addon-installer.php i have tried locally, please consider adding it to yoast/wordpress-seo-premium:

--- /public/mu-plugins/wordpress-seo-premium/src/addon-installer.php    Tue Jul 12 10:21:58 2022
+++ /public/mu-plugins/wordpress-seo-premium2/src/addon-installer.php   Tue Jul 19 14:30:18 2022
@@ -133,7 +133,9 @@
    protected function get_notification_action() {
        $minimum_version_met = \version_compare( $this->yoast_seo_version, self::MINIMUM_YOAST_SEO_VERSION . '-RC0', '>=' );
        $network_active      = \is_plugin_active_for_network( \WPSEO_PREMIUM_BASENAME );
-       $yoast_seo_active    = ( $network_active ) ? \is_plugin_active_for_network( $this->yoast_seo_file ) : \is_plugin_active( $this->yoast_seo_file );
+       $yoast_seo_active    =
+            ( false !== strpos( $this->yoast_seo_dir, \WPMU_PLUGIN_DIR ) ) ||
+            ( ( $network_active ) ? \is_plugin_active_for_network( $this->yoast_seo_file ) : \is_plugin_active( $this->yoast_seo_file ) );

        if ( $minimum_version_met && $yoast_seo_active ) {
            return false;
@@ -300,6 +302,18 @@
                $this->yoast_seo_dir     = \WP_PLUGIN_DIR . '/' . \dirname( $file );
            }
        }
+
+        // Make sure Yoast SEO isn't already installed in the mu-plugins directory.
+        $file = \WPMU_PLUGIN_DIR . DIRECTORY_SEPARATOR . $this->yoast_seo_file;
+        $plugin = @get_plugin_data($file);
+        if (
+            isset( $plugin['TextDomain'] ) && $plugin['TextDomain'] === 'wordpress-seo'
+            && isset( $plugin['Name'] ) && $plugin['Name'] === 'Yoast SEO'
+        ) {
+            // $this->yoast_seo_file is already correct, keep it as it is
+            $this->yoast_seo_version = isset( $plugin['Version'] ) ? $plugin['Version'] : '0';
+            $this->yoast_seo_dir     = \dirname( $file );
+        }
    }

    /**

Why do you think this feature is something we should consider for the Yoast SEO plugins?

some people like to use mu-plugins to streamline all the requirements without having to manually activate and keep databases in sync.

fiskhandlarn commented 2 years ago

also: wordpress-seo-premium/src/addon-installer.php already have is_yoast_seo_up_to_date() which checks WPSEO_VERSION and could therefore be used instead of checking against $this->yoast_seo_version (derived from the wordpress-seo/wp-seo.php only if it's in the plugins folder).

trsteel88 commented 11 months ago

+1 for this.

trsteel88 commented 10 months ago

The other approach here could be that the Wordpress SEO plugin could just have a filter to provide the version to other plugins.

e.g. in the non premium version:

add_filter('wp_seo_current_version', function($version) {
    return '1.1.1';
}, 10, 1);

Then in the premium plugin the version would be checked with:

$value = apply_filters( 'wp_seo_current_version', '0');

If the plugin is installed and active, the version would be returned as '1.1.1'. If it was not installed the $value would be '0'.

This would mean a version would be returned regardless of whether it's a plugin or mu-plugin.

Only caveat here is that another plugin could fake the version by returning a value from this filter (but why would they?)

juhojama commented 8 months ago

+1

fiskhandlarn commented 5 months ago

bump