 Bueno, por fin, pues aquí tenemos a Fernando García Rebolledo, un desarrollador web especializado en WordPress y trabaja como freelance principalmente, ampliando funcionalidades de plugins ya comerciales o del repositorio de WordPress. Además de programar, le gusta la música que escucha muy alta y contra más disorción mejor. Nos explicará actualizar plugins propios desde un repositorio privado de GitHub. Bueno, y nos contarás qué podemos hacer con las autorizaciones. Bueno, qué tal? Bien, ¿no? Bueno, lo primero dar las gracias a la organización por este evento tan guay que estáis haciendo y saludar, me vais a permitir que saluda a mi hijo que me está viendo en directo. Espero que me esté viendo. Bueno, os voy a explicar un poco qué os voy a contar, ¿vale? Porque al decir el nombre de la charla muchos me habéis preguntado pero qué vas a decir exactamente, qué vas a hacer. Pues lo que os voy a explicar es un poco cómo hago yo para plugins propios, o sea, programados para clientes. Os subo un repositorio de GitHub privado, ¿vale? Y lo que vamos a ver es cómo hacer que, bueno, cuando entres a plugins ya sabéis, ahí actualización tienes un plugin de repositorio y te aparece esa bandita de que tienes una actualización o un plugin premium y te aparece que tienes una actualización o una versión mayor de WooComers, esa no la actualizamos. Vamos a ver un poquito a lo que pasa. Entonces, vamos a ver eso, ¿vale? Bueno, como aquí no me voy a parar mucho, ya me han presentado, soy Fernando, desarrollador Warpes, en ocasiones hago podcas junto con Adrián y nada, ahí me podéis encontrar en Twitter y en mi web, ¿vale? Bien, esto es un disclaimer. Somos programadores, yo creo que todos que estamos aquí un poco somos programadores y lo que os voy a contar es cómo lo hago yo. Ya sabemos que para llegar a un fin en programación no todos seguimos el mismo camino, con lo cual esto es como lo hago yo que podéis hacer de otra forma o no hacerlo, ¿vale? Bien, ¿por qué Github? Yo suelo trabajar con Github y aquí os pongo alguna de las ventajas que podemos tener ahí el precio, es una de ellas, porque básicamente es cero, la versión gratuita de Github nos permite muchas cosas, hasta hace unos años, por ejemplo nos permitía repositorios privados, ahora sí, lo cual es una gran ventaja, tiene una gran comunidad, muchas veces cuando vamos a buscar algo de cómo se hace una cosa, casi acabamos antes, entrando al buscador de Github y seguro que encontramos algún repositorio que nos ayuda, portafolio, también muchas empresas cuando te piden tu usuario de Github, te pachan un vistazo a ver qué es lo que haces y demás, y luego herramientas que tiene, Coco de Space, AlcoPilot, etcétera, ¿vale? Hay alternativas, aquí os pongo un par de ellas, de acuerdo, Github no es la única, ni mucho menos, incluso podemos instalar un Gith en nuestro servidor y funcionar con eso, ¿vale? ¿Cómo podemos aquí puesto interactuar con Github? Es decir, desde otro lado que podemos hacer con Github, por un lado tenemos las Actions y luego la resapi que es lo que os voy a explicar yo, ¿vale? Con las Actions, ahí os pongo que es una integración continua, que básicamente lo que haces cuando pase algo, me vas a hacer estas cosas, ¿vale? Imagina cuando hago un Comet, yo programo en las Actions que de ese Comet que yo hago en la rama Main pues coja y suba por FTP ese código a un cliente, por ejemplo, y luego tenemos con la resapi que con la API interactuamos, con la API de Github que es lo que vamos a ver ahora y con esa API podemos hacer diferentes acciones. Esto es lo que vamos a ver, es decir, ¿cómo conseguir que yo modifique el código en Github en el repositorio mío privado y al cliente le aparezca aquí que tiene una nueva versión, ¿vale? Y que la puedo actualizar, claro. Bien, para hacer esto que necesitamos. Evidentemente una cuenta llega porque si no no podemos seguir. Un repositorio privado donde vamos a ir haciendo los Comet y donde vamos a tener nuestro código y luego vamos a tener que generar lo que se llama es el toque de acceso personal, es decir, una clave que yo le voy a dar a esa API para que yo pueda interactuar con él, ¿vale? De los dos primeros no voy a decir nada, pero sí es para que veáis cómo se crea el toque, que es muy sencillo. Dentro de Github hay donde tenéis el usuario, vais a settings, en la barra vais a developer y simplemente genera un nuevo toque. Y ahí os da, hay una cosa que tiene que es muy interesante y es dar vencimiento al toque, es más, si no das una fecha de vencimiento, el mismo vieja te dice que eso puede ser peligroso, ¿vale? Y luego los permisos. Bueno y al final te da un un string, un texto, madre mía, un texto que es el que copias y lo guardas bien guardadito porque se no se va a poder volver a ver, ¿vale? Te lo da una vez, te lo muestra y se acabó. Bien, pues ya tenemos el toque. Con esto ya vamos a poder llamar a la API de Github con este toque y hacer lo que le hemos dado permisos a este toque que le hemos creado previamente. Bueno, ahí luego compartiré la charla y ahí os dejo pues donde está toda la documentación al respecto. Venga, pues vamos a ver cómo actualizamos nuestro plugin de WordPress. Esto es básicamente cómo funciona. Tenemos el código de nuestro plugin, un repositorio privado y lo que vamos a hacer es decirle a WordPress que compare la versión que tengo instalada en el web con la versión que tengo del plugin en el repositorio y ya simplemente se actualiza desde el administrador. Así que, como decía Linux, vamos a Somy the Code. Bien, nosotros tenemos, perdona si no se ve del todo bien, pero el código es lo que tiene, ¿vale? Tenemos en nuestro plugin, tenemos una cabecera, todos los plugins de WordPress, sabéis que tienen que tener una cabecera o una serie de campos obligatorios como en nombre del plugin, la versión, la descripción que es lo que nos aparece en la bandita de plugins, ¿vale? Y aquí lo que vamos a interactuar digamos es con la versión. Esta versión que hay aquí es la que vamos a comparar con la versión que tenemos en el repos. Básicamente, el plugin, luego también os daré la URL del repositorio para que descarguéis el código y lo echéis un vistazo, ¿vale? Básicamente lo que hace es una configuración donde le doy la URL de mi repositorio y el toque. Esto no lo hagáis así, está fatal. O sea, poner el toque, yo os lo pongo así para que lo veáis, pero vamos a poner el toque en el plugin, no, malo, ¿vale? Entonces, lo que hacemos es eso y llamamos a una clase y llamamos a esta función del updater. Básicamente, no, lo que vamos a hacer es estos cuatro hooks. Vamos a interactuar con estos cuatro hooks. El preside transient update plugins, de este cuando si vais a la documentación vais a ver que hay dos, el plugins y el tema, porque es el mismo filtro, ¿vale? Este el que nos va a permitir es chequear esa versión, ¿vale?, con los transient que tiene WordPress. El siguiente, el HTTP request args, ese es lo que nos va a valer, es para mandar esa petición que hacemos a la API de Github, ahí es donde le metemos el toque, el toque y la URL de nuestra. Luego, el plugin SAPI es el del popup. Cuando vais a actualizar, hay una nueva versión, ver detalles y cuando pinchas en detalles, está un popup y que te está diciendo la nueva versión y los cambios que tiene esa versión, bien, pues lo vamos a hacer con ese filtro. Y por último, en ese último filtro, lo que hacemos es copiarnos los archivos y activar el plugin de nuevo, si es que está activo, ¿vale? Venga. Bueno, esto lo vamos a desgranar un poquito, pero fijaos, no sé si lo veis, pero os lo digo. Aquí lo que hago es cojo la información del repositorio y cojo la información del plugin que está instalado en ese WordPress, ¿vale? Y lo que hago es comparar. Ahora lo vemos en detalle, comparar una versión con otra y si la versión que está arriba es mayor que la que tengo yo abajo, entonces que me saque ahí, que tiene que actualizar, ¿vale? Veis aquí que le paso los datos que he recogido. Estos son los datos que recojo del plugin de la instalación, el GetPlugging.de. Este simplemente coge y lo que hace esto es leer la cabecera, esa que hemos visto al principio y eso me lo trae un objeto. ¿Vale? Y por otro lado, en la otra función que cojo los datos de el repositorio de Jihap, simplemente hago una llamada API con el método Get, le paso ahí el Token y entonces aquí me devuelve los argumentos. ¿Veis? Me devuelve los datos que luego voy a utilizar, sin más. Entonces, hemos visto cómo funciona. Hacemos una modificación nuestro plugin, hacemos un commit, lo subimos y cambiamos el número de versión. Aquí he puesto la versión 1.0.2. Entonces, esto os voy a mostrar cómo, porque esto al final lo que hace es creamos un lanzamiento en Jihap, que os explico aquí ahora cómo hacerlo y lo que me compara es el código que tengo, en la versión que tengo en mi instalación con ese release que he hecho en Jihap. Compara eso. Esto evidentemente os lo muestro así, aunque se puede hacer por consola. Simplemente creamos un release, le damos un número versión 1.02 y ya creamos ese lanzamiento. Así, hemos creado la versión 1.02 en el repositorio de Jihap y en nuestra instalación tenemos la 1.01. Entonces, aquí es donde entra en juego esta función de PHP, que es versión compare, que lo que nos hace es comparar el tag name, que es el nombre que le he dado al tag de Jihap con la versión que tengo en mi plan. Y comparo si es GT, GT es Greater Bang, mayor que. Podéis poner también el simbolito ahí. Entonces, hay una nueva versión, le paso. Simplemente aquí veis que le paso una serie de datos. La nueva versión que tienen Jihap y esto el simbol url es un dato que nos da, nos devuelve la API de Jihap que es la url del zip que se va a descargar. Entonces, con esto ya nos aparece esto en nuestro administrador, ¿de acuerdo? Vale. Ahora entra en juego el filtro S del pop-up. Es decir, aquí, si yo pincho aquí, en ver los detalles, esos detalles que me aparecen en ese pop-up lo hago con esto. Cojo la info del repositorio, cojo la info de mi plugin y aquí voy dando, ha quedado uno de estos elementos de este array, le voy dando lo que yo quiero darle para que le aparezcan el pop-up. Esto es lo que nos aparece. Versión 1.02, que es la que me he traído de Jihap y es la que le he pasado. Es esto ahí, ¿vale? La descripción la coge del plugin y luego en la pestaña de updates. Este texto de aquí es el que coge el repositorio, que es el texto que le he puesto yo en la descripción del release del lanzamiento ese que hemos creado, ¿vale? Y por último, que nos faltaría cogerlo, traerlo, copiarlo donde tiene que estar y activarlo si está activo. Pues eso es lo que hacemos aquí. Lo traemos, lo copiamos y si el plugin está activo, que es otra función que hay por ahí, que nos va a decir si ese plugin estaba activo antes de lo activamos de nuevo y ya está. Y entonces ya actualiza, ¿vale? Seguro. Va a compartir la presentación y el código, ¿vale? Entonces, bueno ahí tenéis el repositor, entonces si me permitís, vamos a ver esto como funciona en directo, ¿vale? Con una que funciona, claro. Entonces mirad, aquí tengo una instalación, el plugin instalado, este plugin es el que os voy a compartir, que no hace nada, ¿vale? O sea, el plugin no hace nada. Y vamos a hacer una cosa, tengo la versión 1.02 aquí y tengo la versión 1.02 en el repositorio, ¿vale? Vamos a cambiar la versión de aquí, vamos a bajarle una versión para que me salte la actualización sobre el papel, tendría que funcionar. Así que vamos a ver. Bueno, ahí está el lado aquí un plugin, esto no lo hagáis sin un adulto, ¿eh? Por favor, este plugin es útil para estas cosas, pero con la supervisión siempre de alguien. Entonces, vamos a entrar al content, vamos a entrar al plugin y vamos a donar, ¿eh? Que es que de... Te falta rodón. ¿Cómo va aquí el botón derecho? Sin ratón, complicado. Bueno, si no un botón de estos tiene que ser el editar. ¿Aquí botón derecho cómo va? Nada, dos de dos. Tienes que pintar. Madre mía. No, te lo has descargado. Bueno, a ver, aquí está el editar, esto se le edita. Para la próxima edición tomaremos nota de tener un ratón a mano. Vale, bueno, ya he conseguido editarle. Perdona, ¿eh? Yo es que soy... Son las cosas del directo. De ratón analógico. Vale, entonces lo que vamos a hacer aquí, voy a coger esto y le voy a decir que es la 1.1, simplemente cambio la cabecera, ¿vale? Y lo voy a guardar. Ahora, si todo va bien, lo que va a hacer es llamar a la API, va a ver que en el repositorio está la 1.02 y que la cabecera de mi plugin me dice que es la 1.01. Vamos a ver. Esto no es inmediato a veces. Bueno, os juro que esto funciona, ¿eh? Os juro que funciona, porque lo he probado antes. Sí, no, pero puede ser. Está quedando muy mal, pero... Bueno, por alguna razón no acaba de tendrá los transient y no acaba de limpiarles, ¿vale? Pero bueno, no voy a seguir intentándolo. Esto funciona, ¿vale? Como santo Tomás nos lo creyó. Y a los de mí, ¿vale? ¿Alguna pregunta? Fernando, tu padre de verdad que sabe lo que hace, ¿eh? Hola, muchas gracias. Yo uso un plugin que se llama WP Software License. Yo uso un plugin que se llama WP Software License, que es algo que integra con WooCommerce para que haces releases e updates para tus clientes. Pero en ese escenario que has mostrado, lo token, lo vas a meter en las opciones del plugin. Aquí hay dos formas de hacerlo. O en base de datos o si no en el config. Ok, pero ese es un escenario en que salas del plugin en clientes o algo, pero que no hay licenciamiento, es solamente los updates. Lo token es siempre visible. Sí, sí, sí. Siempre ves el token en la base de datos. Sí, pero bueno, lo pones un poco más difícil. Quiero decir, por eso si lo metes en el plugin, afinal te lo va a ver cualquiera que entra ahí. Claro. Pero si lo metes o en base de datos o el WP config. En el escenario que yo utilizo con ese plugin que mencionaba, lo token es la license key que es diferente para cada cliente. Para cada cliente. Tú. Es un escenario controlado no de licenciamiento, de venda, es como plugins privados. Sí, y tú puedes crear, yo creo que no hay límites de token para crear. Sí, pero es manual, no vas a ser un para cada cliente. Eso para clarificar que era un escenario de plugin privado en los de venda. Sí, sí, esto es plugin privado para cliente X y es para él. Muchas gracias. Dime, Dime, José. Se escucha, hola, hola. Hola. Se oye, se oye. Muchas gracias por la charla. Más que una pregunta es una reflexión. No, no me broma. Eso no se hace. Sí que es una proposición en primero y después una pregunta, ¿vale? ¿Has pensado en hacerlo como paquete de Composer o algún gestor de dependencia para instalarlo más fácilmente, por ejemplo? Para liberarlo para nosotros me refiero, ¿no? Si yo tuviera que usarlo y una instalación como una dependencia, es más fácil que copiar y pegar la clase que tú nos preparas y la metemos, ¿no? No, porque en realidad esto es como una clase que en mi plugin va a ser base para los clientes, es siempre lo tengo ahí, ¿sabes? Bueno, como va a ser software libre, ¿no? Lo vas a publicar en GitHub. Sí. Entonces otro puede hacerlo como paquete. Tú puedes hacer lo que quieras con ello, ya lo sabes. Y la segunda pregunta era el hooker o el filter que usabas para comprobar, que no ha funcionado, por cierto, para comprobar ese cuando se lanza, supuestamente, el que comprueba la actualización. Ese se lanza, o sea, es el de los transients, dices. Sí, ese. Ese se lanza cuando revisa, no sé cada cuánto es, cuando revisa, ahí está el filtro. Y es el mismo filtro, porque es el mismo proceso que hace WordPress para mirar plugins y para mirarte más. Vale. Y a la última, para comprobar la actualización explicaba que lo que hacía era comparar la versión del tag, que básicamente si es mayor 1.0.2, mayor que 1.0.1, ¿no? Sí. Es como comprobar que haya una actualización nueva. Eso es. Vale, muchas gracias. Eso es. Sí, aquí. Una más. Tenemos una palabra, Breve. Bueno. Yo, por supuesto, que cambiando el hook sirve para themes, ¿no? Cambiando. Cambiando. El avión hook, que era plugin, se ha dicho que era el mismo para themes, ¿no? Sí, sí, guión bajo plugins. ¿Puedes guión bajo themes? Es el mismo. Super, Breve. Bueno, pues muchas gracias. Muchas gracias a todos, ¿eh?