El problema
Todos hemos estado en una situación como esta, y muchas preguntas en este sitio necesitan una solución como esta. Tienes que actualizar una base de datos, insertar muchos datos automáticamente, convertir meta_keys
o algo similar.
Por supuesto, en un sistema en ejecución basado en las mejores prácticas esto no debería suceder.
Pero mientras lo hace, me encantaría escuchar su solución personal a este problema y por qué eligió la suya.
La pregunta
¿Cómo implementa scripts únicos en su instalación de WordPress (en ejecución)?
El problema aquí se debe principalmente a las siguientes razones:
- Las secuencias de comandos que insertan datos no deben ejecutarse más de una vez
- Los scripts que requieren muchos recursos no deben ejecutarse en un momento en que no se puedan monitorear
- No deben ejecutarse por accidente.
La razón que pido
Tengo mi propia práctica, voy a publicarla en las respuestas. Como no sé si es la mejor solución, me gustaría saber cuál es la suya. Además, esta es una pregunta que se hace muchas veces en el contexto de otras preguntas, y sería genial tener un recurso que recolecte las ideas.
deseando aprender de ti :)
fuente
wp-cron
eventos programados.Respuestas:
Yo mismo uso una combinación de:
Estructura
Uso un archivo (
onetime.php
) en mi carpeta de inclusióninc
, que se incluye en elfunctions.php
, y se elimina de allí después del uso.El archivo para el script en sí
En mi se coloca
onetime.php
mi funciónf711_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:
o
un transitorio
para evitar ejecutar accidentalmente el script más de una vez.
El archivo para ejecutar el script en mi función
f711_my_onetime_function()
se vería así: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
delfunctions.php
, y elimino elonetime.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.fuente
También puedes hacer esto:
ejecutar
onetime.php
y renombrarlo después de la ejecución.fuente
Creé un script Phing de línea de comando para esto, no es nada especial aparte de cargar un script externo para ejecutar. La razón por la que lo usé a través de la CLI es porque:
Entonces puedes usar Phing, o la CLI de PHP y dormir por la noche. El WP-CLI también es una buena alternativa, aunque se me olvida si puede usarlo fuera de la raíz web.
Como esta es una publicación popular, aquí hay un ejemplo del script: https://github.com/wycks/WordPhing (run.php)
fuente
Otra forma bastante sencilla de ejecutar un script de una sola vez es hacerlo mediante un complemento MU.
Coloque el código en algún archivo PHP (p. Ej.
one-time.php
) Que cargue en la carpeta de complementos de MU (de forma predeterminada/wp-content/mu-plugins
), ajuste los permisos del archivo, ejecute el complemento (es decir, de acuerdo con el enlace elegido, básicamente solo tiene que visitar la interfaz / backend), y ya está todo listo.Aquí hay un repetitivo:
Sin los comentarios y esas cosas, se ve así:
fuente
En condiciones ideales, me enviaría al servidor y ejecutaría la función yo mismo usando wp-cli.
Sin embargo, esto a menudo no es posible, por lo que tiendo a establecer una variable $ _GET y la engancho a 'init', por ejemplo:
luego golpear
y deshabilitar el gancho cuando haya terminado.
fuente
A veces utilicé una función enganchada en la desactivación del complemento.
Vea aquí Actualizar enlaces antiguos a enlaces permanentes tipo de publicación personalizada
Una vez que solo los administradores pueden activar los complementos, hay una verificación de capacidad como efecto secundario.
No es necesario eliminar el archivo una vez desactivado, no lo incluirá wordress. Además, si quieres volver a correr, puedes hacerlo. Activando y desactivando nuevamente.
Y a veces utilicé transitorios como en la respuesta de @fischi. Por ejemplo, consulta aquí para crear productos de comercio electrónico a partir de imágenes o aquí elimina / reemplaza etiquetas img en el contenido de la publicación para publicaciones publicadas automáticamente
Una combinación de ambos puede ser una alternativa.
fuente
Definitivamente puedes, solo crea tu código de una vez como un complemento.
¿Problema, cómo activo este complemento sin hacer clic en el enlace Activar?
sólo tiene que añadir
activate_plugins('onetime/index.php');
enfunctions.php
o Use debe usar complementos, http://codex.wordpress.org/Must_Use_Plugins
Intente con diferentes acciones como cuando desea ejecutar el complemento de una vez,
admin_init: después de admin init
init - wordpress init
wp - cuando se carga wordpress
fuente
Otra forma es establecer una opción global wp_option cuando el trabajo está hecho y verificar esa opción cada vez que se ejecuta el enlace de inicio.
Naturalmente, no necesita tener este código para siempre (incluso si se trata de una simple lectura de la base de datos), por lo que probablemente pueda eliminar el código cuando termine el trabajo. También puede cambiar manualmente el valor de esta opción a 0 si necesita volver a ejecutar el código.
fuente
Mi enfoque es un poco diferente en esto. Me gusta agregar mi script de una sola vez como una función en function.php de mi tema y ejecutarlo en una consulta GET específica.
Para ejecutar esto, solo visite la URL "www.sitename.com/?linkupdate"
Esto está funcionando bien para mí hasta ahora ...
¿Este método tiene algún inconveniente? Sólo me preguntaba...
fuente
Solo uso una sola página de plantilla de producto personalizada que no estoy usando y no está conectada a nada en el servidor público.
Por ejemplo
single-testimonial.php
, si tengo una página de testimonios que no está en vivo (en modo borrador, o lo que sea), pero que está conectada a una sola plantilla de página, por ejemplo , puedo colocar funciones allí, cargar la página a través de unpreview
la función o lo que sea lanzado una vez. También es muy fácil hacer modificaciones a la función en caso de depuración.Es realmente fácil y prefiero usarlo
init
porque tengo más control sobre cuándo y cómo se inicia. Solo mi preferencia.fuente
En caso de que ayude, esto es lo que hice y funciona bien:
fuente