Skip to content

Instantly share code, notes, and snippets.

@anibalardid
Last active December 22, 2020 22:00
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save anibalardid/432a6b5fd848521e4d6f48dff9d720ea to your computer and use it in GitHub Desktop.
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
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