Last active
December 22, 2020 22:00
-
-
Save anibalardid/432a6b5fd848521e4d6f48dff9d720ea to your computer and use it in GitHub Desktop.
[carga condicional de plugins en wp] texto y codigo de ayudawp #WordPress #Plugins
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Vamos al lío. Empezamos con la estructura básica de nuestro MU-Plugin, que será de este estilo, muy sencillo, con la llamada del filtro option_active_plugins a nuestra función ayudawp_option_active_plugins donde modificaremos el array de plugins activos ($plugin_list), quedando tal que así: | |
<?php | |
// Ejecutar el filtro solo para front-end | |
if(!is_admin()) | |
add_filter( 'option_active_plugins', 'ayudawp_option_active_plugins', 1); | |
function ayudawp_option_active_plugins ( $plugin_list ){ | |
//Aqui irán las condiciones | |
//Y aquí devolvemos a WordPress el listado de plugins que queremos cargar | |
return $plugin_list; | |
} | |
?> | |
Ahora vamos con un ejemplo para entender cómo WordPress tiene referenciados los plugins internamente, que es la manera que utilizaremos para quitarlos del array. | |
Como podrás ver por el resultado de la ejecución, los plugins están referenciados por el nombre del directorio y el nombre del archivo PHP que lo ejecuta: | |
<?php | |
if(!is_admin()) | |
add_filter( 'option_active_plugins', 'ayudawp_option_active_plugins', 1); | |
function ayudawp_option_active_plugins ( $plugin_list ){ | |
//Mostrar el listado de plugins | |
print_r($plugin_list); | |
exit; //No continuar con la ejecución | |
} | |
?> | |
Nota: no utilizar el ejemplo anterior en un entorno de producción, ya que sólo ejecuta esa función y generará error al usuario. | |
Basándonos en el mismo concepto y en el primer ejemplo que pusimos, cómo haríamos la carga condicional del plugin Contact Form 7 sólo en la página donde tenemos nuestro formulario de contacto: | |
<?php | |
if(!is_admin()) | |
add_filter( 'option_active_plugins', 'ayudawp_option_active_plugins', 1); | |
function ayudawp_option_active_plugins ( $plugin_list ){ | |
$request_uri = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH); | |
//Miramos cuando es necesario el plugin por la URL | |
$is_cf7_needed = ($request_uri === '/contacto/' || strpos( $request_uri, '/wp-json/contact-form-7/v1/contact-forms/') !== false); | |
//Lo quitamos cuando no es necesario | |
if (!$is_cf7_needed) | |
unset( $plugin_list[array_search( 'contact-form-7/wp-contact-form-7.php', $plugin_list)]); | |
return $plugin_list; | |
} | |
?> | |
Nota: la única complejidad es manejar las dos URL que necesita el plugin, la de la página donde lo hemos incrustado, normalmente mediante un shortcode, y la que necesita el plugin internamente para recoger los datos. | |
Ahora un ejemplo de uso para plugins que sabemos que sólo se ejecutan en el back-end, como Classic Editor o Duplicate Post, y que no necesitamos de su carga en el front-end: | |
<?php | |
if(!is_admin()) | |
add_filter( 'option_active_plugins', 'ayudawp_option_active_plugins', 1); | |
function ayudawp_option_active_plugins ( $plugin_list ){ | |
//No cargar en el front-end los plugins que son sólo de uso en el back-end | |
unset( $plugin_list[array_search( 'broken-link-checker/broken-link-checker.php', $plugin_list)]); | |
unset( $plugin_list[array_search( 'classic-editor/classic-editor.php', $plugin_list)]); | |
unset( $plugin_list[array_search( 'duplicate-post/duplicate-post.php', $plugin_list)]); | |
unset( $plugin_list[array_search( 'updraftplus/updraftplus.php', $plugin_list)]); | |
unset( $plugin_list[array_search( 'wp-smushit/wp-smush.php', $plugin_list)]); | |
return $plugin_list; | |
} | |
?> | |
Otro ejemplo de uso donde podemos implementar esta estrategia de carga condicional de plugins es cuando estamos utilizando un entorno de desarrollo, donde necesitamos menos plugins o no son necesarios y queremos ahorrarnos tiempo, y uno de producción, sin necesidad de realizar cambios, compartiendo el código: | |
<?php | |
if(!is_admin()) | |
add_filter( 'option_active_plugins', 'ayudawp_option_active_plugins', 1); | |
function ayudawp_option_active_plugins ( $plugin_list ){ | |
//Carga condicional de plugins por entorno de ejecución | |
if( $_SERVER['HTTP_HOST'] === 'localhost' ) | |
{ | |
$plugins_to_disable = array( | |
'updraftplus/updraftplus.php', | |
'wordpress-seo/wp-seo.php', | |
'wp-smushit/wp-smush.php', | |
'wps-hide-login/wps-hide-login.php'); | |
$plugin_list = array_diff( $plugin_list, $plugins_to_disable ); | |
} | |
return $plugin_list; | |
} | |
?> | |
También podemos aplicar una condición programática de carga para usuarios conectados, por ejemplo no cargando el plugin habitual de condiciones legales para ese caso concreto: | |
<?php | |
if(!is_admin()) | |
add_filter( 'option_active_plugins', 'ayudawp_option_active_plugins', 1); | |
function ayudawp_option_active_plugins ( $plugin_list ){ | |
//Carga condicional de plugin para usuarios conectados | |
require (ABSPATH . WPINC . '/pluggable.php'); | |
//Para usuarios logados | |
if ( is_user_logged_in() ) | |
unset( $plugin_list[array_search( 'cookie-law-info/cookie-law-info.php', $plugin_list)]); | |
return $plugin_list; | |
} | |
?> | |
Y por último, dos trucos que te van a encantar y que te permitirán medir de una manera muy sencilla la velocidad de carga, que se que te encanta, de tu web sin plugins o sin un plugin concreto, sin necesidad de modificar tu instalación ni molestar al usuario. | |
Para el primer caso: | |
<?php | |
if(!is_admin()) | |
add_filter( 'option_active_plugins', 'ayudawp_option_active_plugins', 1); | |
function ayudawp_option_active_plugins ( $plugin_list ){ | |
//Uso: medir el impacto de una URL sin ningún plugin activo | |
//http://example.com/url-2-test/?sinplugins | |
if(isset($_GET['sinplugins'])) | |
return array(); | |
else | |
return $plugin_list; | |
} | |
?> | |
Y si quiero medirlo sólo sin un plugin concreto, tan sencillo como esto: | |
<?php | |
if(!is_admin()) | |
add_filter( 'option_active_plugins', 'ayudawp_option_active_plugins', 1); | |
function ayudawp_option_active_plugins ( $plugin_list ){ | |
//Uso: medir el impacto de una URL sin un plugin concreto (según el índice del listado de activos) | |
//http://example.com/url-2-test/?sinplugins=1 | |
if(isset($_GET['sinplugins'])) | |
unset( $plugin_list[$_GET['sinplugins']] ); | |
return $plugin_list; | |
} | |
?> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment