Yo mismo uso una combinación de:
- un archivo dedicado al script de una sola vez
- usando un transitorio para evitar que el script se ejecute accidentalmente más de una vez
- usando la gestión de capacidades o el control de usuario para garantizar que solo ejecute el script.
Estructura
Uso un archivo ( onetime.php
) en mi carpeta de inclusión inc
, que se incluye en el functions.php
, y se elimina de allí después del uso.
include( 'inc/onetime.php' );
El archivo para el script en sí
En mi se coloca onetime.php
mi función f711_my_onetime_function()
. Como podría ser cualquier función. Supongo que su secuencia de comandos se prueba y funciona correctamente.
Para lograr el control sobre la ejecución del script, utilizo ambos
Control de la capacidad
Para evitar que otros usuarios ejecuten accidentalmente mi script:
if ( current_user_can( 'manage_options' ) ) // check for administrator rights
o
if ( get_current_user_id() == 711 ) // check if it is me - I prefer restricting the execution to me, not to all admins.
un transitorio
para evitar ejecutar accidentalmente el script más de una vez.
$transient = 'f711_my_onetime_check';
if ( !get_transient( $transient ) ) // check if the function was not executed.
El archivo para ejecutar el script en mi función f711_my_onetime_function()
se vería así:
$transient = 'f711_my_onetime_check';
if ( get_current_user_id() == 711 && !get_transient( $transient ) ) {
set_transient( $transient, 'locked', 600 ); // lock function for 10 Minutes
add_action( 'wp_footer', 'f711_my_onetime_function' ); // execute my function on the desired hook.
}
function f711_my_onetime_function() {
// all my glorious one-time-magic.
}
La razón por la que configuré el transitorio inmediatamente después de la verificación, si es que existe, es porque quiero que la función se ejecute después de que el script haya sido bloqueado para que no se use dos veces.
Si necesito algún resultado de mi función, lo imprimo como un comentario en el pie de página o, a veces, incluso filtro el contenido.
El tiempo de bloqueo se establece en 10 minutos, pero se puede ajustar a sus necesidades.
Limpiar
Después de la ejecución exitosa de mi script, elimino el include
del functions.php
, y elimino el onetime.php
del servidor. Como utilicé un tiempo de espera para el transitorio, no necesito limpiar la base de datos, pero, por supuesto, también podría eliminar el transitorio después de eliminar el archivo.