<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Archivos de php &#187; Endless Manifesto</title>
	<atom:link href="https://kadai.com.mx/tag/php/feed/" rel="self" type="application/rss+xml" />
	<link></link>
	<description>Un blog personal sobre muchas cosas, en especial videojuegos, descubrimientos y escritos al azar.</description>
	<lastBuildDate>Sun, 26 Apr 2020 07:54:42 +0000</lastBuildDate>
	<language>es</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0</generator>

<image>
	<url>https://kadai.com.mx/wp-content/uploads/2017/08/new-favicon-88x88.png</url>
	<title>Archivos de php &#187; Endless Manifesto</title>
	<link></link>
	<width>32</width>
	<height>32</height>
</image> 
<site xmlns="com-wordpress:feed-additions:1">126519727</site>	<item>
		<title>[Guía] 4 formas de bloquear por país en WordPress</title>
		<link>https://kadai.com.mx/guia-4-formas-de-bloquear-por-pais-en-wordpress/</link>
					<comments>https://kadai.com.mx/guia-4-formas-de-bloquear-por-pais-en-wordpress/#respond</comments>
		
		<dc:creator><![CDATA[Kadai Crosshansen]]></dc:creator>
		<pubDate>Tue, 21 Apr 2020 00:29:00 +0000</pubDate>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[abuseipdb]]></category>
		<category><![CDATA[código]]></category>
		<category><![CDATA[geoip2]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[servidor]]></category>
		<category><![CDATA[wordpress]]></category>
		<guid isPermaLink="false">https://kadai.com.mx/?p=1704</guid>

					<description><![CDATA[<p>A veces es necesario el bloquear por país a los visitantes que llegan a un sitio web. Si tenemos acceso a las herramientas necesarias, podemos hacerlo fácilmente. Ya sea usando un plugin o mediante código. ¿Por qué bloquear por país? Una de las razones más importantes para bloquear países es para evitar ataques de bots. [&#8230;]</p>
<p>The post <a href="https://kadai.com.mx/guia-4-formas-de-bloquear-por-pais-en-wordpress/">[Guía] 4 formas de bloquear por país en WordPress</a> appeared first on <a href="https://kadai.com.mx">Endless Manifesto</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">A veces es necesario el bloquear por país a los visitantes que llegan a un sitio web. Si tenemos acceso a las herramientas necesarias, podemos hacerlo fácilmente.</p>



<p class="wp-block-paragraph">Ya sea usando un plugin o mediante código.</p>



<span id="more-1704"></span>



<h3 class="wp-block-heading">¿Por qué bloquear por país?</h3>



<p class="wp-block-paragraph">Una de las razones más importantes para bloquear países es <strong>para evitar ataques de bots</strong>.</p>



<p class="wp-block-paragraph">Los bots intentan abusar de vulnerabilidades. Buscan por software que no ha sido actualizado. Buscan de cualquier agujero que exista para poder <strong>tomar control de un sitio web</strong>. Por lo cual bloquear ciertos países puede ayudar a <a href="https://dtorrer.com/como-mejorar-la-seguridad-de-wordpress/">mejorar la seguridad</a>.</p>



<p class="wp-block-paragraph">Pero a la vez, también se puede bloquear por país debido a <strong>cuestiones legales</strong>. O simplemente por que no queremos que <strong>nadie de dicho país pueda acceder a ciertos recursos</strong>, como la zona de administración de WordPress.</p>



<p class="wp-block-paragraph">Todas estas son razones válidas. Pero, ¿cómo lo podemos lograr?</p>



<h3 class="wp-block-heading">1. Mediante un plugin</h3>



<p class="wp-block-paragraph">Una de las formas mas sencillas de bloquear por país en WordPress es usando una solución ya desarrollada como un plugin.</p>



<p class="wp-block-paragraph">Existen multiples soluciones como <a href="http://wordpress.org/plugins/iq-block-country/">iQ Block Country</a> o <a href="https://wordpress.org/plugins/ip2location-country-blocker/">IP2Location Country Blocker</a>. En ambos casos, usan bases de datos que provienen de servicios y que hay que descargar.</p>



<p class="wp-block-paragraph">Con ambas soluciones, solo necesitas obtener una cuenta en los servicios que usan y descargar la base de datos apropiada. O en su defecto pagar para acceder a los servicios en línea.</p>



<p class="wp-block-paragraph">Ambos son muy útiles si no existe inconveniente económico. O si no se desea hacer muchos cambios.</p>



<p class="wp-block-paragraph">Sin embargo, existen otras formas de bloquear por país en WordPress.</p>



<h3 class="wp-block-heading">2. Con un CDN como Cloudflare</h3>



<p class="wp-block-paragraph">Si el sitio web en WordPress se encuentra detrás de un CDN como CloudFlare, puedes <strong>fácilmente limitar el acceso a ciertos países</strong> solo agregando un pequeño código al archivo<code> functions.php</code> que usa tu tema o con un plugin a medida.</p>



<p class="wp-block-paragraph">Así, por ejemplo, se puede usar esa característica usando el siguiente código:</p>



			<div class="github-gist-container">
				<script type="text/javascript" class="script-github-gist" src="https://gist.github.com/kadai/bb3b77c7322a1ab37debfdc7e4cf7d1c.js?file=block_with_cloudflare.php"></script>
			</div>
		


<p class="wp-block-paragraph">Con ese pequeño código, se bloquearán todos los clientes que visiten páginas dinámicas y que sean de los<strong> países en la lista «negra»</strong>.</p>



<p class="wp-block-paragraph">Algo muy importante que hay que indicar, es que las soluciones de plugins o de código como el mostrado no funcionarán siempre si hay un <strong>plugin de cache activado</strong>.</p>



<p class="wp-block-paragraph">Esto se debe a que los plugins de cache, en la mayoría de los casos, crean páginas estáticas para enviar en vez de las páginas dinámicas.</p>



<p class="wp-block-paragraph">Debido a esto, el código no se ejecutará. Pero si ese mismo usuario <strong>intenta acceder a la página de login</strong>, entonces sí será bloqueado.</p>



<h3 class="wp-block-heading">3. Mediante una consulta a AbuseIPDB</h3>



<p class="wp-block-paragraph">En una entrada anterior hablé de como agregar la<a href="https://kadai.com.mx/como-agregar-la-lista-negra-de-abuseipdb-al-firewall/"> lista negra de AbuseIPDB</a> a un servidor. Pero dicho servicio ofrece <strong>mucho más que solo la lista negra</strong>.</p>



<p class="wp-block-paragraph">Cuando se consulta una dirección IP a su <a href="https://docs.abuseipdb.com/#check-endpoint">check endpoint</a>, nosotros obtenemos toda una <strong>serie de información del cliente</strong>.</p>



<p class="wp-block-paragraph">Esta información incluye datos como <strong>país de origen</strong> e incluso una calificación de cual probable es que <strong>trate de abusar de algún recurso</strong>.</p>



<p class="wp-block-paragraph">Toda esta información es útil para evitar ataques o incluso fraudes para las tiendas en línea.</p>



<p class="wp-block-paragraph">Así, con el siguiente script, nosotros podemos bloquear a un visitante tanto por su país como por su puntuación (si esta es mayor a 50):</p>



			<div class="github-gist-container">
				<script type="text/javascript" class="script-github-gist" src="https://gist.github.com/kadai/bb3b77c7322a1ab37debfdc7e4cf7d1c.js?file=block_with_abuseipdb.php"></script>
			</div>
		


<p class="wp-block-paragraph">Igualmente, para evitar realizar consultas de forma constante, guarda los resultados en un <a href="https://kadai.com.mx/hooks-y-transients-en-wordpress/">transient de WordPress</a>. Así le generamos la menor molestia a los usuarios legitimos.</p>



<p class="wp-block-paragraph">Pero, como se menciono antes, esto <strong>solo funciona en las páginas dinámicas</strong>. Aquellas que se encuentran servidas por el caché aún pueden ser visitadas por personas de los países bloqueados.</p>



<h3 class="wp-block-heading">4. Bloquear por país usando la base de datos de GeoIP2</h3>



<p class="wp-block-paragraph">MaxMind ofrece la base de datos GeoIP2 Lite de forma gratuita. La cual se puede <a href="https://dev.maxmind.com/geoip/geoip2/geolite2/">descargar desde su sitio web</a> con tan solo registrarse.</p>



<p class="wp-block-paragraph">Igualmente, ellos proporcionan un paquete con el cual se puede acceder a su <a href="https://github.com/maxmind/GeoIP2-php">base de datos usando PHP</a>. Con la cual se vuelve muy sencillo el acceder a los datos.</p>



<p class="wp-block-paragraph">Solo hace falta descargar el <a href="https://github.com/maxmind/GeoIP2-php/releases">archivo phar</a> o usar composer para agregar el proyecto a un plugin. Tras lo cual se puede agregar y usar de la siguiente manera:</p>



			<div class="github-gist-container">
				<script type="text/javascript" class="script-github-gist" src="https://gist.github.com/kadai/bb3b77c7322a1ab37debfdc7e4cf7d1c.js?file=block_with_geoip2.php"></script>
			</div>
		


<p class="wp-block-paragraph">De esta forma, estaríamos usando entonces ya usando la base de datos para bloquear a los visitantes de los países deseados.</p>



<h3 class="wp-block-heading">Plugin de WordPress con GeoIP2</h3>



<p class="wp-block-paragraph">He desarrollado un plugin sencillo, el cual usa la base de datos de GeoIP2 para bloquear a los visitantes de los países seleccionados:</p>



<div class="wp-block-file"><a href="https://kadai.com.mx/wp-content/uploads/2020/04/simple-country-block.zip">simple-country-block</a><a href="https://kadai.com.mx/wp-content/uploads/2020/04/simple-country-block.zip" class="wp-block-file__button" download>Download</a></div>



<p class="wp-block-paragraph">Su uso es extremadamente sencillo y viene tanto en español (España y México) como en ingles.</p>



<p class="wp-block-paragraph">Para usarlo, solo hace falta instalarlo e ir a <strong>Herramientas > Bloquear por país</strong>. Solo debes de tener cuidado de no seleccionar el país en el cual te encuentras, o el sistema podría evitar que ingreses.</p>



<p class="wp-block-paragraph">En caso de encuentres algún problema, puedes ponerte conmigo en contacto.</p>



<h3 class="wp-block-heading">Conclusiones sobre como bloquear por país</h3>



<p class="wp-block-paragraph">Bloquear por país a un visitantes es relativamente sencillo. Aunque se <strong>necesita de herramientas adicionales</strong> para poder obtener la información necesaria para hacerlo.</p>



<p class="wp-block-paragraph">La dirección IP por si misma no aporta esa información. Pero es fácil obtener detalles adicionales si se <strong>cuenta con los recursos necesarios</strong>.</p>



<p class="wp-block-paragraph">Hoy en día prácticamente todo está a un API o Base de Datos de distancia.</p>
<p>The post <a href="https://kadai.com.mx/guia-4-formas-de-bloquear-por-pais-en-wordpress/">[Guía] 4 formas de bloquear por país en WordPress</a> appeared first on <a href="https://kadai.com.mx">Endless Manifesto</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://kadai.com.mx/guia-4-formas-de-bloquear-por-pais-en-wordpress/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1704</post-id>	</item>
		<item>
		<title>Error SIGSEGV en PHP 7.3 [Solución definitiva]</title>
		<link>https://kadai.com.mx/sigsegv-en-php-7-3-soluciones-al-problema/</link>
					<comments>https://kadai.com.mx/sigsegv-en-php-7-3-soluciones-al-problema/#respond</comments>
		
		<dc:creator><![CDATA[Kadai Crosshansen]]></dc:creator>
		<pubDate>Wed, 13 Mar 2019 17:37:38 +0000</pubDate>
				<category><![CDATA[Servidor]]></category>
		<category><![CDATA[apache2]]></category>
		<category><![CDATA[crash]]></category>
		<category><![CDATA[event]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[php-fpm]]></category>
		<category><![CDATA[php7.2]]></category>
		<category><![CDATA[php7.3]]></category>
		<category><![CDATA[prefork]]></category>
		<category><![CDATA[vps]]></category>
		<guid isPermaLink="false">https://kadai.com.mx/?p=1506</guid>

					<description><![CDATA[<p>Recientemente, a principios de Marzo, realice una actualización de PHP 7.2 a PHP 7.3. Sin embargo, lo que iba a ser una actualización sin problemas, pronto comenzó a volverse más complicado. Los errores SIGSEGV en PHP aparecen una mañana Durante unos días libres que tuve, realice una actualización de PHP desde 7.2.12 (aproximadamente) a la [&#8230;]</p>
<p>The post <a href="https://kadai.com.mx/sigsegv-en-php-7-3-soluciones-al-problema/">Error SIGSEGV en PHP 7.3 [Solución definitiva]</a> appeared first on <a href="https://kadai.com.mx">Endless Manifesto</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Recientemente, a principios de Marzo, realice una actualización de PHP 7.2 a PHP 7.3. Sin embargo, lo que iba a ser una actualización sin problemas, pronto comenzó a volverse más complicado.</p>



<span id="more-1506"></span>



<h2 class="wp-block-heading">Los errores SIGSEGV en PHP aparecen una mañana</h2>



<p class="wp-block-paragraph">Durante unos días libres que tuve, realice una actualización de PHP desde 7.2.12 (aproximadamente) a la ultima versión disponible de PHP: 7.3.1</p>



<p class="wp-block-paragraph">Todo salio bien en ese momento. Incluso las cosas funcionaban sin problemas, pero eso cambiaría a la mañana siguiente.</p>



<p class="wp-block-paragraph">Fue entonces cuando este sitio web me arrojo un error 503. Así como otros más en esta VPS corriendo ubuntu.</p>



<p class="wp-block-paragraph">Al revisar en los archivos de errores, en busca de alguna causa, solo encontraba lo siguiente:</p>



<pre class="wp-block-preformatted">(104)Connection reset by peer: [client XX.XX.XX.XX:XXXX] AH01075: Error dispatching request to : <br><br>AH01067: Failed to read FastCGI header</pre>



<p class="wp-block-paragraph">Al mirar más de cerca, resulto que Apache servia contenido estático sin problemas. Solo las páginas generadas por PHP mostraban el error.</p>



<p class="wp-block-paragraph">Cuando revise en los registros de PHP, la siguiente línea aparecía múltiples veces:</p>



<pre class="wp-block-preformatted">WARNING: [pool XXXXX] child XXXX exited on signal 11 (SIGSEGV - core dumped) after 30.977656 seconds from start</pre>



<p class="wp-block-paragraph">Este error de SIGSEGV en PHP significaba que había sucedido una <a rel="noreferrer noopener" aria-label="Violación de Acceso (opens in a new tab)" href="https://es.wikipedia.org/wiki/Violaci%C3%B3n_de_acceso" target="_blank">Violación de Acceso</a> de memoria (<em>segfault o segmentation fault</em>) por parte de PHP.</p>



<p class="wp-block-paragraph">¿Cómo era esto posible? ¿Qué lo estaba causando?</p>



<p class="wp-block-paragraph">Una de las soluciones temporales que encontré fue el usar el siguiente comando:</p>



<pre class="wp-block-preformatted">systemctl restart php7.3-fpm</pre>



<p class="wp-block-paragraph">Pero esta era una solución temporal. Ya que al poco tiempo el problema volvía a suceder. En algunos casos tan pronto como a los pocos segundos.</p>



<p class="wp-block-paragraph">Esto se estaba volviendo una pesadilla.</p>



<h2 class="wp-block-heading">Apache2, prefork y el modulo PHP7.3: ¿Origen del problema?</h2>



<p class="wp-block-paragraph">Durante mi investigación, detecte algo que pase por alto cuando actualice PHP a su versión 7.3: Me había agregado un nuevo módulo y cambiado el modo MPM de Apache.</p>



<p class="wp-block-paragraph">El modo lo podemos ver con el siguiente comando en ubuntu:</p>



<pre class="wp-block-preformatted">apache2ctl -V</pre>



<p class="wp-block-paragraph">¿Eso explicaba el problema?</p>



<p class="wp-block-paragraph">De lo primero que me percate es que ese nuevo módulo, llamado solamente «PHP7.3», necesitaba que Apache2 corriera en modo Prefork.</p>



<p class="wp-block-paragraph">No entendí por que de este movimiento, pero no era el cual había configurado en el servidor: Event.</p>



<p class="wp-block-paragraph">Por lo cual procedí a desactivar PHP7.3 y cambiar Prefork por Event, ejecutando lo siguiente:</p>



<pre class="wp-block-preformatted">sudo a2dismod php7.3<br>sudo a2dismod mpm_prefork<br>sudo a2enmod mpm_event<br>systemctl restart apache2<br>systemctl restart php7.3-fpm</pre>



<p class="wp-block-paragraph">De lo primero que me pude percatar, es que los errores de SIGSEGV en PHP bajaron dramáticamente con esto.</p>



<p class="wp-block-paragraph">Aunque pronto descubriría que estos estaban lejos de desaparecer.</p>



<h2 class="wp-block-heading">El error SIGSEGV en PHP da tregua, pero no por mucho</h2>



<p class="wp-block-paragraph">PHP 7.3 funciono de forma normal por algunos días. Pero eventualmente el error volvió a aparecer.</p>



<p class="wp-block-paragraph">En los registros volvía a ver la señal 11 de SIGSEGV en PHP, lo cual me indicó que el problema tenia muchas posibilidades de seguir apareciendo.</p>



<p class="wp-block-paragraph">Aunque era menos común, esto significaba que podía suceder en cualquier momento.</p>



<p class="wp-block-paragraph">Buscando más a fondo, encontré quizá lo más profundo del origen del problema:</p>



<pre class="wp-block-preformatted">segfault at 6c6f4320 ip b4b92b37 sp bfe93df0 error 4 in opcache.so[b4b82000+6d000]</pre>



<p class="wp-block-paragraph">Por fortuna, comencé a notar que no era el único con este problema. Usuarios del panel Plesk también <a rel="noreferrer noopener" aria-label="reportaron este problema (opens in a new tab)" href="https://talk.plesk.com/threads/php-7-3-fpm-dies-without-a-trace.350761/" target="_blank">reportaron este problema</a>. E incluso dicha empresa <a rel="noreferrer noopener" aria-label="no recomendando PHP7.3 por el momento (opens in a new tab)" href="https://support.plesk.com/hc/en-us/articles/360014718313-Domains-on-Plesk-PHP-7-3-are-down-Service-Unavailable" target="_blank">no está recomendando PHP7.3 por el momento</a>.</p>



<p class="wp-block-paragraph">Lo cual, parece indicar que no hay una solución definitiva por ahora.</p>



<h2 class="wp-block-heading">Entonces, ¿Cómo solucionar las caídas de PHP?</h2>



<p class="wp-block-paragraph">Como comenté antes, PHP constantemente arroja un error segfault o SIGSEGV el cual interrumpe la ejecución de cualquier recurso dinámico.</p>



<p class="wp-block-paragraph">Sin embargo, esto se soluciona cuando se reinicia el servicio. Hacerlo manualmente no es una solución aceptable. Y crear un cronjob no me parece una buena idea.</p>



<p class="wp-block-paragraph">Pero hay <a rel="noreferrer noopener" aria-label="otras alternativas (opens in a new tab)" href="https://serverfault.com/questions/575457/constantly-have-to-reload-php-fpm" target="_blank">alternativas</a> que ya ofrece PHP de forma nativa.</p>



<p class="wp-block-paragraph">Por ejemplo, nosotros podemos editar el archivo php-fpm.conf (ya que es el modo FPM el cual fallaba para mi) y configurar lo siguiente:</p>



<pre class="wp-block-preformatted">/etc/php/7.3/fpm/php-fpm.conf :<br>emergency_restart_threshold = 3<br>emergency_restart_interval = 1h<br>process_control_timeout = 10s</pre>



<p class="wp-block-paragraph">Con esto, hacemos que PHP este al pendiente por errores. Y cuando sucedan 3 errores en una hora, se reiniciará automáticamente.</p>



<p class="wp-block-paragraph">De esta forma, el servicio se restablecerá de forma automática sin necesitar nuestra intervención.</p>



<p class="wp-block-paragraph">Estos valores pueden ser fácilmente cambiados de acuerdo a tus propias necesidades. Solamente recuerda reiniciar el servicio de <em>php-fpm</em> una vez hagas cambios.</p>



<h2 class="wp-block-heading">Para concluir</h2>



<p class="wp-block-paragraph">Si bien actualmente PHP7.3 parece tener problemas con su sistema de cache interno, con las correcciones adecuadas es posible usarlo sin problemas.</p>



<p class="wp-block-paragraph">Pero hay algo muy importante que resaltar. Por ahora es mejor el mantenerse en PHP7.2 o tener múltiples versiones instaladas si es posible.</p>



<p class="wp-block-paragraph">Ya que, a diferencia de la versión más nueva, PHP7.2 está mucho más maduro y este tipo de problemas son mucho más raros.</p>



<p class="wp-block-paragraph">En mi caso, todavía sigo buscando que es lo que causa el error de SIGSEGV en PHP 7.3, y aunque sospecho que puede causarlo&#8230; no tengo una solución definitiva.</p>



<p class="wp-block-paragraph">Lo que si, espero que esta pequeña guía le sea de utilidad a alguien. Ya que encontrar una solución, aunque parcial, fue una búsqueda de varios días.</p>



<h2 class="wp-block-heading">Actualización y solución definitiva</h2>



<p class="wp-block-paragraph">Tras haber estado sufriendo el problema de los errores SIGSEGV por mucho tiempo con PHP 7.3, estos finalmente dejaron e suceder.</p>



<p class="wp-block-paragraph">Sin embargo, la solución puede no ser tan trivial.</p>



<p class="wp-block-paragraph">Resulta que con PHP 7.4, los errores simplemente desaparecieron. He estado observando los registros de PHP de forma continua por este error desde la actualización, pero esta no ha vuelto a suceder.</p>



<p class="wp-block-paragraph">Lo cual me hace pensar que <strong>el problema no esta presente en PHP 7.4</strong>.</p>



<p class="wp-block-paragraph">Si esta dentro de tus posibilidades, actualizar hacia la versión 7.4 de PHP es lo mejor. No solo trae más características si no que es hasta más seguro.</p>



<p class="wp-block-paragraph">En caso de que no sepas como actualizar, pregunta con quien lleva tu hospedaje, este debe de poder ayudarte.</p>
<p>The post <a href="https://kadai.com.mx/sigsegv-en-php-7-3-soluciones-al-problema/">Error SIGSEGV en PHP 7.3 [Solución definitiva]</a> appeared first on <a href="https://kadai.com.mx">Endless Manifesto</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://kadai.com.mx/sigsegv-en-php-7-3-soluciones-al-problema/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1506</post-id>	</item>
		<item>
		<title>Filtros y acciones: Como extender WordPress</title>
		<link>https://kadai.com.mx/como-extender-wordpress-filtros-acciones/</link>
					<comments>https://kadai.com.mx/como-extender-wordpress-filtros-acciones/#respond</comments>
		
		<dc:creator><![CDATA[Kadai Crosshansen]]></dc:creator>
		<pubDate>Thu, 28 Feb 2019 16:57:56 +0000</pubDate>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[actions]]></category>
		<category><![CDATA[extender]]></category>
		<category><![CDATA[filters]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[wordpress]]></category>
		<guid isPermaLink="false">https://kadai.com.mx/?p=1489</guid>

					<description><![CDATA[<p>Extender WordPress usando filtros y acciones es muy fácil. En esta entrada te muestro algunas de las formas de como hacerlo.</p>
<p>The post <a href="https://kadai.com.mx/como-extender-wordpress-filtros-acciones/">Filtros y acciones: Como extender WordPress</a> appeared first on <a href="https://kadai.com.mx">Endless Manifesto</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph" style="text-align:center"><em>(Después de un par de años de estar probando y desarrollando para WordPress, he decidido el volver a <a rel="noreferrer noopener" aria-label="re-escribir el tema de una entrada anterior (opens in a new tab)" href="https://kadai.com.mx/2017/07/01/hooks-y-transients-en-wordpress/" target="_blank">re-escribir sobre un tema de una entrada anterior</a>.)</em></p>



<p class="wp-block-paragraph">Ampliar las funcionalidades de WordPress es realmente sencillo. Como todo framework, aprender como extenderlo puede ser intimidante. Pero una vez que se entiende su funcionamiento, todo se abre paso.</p>



<p class="wp-block-paragraph">Entonces, desarrollar plugins o extender temas en WordPress se vuelve mucho más fácil.</p>



<span id="more-1489"></span>



<h3 class="wp-block-heading">Extender WordPress: Los filtros y acciones son tus amigos</h3>



<p class="wp-block-paragraph">La forma en la cual nosotros podemos agregar nuevas funcionalidades a WordPress es, normalmente, usando los llamados <em>filtros y acciones</em>.</p>



<p class="wp-block-paragraph">Estos también son llamados <em>hooks</em>, o ganchos en español.</p>



<p class="wp-block-paragraph">Los filtros y las acciones son, en esencia, lo mismo. Pero cambian en un aspecto fundamental: <em>Que los filtros regresan datos y que las acciones nos permiten alterar el comportamiento.</em></p>



<p class="wp-block-paragraph">Cada uno de estos <em>hooks</em> posee un nombre único, el cual describe de forma general en donde se encuentra, en que momento se ejecuta o el tipo de datos los cuales puedes cambiar.</p>



<p class="wp-block-paragraph">Para poder usar un filtro o acción, nosotros debemos primero <em>pegarnos</em> a dicho hook. Esto se logra usando las funciones <em><a rel="noreferrer noopener" aria-label=" (opens in a new tab)" href="https://developer.wordpress.org/reference/functions/add_filter/" target="_blank">add_filter</a></em> o <em><a rel="noreferrer noopener" aria-label="add_action (opens in a new tab)" href="https://developer.wordpress.org/reference/functions/add_action/" target="_blank">add_action</a></em> de WordPress.</p>



<p class="wp-block-paragraph">Debemos usar <em>add_filter</em> si nos vamos a adjuntar a un filtro y <em>add_action</em> si se trata de una acción.</p>



<p class="wp-block-paragraph">Con esas funciones, nosotros podemos declarar a cual hook queremos unirnos y cual será el código que queremos que se ejecute.</p>



<p class="wp-block-paragraph">Esta es la forma en la cual lo hacemos:</p>



			<div class="github-gist-container">
				<script type="text/javascript" class="script-github-gist" src="https://gist.github.com/kadai/2499ddc6bff7e0907051b4eff19267c1.js?file=filtro-001.php"></script>
			</div>
		


<p class="wp-block-paragraph">En este ejemplo, adjuntamos una función a los filtros <em>script_loader_src</em> y <em>style_loader_src</em>. Cuando estos filtros se ejecuten, van a pasar un valor que tomará la función como la variable <em>$cadena</em>. La cual a su vez regresará un valor ya modificado.</p>



<p class="wp-block-paragraph">De esta forma, podemos hacer prácticamente cualquier cosa con los datos que reciba nuestro código.</p>



<p class="wp-block-paragraph">Hay que recordar que un filtro normalmente espera que se regrese algún dato. Por lo cual, de no hacerlo, es posible que suceda un comportamiento no esperado.</p>



<h3 class="wp-block-heading">¿Que hay de las acciones?</h3>



<p class="wp-block-paragraph">En el caso de las acciones, las cosas son un poco diferentes.</p>



<p class="wp-block-paragraph">Normalmente, las acciones se usan para agregar un comportamiento dentro de WordPress o un plugin.</p>



<p class="wp-block-paragraph">Las acciones normalmente las usamos para imprimir HTML, agregar estilos o javascript, agregar páginas administrativas, entre otras tareas que no requieran regresar datos.</p>



<p class="wp-block-paragraph">Un ejemplo de esto es la acción <em>wp_enqueue_scripts</em>, con la cual normalmente se agrega todo el Javascript y el CSS que se usará en el Front-end.</p>



			<div class="github-gist-container">
				<script type="text/javascript" class="script-github-gist" src="https://gist.github.com/kadai/2499ddc6bff7e0907051b4eff19267c1.js?file=accion-001.php"></script>
			</div>
		


<p class="wp-block-paragraph">Pero incluso podemos ir más allá al extender WordPress.</p>



<p class="wp-block-paragraph">Por ejemplo, podemos usar la acción <em>admin_menu</em> para crear páginas nuevas dentro del back-end de WordPress con la función <em>add_submenu_page</em>.</p>



			<div class="github-gist-container">
				<script type="text/javascript" class="script-github-gist" src="https://gist.github.com/kadai/2499ddc6bff7e0907051b4eff19267c1.js?file=accion-002.php"></script>
			</div>
		


<h3 class="wp-block-heading">¿Qué hay de las funciones anonimas y clases?</h3>



<p class="wp-block-paragraph">Normalmente el código que nosotros adjuntaremos a los filtros o acciones, para extender WordPress, estarán dentro de una función.</p>



<p class="wp-block-paragraph">Lo que normalmente implica que se deberá de crear una función dedicada totalmente a dicho filtro o acción. Misma que estará disponible para el resto de la aplicación.</p>



<p class="wp-block-paragraph">Una forma de solucionar esto es <em>declarando</em> la función de callback de manera anónima al momento de pegarnos al filtro o acción.</p>



<p class="wp-block-paragraph">Por ejemplo, podemos hacer lo siguiente:</p>



			<div class="github-gist-container">
				<script type="text/javascript" class="script-github-gist" src="https://gist.github.com/kadai/2499ddc6bff7e0907051b4eff19267c1.js?file=annon-001.php"></script>
			</div>
		


<p class="wp-block-paragraph">De esta forma, la función estará solamente disponible para el filtro la cual la invocó.</p>



<p class="wp-block-paragraph">Sin embargo, esto también implica que nuestro código se vuelve poco flexible.</p>



<p class="wp-block-paragraph">Por ejemplo, una ventaja de usar el método tradicional, es que podemos usar <a rel="noreferrer noopener" aria-label="remove_filter (opens in a new tab)" href="https://developer.wordpress.org/reference/functions/remove_filter/" target="_blank"><em>remove_filter</em></a> para quitar código que ya este adjuntado. Algo que no es posible con las funciones anónimas.</p>



<p class="wp-block-paragraph">En el caso de las <em>clases</em>, nosotros debemos de <em>dedicar</em> el método <em>__construct</em> para definir las acciones y filtros que usaremos.</p>



<p class="wp-block-paragraph">Recordando que, al momento de agregar los filtros o acciones, deberemos referenciar la propia clase:</p>



			<div class="github-gist-container">
				<script type="text/javascript" class="script-github-gist" src="https://gist.github.com/kadai/2499ddc6bff7e0907051b4eff19267c1.js?file=class-001.php"></script>
			</div>
		


<h3 class="wp-block-heading">Extiende tus temas o plugins con filtros y acciones</h3>



<p class="wp-block-paragraph">Los filtros y las acciones no son exclusivas del núcleo principal de WordPress, si no que estos pueden ser implementados tanto en temas como en plugins.</p>



<p class="wp-block-paragraph">Con esas definiciones, nosotros podemos saber que datos podemos cambiar de otro software desarrollado para WordPress.</p>



<p class="wp-block-paragraph">Incluso podemos indicarle a otros programadores donde pueden adjuntar funciones para extender la funcionalidad de nuestro software.</p>



<p class="wp-block-paragraph">Por ejemplo, para agregar un filtro a un tema o plugin, solo hace falta agregar algo como esto:</p>



			<div class="github-gist-container">
				<script type="text/javascript" class="script-github-gist" src="https://gist.github.com/kadai/2499ddc6bff7e0907051b4eff19267c1.js?file=applyfilters-001.php"></script>
			</div>
		


<p class="wp-block-paragraph">En este caso se creo un filtro de nombre <em>filtrar_valor</em> con <a rel="noreferrer noopener" aria-label="apply_filters (opens in a new tab)" href="https://developer.wordpress.org/reference/functions/apply_filters/" target="_blank"><em>apply_filters</em></a> al cual se pueden adjuntar otras piezas de software usando la función <em>add_filter</em>.</p>



<p class="wp-block-paragraph">Debido a que se trata de un filtro, debemos asegurarnos de que el resultado sea asignado a una variable. Preferentemente la propia variable filtrada.</p>



<p class="wp-block-paragraph">Pero eso cambia cuando se usa la función <em><a rel="noreferrer noopener" aria-label="do_action (opens in a new tab)" href="https://developer.wordpress.org/reference/functions/do_action/" target="_blank">do_action</a></em>, con la cual definimos acciones. En ese caso no hace falta asignar ningún valor.</p>



			<div class="github-gist-container">
				<script type="text/javascript" class="script-github-gist" src="https://gist.github.com/kadai/2499ddc6bff7e0907051b4eff19267c1.js?file=actions-001.php"></script>
			</div>
		


<h3 class="wp-block-heading">Extender WordPress y plugins: Encuentra esos filtros y acciones</h3>



<p class="wp-block-paragraph">Otra de las cosas que puedes hacer con las funciones <em>apply_filters</em> y <em>do_action</em> es el encontrar donde podemos extender el software.</p>



<p class="wp-block-paragraph"><em>¿Quieres cambiar algo de un plugin pero no sabes donde se puede? ¿Quieres hacer algo pero solo se te ocurre el modificar el original?</em></p>



<p class="wp-block-paragraph">La solución está en buscar por las funciones <em>apply_filters</em> y <em>do_action</em> en el código fuente.</p>



<p class="wp-block-paragraph">Muchos desarrolladores agregan filtros y acciones a sus plugins o temas para permitirle a otros hacer más. Un buen ejemplo de esto es el caso que tuve con <a rel="noreferrer noopener" aria-label="Swift Performance (opens in a new tab)" href="https://kadai.com.mx/2018/10/31/swift-performance-lite-acelera-tu-sitio-web/" target="_blank">Swift Performance</a>.</p>



<p class="wp-block-paragraph">No siempre encontrarás documentación sobre estos hooks, pero ver la función en el contexto de la aplicación te ayudará a entender que es lo que sucede.</p>



			<div class="github-gist-container">
				<script type="text/javascript" class="script-github-gist" src="https://gist.github.com/kadai/2499ddc6bff7e0907051b4eff19267c1.js?file=swift-context.php"></script>
			</div>
		


<p class="wp-block-paragraph">A veces, solo hace falta encontrar el hook correcto en el código para hacer las cosas.</p>



<h3 class="wp-block-heading">Aprende a usar las prioridades y argumentos</h3>



<p class="wp-block-paragraph">Otra de las claves para extender WordPress correctamente es el saber en que momento debemos de ejecutar nuestro código.</p>



<p class="wp-block-paragraph">Tanto <em>add_filter</em> como <em>add_action</em> tienen un parámetro de prioridad, el cual es muy importante para definir correctamente el orden de ejecución.</p>



<p class="wp-block-paragraph">La prioridad está representada en un número, el cual mientras sea más bajo, más tarde se ejecutará el código que queremos. El default es 10.</p>



<p class="wp-block-paragraph">Esta prioridad es de gran ayuda en casos en los cuales queremos hacer algo antes que los demás plugins, por ejemplo.</p>



<p class="wp-block-paragraph">Con una prioridad de 5, podríamos entonces cargar nuestros scripts con la acción <em>wp_enqueue_scripts</em> antes de que otras librerías lo hagan.</p>



			<div class="github-gist-container">
				<script type="text/javascript" class="script-github-gist" src="https://gist.github.com/kadai/2499ddc6bff7e0907051b4eff19267c1.js?file=earlier-001.php"></script>
			</div>
		


<p class="wp-block-paragraph">Pero con una prioridad de 999, nos aseguramos de que todo lo demás ya haya terminado. Por si queremos filtrar los datos que otro plugin cambió, o asegurarnos de que una dependencia ya exista.</p>



<p class="wp-block-paragraph">Finalmente, el último parametro de <em>add_filter</em> o <em>add_action</em> nos permite definir hasta cuantos parametros de entrada vamos a aceptar desde el filtro o acción.</p>



<p class="wp-block-paragraph">Normalmente solo se pasa un parametro. Pero en algunas ocaciones, se pasan más datos desde las funciones <em>apply_filters</em> o <em>do_action</em>.</p>



<p class="wp-block-paragraph">Cuando es así, y queremos usar esos datos, podemos indicarle a WordPress que queremos esos datos:</p>



			<div class="github-gist-container">
				<script type="text/javascript" class="script-github-gist" src="https://gist.github.com/kadai/2499ddc6bff7e0907051b4eff19267c1.js?file=arguments-001.php"></script>
			</div>
		


<h3 class="wp-block-heading">Para cerrar</h3>



<p class="wp-block-paragraph">Como se puede apreciar, el extender WordPress es ralmente sencillo. En especial cuando aprendes a usar y encontrar los puntos en los cuales puedes adjuntar tu propio código.</p>



<p class="wp-block-paragraph">Personalmente, las acciones son las que más oportunidades ofrecen a la hora de personalizar las funciones. En especial por que se disparan en momentos clave.</p>



<p class="wp-block-paragraph">Sin embargo, nosotros podemos personalizar practicamente todo. Solo hace falta ver la <a rel="noreferrer noopener" aria-label="lista de acciones (opens in a new tab)" href="https://codex.wordpress.org/Plugin_API/Action_Reference" target="_blank">lista de acciones</a> y de <a rel="noreferrer noopener" aria-label="filtros (opens in a new tab)" href="https://codex.wordpress.org/Plugin_API/Filter_Reference" target="_blank">filtros</a> disponibles en WordPress.</p>



<p class="wp-block-paragraph">Solo es cuestión de invertir suficiente tiempo en leer el suficiente código e ir probando cual filtro o acción se ajusta  alo que necesitamos.</p>
<p>The post <a href="https://kadai.com.mx/como-extender-wordpress-filtros-acciones/">Filtros y acciones: Como extender WordPress</a> appeared first on <a href="https://kadai.com.mx">Endless Manifesto</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://kadai.com.mx/como-extender-wordpress-filtros-acciones/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1489</post-id>	</item>
		<item>
		<title>Formas de agregar scripts externos a WordPress</title>
		<link>https://kadai.com.mx/agregar-scripts-externos-a-wordpress/</link>
					<comments>https://kadai.com.mx/agregar-scripts-externos-a-wordpress/#respond</comments>
		
		<dc:creator><![CDATA[Kadai Crosshansen]]></dc:creator>
		<pubDate>Tue, 07 Nov 2017 20:52:01 +0000</pubDate>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[cms]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[wordpress]]></category>
		<guid isPermaLink="false">https://kadai.com.mx/?p=1027</guid>

					<description><![CDATA[<p>En algunas ocasiones deberemos agregar scripts externos a WordPress. Suena sencillo, pero cuando no están diseñados para la plataforma, puede ser un poquito complicado. Agregar un script debería de ser fácil. Y así es en la mayoría de los casos. Sin embargo hay ocasiones en las cuales los desarrolladores nunca tuvieron en mente WordPress u [&#8230;]</p>
<p>The post <a href="https://kadai.com.mx/agregar-scripts-externos-a-wordpress/">Formas de agregar scripts externos a WordPress</a> appeared first on <a href="https://kadai.com.mx">Endless Manifesto</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">En algunas ocasiones deberemos agregar scripts externos a WordPress. Suena sencillo, pero cuando no están diseñados para la plataforma, puede ser un poquito complicado.</p>



<span id="more-1027"></span>



<p class="wp-block-paragraph">Agregar un script debería de ser fácil. Y así es en la mayoría de los casos. Sin embargo hay ocasiones en las cuales los desarrolladores nunca tuvieron en mente WordPress u otro CMS.</p>



<p class="wp-block-paragraph">Es por eso que a veces se requiere de saber que tan compatible es un código.</p>



<p class="wp-block-paragraph">Por ejemplo, el siguiente es uno que alguien quería incluir en una instalación de WordPress:</p>



<figure class="wp-block-embed"><div class="wp-block-embed__wrapper">
View the code on <a href="https://gist.github.com/kadai/0ef4efc69bbd8e4fa8d60d4593fa06f9">Gist</a>.
</div></figure>



<p class="wp-block-paragraph">Parece simple, ¿verdad?</p>



<p class="wp-block-paragraph">Pero al menos hay un problema evidente: Se necesita de jQuery para poder hacerlo, eso nos dice la primera línea.</p>



<p class="wp-block-paragraph">Antes de siquiera agregar este código, es importante el tener al menos una idea de lo que hace y sus necesidades. Podemos ver tutoriales en la Internet, pero sin tener una idea será difícil el encontrar una solución real.</p>



<p class="wp-block-paragraph">Si no tenemos dicha noción, no podremos agregar scripts externos a WordPress de una forma rápida y eficiente.</p>



<h2 class="wp-block-heading">Solucionando el problema de agregar scripts externos a WordPress</h2>



<p class="wp-block-paragraph">Existen muchas formas de agregar un script en WordPress, sin embargo para este ejemplo hay que tomar ciertas consideraciones. Por ejemplo que la versión de jQuery que se usa en <a href="https://digwp.com/2011/09/using-instead-of-jquery-in-wordpress/" target="_blank" rel="nofollow noopener noreferrer">WordPress es diferente</a>.</p>



<p class="wp-block-paragraph">El jQuery que está instalado viene en modo de compatibilidad. Por lo cual el símbolo “$” no va a funcionar por defecto. Si el código no fue escrito para funcionar bajo dicho modo, es decir cambiando “$” por jQuery, simplemente este arrojará errores.</p>



<p class="wp-block-paragraph">Es por ello que se necesita modificar una función alrededor del código para hacerlo funcionar. Debería quedar así:</p>



<figure class="wp-block-embed"><div class="wp-block-embed__wrapper">
View the code on <a href="https://gist.github.com/kadai/0ef4efc69bbd8e4fa8d60d4593fa06f9">Gist</a>.
</div></figure>



<p class="wp-block-paragraph">De esta forma, debería de poder correr en cualquier instalación estándar de WordPress con el jQuery incluido por defecto. Solo se le hicieron algunos pequeños cambios a la función anónima para permitir usar “$” al resto del código dentro de ella.</p>



<p class="wp-block-paragraph">Este segmento de código puede ser entonces agregado de múltiples formas, dependiendo de las necesidades. En cualquier caso, debe de ser agregado al footer.</p>



<h3 class="wp-block-heading">1. Agregarlo directamente mediante un widget</h3>



<p class="wp-block-paragraph">Esta puede ser la forma más sencilla de agregar el código, pero con el inminente riesgo de que no funcione. Al menos no a la primera.</p>



<p class="wp-block-paragraph">Pero eso se puede resolver si le añadimos una función que espere a que el documento esté listo. De esta manera el script se ejecutará una vez que el documento web se haya cargado por completo.</p>



<p class="wp-block-paragraph">De esta forma, en el widget de HTML se podría poner lo siguiente:</p>



<figure class="wp-block-embed"><div class="wp-block-embed__wrapper">
View the code on <a href="https://gist.github.com/kadai/0ef4efc69bbd8e4fa8d60d4593fa06f9">Gist</a>.
</div></figure>



<p class="wp-block-paragraph">No parece complicado. Además de que se puede editar directamente desde la interface web.</p>



<h3 class="wp-block-heading">2. Agregarlo mediante un hook y función</h3>



<p class="wp-block-paragraph">Usando una función y el hook “wp_footer” podemos agregar el código que queramos al final de la página. Este código lo debemos de pegar dentro del functions.php o similar.</p>



<figure class="wp-block-embed"><div class="wp-block-embed__wrapper">
View the code on <a href="https://gist.github.com/kadai/0ef4efc69bbd8e4fa8d60d4593fa06f9">Gist</a>.
</div></figure>



<p class="wp-block-paragraph">Gracias a esto, el código deberá de aparecer en la zona de pie de página. No es la forma ideal pero debería de funcionar relativamente bien. Aunque imprimir código así no es la forma más elegante de resolverlo.</p>



<h3 class="wp-block-heading">3. Agregarlo correctamente mediante wp_enqueue_script</h3>



<p class="wp-block-paragraph">Esta es la <a href="https://developer.wordpress.org/reference/functions/wp_enqueue_script/" target="_blank" rel="nofollow noopener noreferrer">forma correcta</a> de agregar un script jQuery, ya que incluso permite que se pueda “optimizar”. Usar correctamente el hook wp_enqueue_scripts permite hacer muchas cosas a la hora de manipular los script a agregarse.</p>



<figure class="wp-block-embed"><div class="wp-block-embed__wrapper">
View the code on <a href="https://gist.github.com/kadai/0ef4efc69bbd8e4fa8d60d4593fa06f9">Gist</a>.
</div></figure>



<p class="wp-block-paragraph">Así es, esto es todo lo que se tiene que hacer para agregarlo. Con ello el script será incluido en el front-end para los visitantes, además de que podrá ser optimizado por los plugins de caché disponibles.</p>



<p class="wp-block-paragraph">Pero para que funcione se debe de crear un archivo *.js y almacenarlo en un lugar accesible dentro del servidor web. O en su defecto se puede aportar una dirección URL completa.</p>



<p class="wp-block-paragraph">Este método también permite convertir el código fácilmente en un plugin. Lo cual puede facilitar la vida a la hora de realizar actualizaciones. Permitiendo así mantener menos código.</p>



<h3 class="wp-block-heading">¿Qué hay de los plugins para agregar scripts a WordPress?</h3>



<p class="wp-block-paragraph">Otra de las formas para agregar scripts externos a WordPress es el usar un plugin que facilite el trabajo. Hay muchos de ellos en <a href="https://es-mx.wordpress.org/plugins/tags/custom-js/" target="_blank" rel="noopener nofollow noreferrer">el repositorio</a> que permiten hacerlo. La mayoría con diversas opciones diferentes para cada caso.</p>



<p class="wp-block-paragraph">Sin embargo, los plugins no siempre solucionan el problema. El cual se agrava si no sabemos como es que JavaScript funciona. Y aún más si no se sabe detectar errores.</p>



<p class="wp-block-paragraph">Un script puede ser agregado mediante un plugin correctamente. Pero a la hora de ejecutarse, puede arrojar errores. Mismos que impiden su correcta ejecución. Estos errores muchas veces van más allá de lo que un plugin puede solucionar.</p>



<p class="wp-block-paragraph">En esos casos, es importante mirar entonces a la consola del navegador. Muchas veces encontraremos ahí que es lo que está sucediendo. Como por ejemplo el caso de la «$» de jQuery, la cual ya había explicado. O incluso otros errores como contenido mixto o errores en el código.</p>



<p class="wp-block-paragraph">Esas son cosas que requieren más pericia para ser corregidas.</p>



<h3 class="wp-block-heading">Conclusiones sobre agregar scripts externos a WordPress</h3>



<p class="wp-block-paragraph">Agregar scripts de jQuery es relativamente sencillo en WordPress. Sin embargo se deben de tener ciertas nociones para evitar problemas.</p>



<p class="wp-block-paragraph">En el caso de que algo suceda, siempre es bueno mirar la consola que ofrece el navegador web. Siempre nos dará pistas sobre lo que puede estar pasando. Para el desarrollador, la consola será siempre una de las mejores herramientas.</p>



<p class="wp-block-paragraph">Además hay que recordar que la versión de jQuery que se incluye previene el uso de “$” en las funciones. Por lo cual hay que encapsular el código si nos muestra ese tipo de errores.</p>



<p class="wp-block-paragraph">Y cuando todo haya fallado. Siempre será buena idea preguntar. Ya que puede haber alguien dispuesto a ayudar.</p>
<p>The post <a href="https://kadai.com.mx/agregar-scripts-externos-a-wordpress/">Formas de agregar scripts externos a WordPress</a> appeared first on <a href="https://kadai.com.mx">Endless Manifesto</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://kadai.com.mx/agregar-scripts-externos-a-wordpress/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1027</post-id>	</item>
		<item>
		<title>Hooks y Transients en WordPress</title>
		<link>https://kadai.com.mx/hooks-y-transients-en-wordpress/</link>
					<comments>https://kadai.com.mx/hooks-y-transients-en-wordpress/#respond</comments>
		
		<dc:creator><![CDATA[Kadai Crosshansen]]></dc:creator>
		<pubDate>Sat, 01 Jul 2017 09:14:59 +0000</pubDate>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[cms]]></category>
		<category><![CDATA[hook]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[transient]]></category>
		<category><![CDATA[wordpress]]></category>
		<guid isPermaLink="false">https://kadai.com.mx/?p=640</guid>

					<description><![CDATA[<p>Los hooks y transients en WordPress son fáciles. Una vez que tienes una idea de donde mirar. De lo contrario estarás dando vueltas sin parar tratando de saber que son y que hacen. Saber PHP es algo que invariablemente te va a ayudar. Igualmente mirar el Codex de WordPress… pero al final del día, muchas [&#8230;]</p>
<p>The post <a href="https://kadai.com.mx/hooks-y-transients-en-wordpress/">Hooks y Transients en WordPress</a> appeared first on <a href="https://kadai.com.mx">Endless Manifesto</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p style="text-align: justify;">Los hooks y transients en WordPress son fáciles. Una vez que tienes una idea de donde mirar. De lo contrario estarás dando vueltas sin parar tratando de saber que son y que hacen.</p>
<p style="text-align: justify;">Saber PHP es algo que invariablemente te va a ayudar. Igualmente mirar el <a href="https://codex.wordpress.org/Plugin_API/Hooks" target="_blank" rel="noopener">Codex de WordPress</a>… pero al final del día, muchas cosas se condensan en una sola frase: Mira el código fuente.</p>
<p><span id="more-640"></span></p>
<h3>Entendiendo los Hooks y Transients en WordPress</h3>
<p style="text-align: justify;">Hay quienes han hecho un <a href="http://rachievee.com/the-wordpress-hooks-firing-sequence/" target="_blank" rel="noopener">esfuerzo para documentar</a> que hooks se usan y en que momento. Incluso puedes encontrar <a href="http://www.wpbeginner.com/wp-tutorials/how-wordpress-actually-works-behind-the-scenes-infographic/?display=wide" target="_blank" rel="noopener">infografías muy buenas</a> que te dan una guía visual. Eso da mucha luz, pero siempre quedará la duda en algunos casos.</p>
<h3 class="western">¿Qué es un hook o gancho?</h3>
<p style="text-align: justify;">Para ponerlo en palabras simples, es un punto en el cual vamos a “adjuntar el código que queramos”. ¿Eh? Sí. Básicamente llegamos y pegamos el código que queremos en el lugar al cual queremos.</p>
<p style="text-align: justify;">Existen dos formas de hacerlo: Como filtro o como acción. Pero no te enredes con los términos, ya que su diferencia es prácticamente semántica. ¿Por qué? Porque la función para agregar acciones es un <a href="https://developer.wordpress.org/reference/functions/add_action/" target="_blank" rel="noopener">alias de la misma para agregar filtros</a>.</p>
<p style="text-align: justify;">Pero eso no significa que debas intercambiarlas a placer. Si cambias información, usa “add_filter”. Si cambias el comportamiento usa “add_action”. A la larga tu código se entenderá mejor.</p>
<h4>Un ejemplo</h4>
<p style="text-align: justify;">Por ejemplo, la forma más fácil “pegar” código es con un tema y una función. Digamos que tenemos el archivo functions.php y que queremos probar los hooks. Por ejemplo, iniciaríamos con esto:</p>
<p>View the code on <a href="https://gist.github.com/kadai/b313e77a46c72be6b569bab3e72ff51c">Gist</a>.</p>
<p style="text-align: justify;">Una vez que tengamos la función, la magia empieza cuando agregamos “add_filter”:</p>
<p>View the code on <a href="https://gist.github.com/kadai/b313e77a46c72be6b569bab3e72ff51c">Gist</a>.</p>
<p style="text-align: justify;">Con ella, le decimos a WordPress que ejecute nuestra función (agregada como filtro) cuando le toque al hook indicado. En este caso, use uno arbitrario. Es muy probable que no funcione para nada.</p>
<p style="text-align: justify;">Hasta ahí todo bien con el ejemplo. ¿Entonces como saber donde debo agregarla para que se ejecute? Aquí es donde las cosas se complican un montón y es importante mirar el código.</p>
<p style="text-align: justify;">Como mencione en una <a href="https://kadai.com.mx/2017/06/26/modificando-top-posts-de-jetpack/" target="_blank" rel="noopener">entrada anterior</a>, tuve que mirar el código para darme una idea. En ese caso, estuve buscando la función “do_action”. ¿Por qué? Porque ella es la que da la pauta de donde se van a realizar los cambios.</p>
<p style="text-align: justify;">De esa forma sabemos exactamente en donde se va a “pegar” el código que queremos. Pero ten en cuenta que no podrás cambiar nada antes de ese punto (ni después, a menos que haya otro hook que te lo permita).</p>
<p style="text-align: justify;">El ejemplo simple quedaría así para que funcione:</p>
<p>View the code on <a href="https://gist.github.com/kadai/b313e77a46c72be6b569bab3e72ff51c">Gist</a>.</p>
<p style="text-align: justify;">Igualmente buscando y mirando el uso de “<a href="https://developer.wordpress.org/reference/functions/do_action/" target="_blank" rel="noopener">do_action</a>” y “<a href="https://developer.wordpress.org/reference/functions/apply_filters/" target="_blank" rel="noopener">apply_filters</a>”, obtendrás el nombre del hook el cual tienes que usar y que “variables” le pasará. Con ello tendrás el 90% del trabajo hecho.</p>
<p style="text-align: justify;">Aunque google será tu amigo por un buen rato.</p>
<p style="text-align: justify;">Recuerda, podemos agregar cuantas funciones queramos a un hook. Por ejemplo, con varios “add_filter” en diferentes momentos con diferentes funciones. Incluso podemos indicar en que orden se ejecutarán.</p>
<h3 class="western">¿Qué hay de los transients?</h3>
<p style="text-align: justify;">Para hacer la historia corta con ellos, se <a href="https://codex.wordpress.org/Transients_API" target="_blank" rel="noopener">trata básicamente</a> de “variables”. Imagina que son como “cookies” o “sesiones”. Pero en vez de afectar a un solo usuario, podemos usar su contenido para todo el sitio. Son usadas especialmente para guardar consultas complejas.</p>
<p>Por ejemplo, aquí tengo el siguiente ejemplo:</p>
<p>View the code on <a href="https://gist.github.com/kadai/b313e77a46c72be6b569bab3e72ff51c">Gist</a>.</p>
<p style="text-align: justify;">Eso se lo agregué a un tema para hacer “algo” una vez al día.</p>
<p style="text-align: justify;">La gran ventaja, es que podemos recuperar el valor de un transitent fácilmente con “<a href="https://codex.wordpress.org/Function_Reference/get_transient" target="_blank" rel="noopener">get_transient</a>”. Solo necesitas el nombre y listo. Pero ojo, si este ya se encuentra expirado no regresará valor alguno. Esa es su naturaleza, temporal. No es buena idea usarlos para información permanente.</p>
<p style="text-align: justify;">¿Por que expiran? Bueno, es una de sus características. Cuando asignamos su valor con “<a href="https://codex.wordpress.org/Function_Reference/set_transient" target="_blank" rel="noopener">set_transient</a>”, debemos de definir un tiempo tras el cual expirará (ok, podemos asignar “0” o no asignar nada para que jamás expiren, pero esa es otra historia… no deben de ser usados para almacenar información permanente).</p>
<p style="text-align: justify;">Igualmente pueden ser fácilmente borrados con “<a href="https://codex.wordpress.org/Function_Reference/delete_transient" target="_blank" rel="noopener">delete_transient</a>”, si queremos deshacernos de ellos antes de que expiren.</p>
<p style="text-align: justify;">Estos son más fáciles de usar, pero abren un nuevo universo de posibilidades.</p>
<h3 class="western">Conclusión sobre los Hooks y Transients en WordPress</h3>
<p style="text-align: justify;">He estado invirtiendo el tiempo que puedo para poder entender de fondo todas las características que tiene WordPress.</p>
<p style="text-align: justify;">PHP me ha ayudado mucho, aunque me he topado con muchas entradas en blogs que dan por sentado que ya sabes como funciona lo expuesto aquí. Eso puede frustrar un poco, ya que a veces no se entiende el contexto.</p>
<p style="text-align: justify;">Quizá sea idea tomar un curso que me facilite el camino. Solo es cuestión de hacerme del tiempo.</p>
<p>The post <a href="https://kadai.com.mx/hooks-y-transients-en-wordpress/">Hooks y Transients en WordPress</a> appeared first on <a href="https://kadai.com.mx">Endless Manifesto</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://kadai.com.mx/hooks-y-transients-en-wordpress/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">640</post-id>	</item>
		<item>
		<title>Modificando Top Posts de Jetpack</title>
		<link>https://kadai.com.mx/modificando-top-posts-de-jetpack/</link>
					<comments>https://kadai.com.mx/modificando-top-posts-de-jetpack/#respond</comments>
		
		<dc:creator><![CDATA[Kadai Crosshansen]]></dc:creator>
		<pubDate>Mon, 26 Jun 2017 06:22:12 +0000</pubDate>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[jetpack]]></category>
		<category><![CDATA[personalización]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[wordpress]]></category>
		<guid isPermaLink="false">https://kadai.com.mx/?p=563</guid>

					<description><![CDATA[<p>Modificar el widget de Top Posts de Jetpack es algo realmente sencillo. En especial por lo fácil que es hacer muchas modificaciones a WordPress gracias a sus hooks. Para quienes no lo sepan, un hook es básicamente un punto en el cual nos podemos colgar para realizar una acción. Normalmente una función. En mi caso, [&#8230;]</p>
<p>The post <a href="https://kadai.com.mx/modificando-top-posts-de-jetpack/">Modificando Top Posts de Jetpack</a> appeared first on <a href="https://kadai.com.mx">Endless Manifesto</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p style="text-align: justify;">Modificar el widget de Top Posts de Jetpack es algo realmente sencillo. En especial por lo fácil que es hacer muchas modificaciones a WordPress gracias a sus hooks.</p>
<p style="text-align: justify;">Para quienes no lo sepan, un hook es básicamente un punto en el cual nos podemos colgar para realizar una acción. Normalmente una función.</p>
<p style="text-align: justify;">En mi caso, yo necesitaba cambiar la apariencia de widget “Top Posts” de Jetpack.</p>
<p><span id="more-563"></span></p>
<p style="text-align: justify;">Ya que el mismo no tiene forma de cambiar la forma en el cual se muestran las entradas. Y menos para cambiar el tiempo a considerar.</p>
<p style="text-align: justify;">El objetivo es que se pareciera lo más posible al de “Entradas Recientes”.</p>
<h3>Primero, investigamos</h3>
<p style="text-align: justify;">Después de estar revisando durante un buen rato, <a href="https://jetpack.com/2016/01/12/hooks-customize-top-posts-pages-widget/" target="_blank" rel="noopener">encuentre parte de mi solución</a> en el sitio oficial de Jetpack.</p>
<p style="text-align: justify;">En ella, simplemente debo de adjuntar dos funciones al archivo “functions.php” de mi tema. Una vez hecho el tema hijo, agrego los segmentos y ya tengo la primera parte del problema resuelto.</p>
<p style="text-align: justify;">Con el hook “<em>jetpack_top_posts_days</em>” nosotros podemos modificar el número de días que se han de considerar para generar las entradas más populares.</p>
<p style="text-align: justify;">Mientras que con “<em>jetpack_widget_top_posts_after_post</em>” podemos agregar cualquier dato que queramos. En este, igualmente aprovecho para agregar la fecha, aunque descubro que no puedo cambiar los tags del nombre de la entrada. Lastima, eso significa que una parte de la solución va a tener que ser puro CSS.</p>
<p>Termine agregando las siguientes funciones:</p>
<p>View the code on <a href="https://gist.github.com/kadai/014357ee5bbc8f0bf0607378d677374c">Gist</a>.</p>
<p>Le agregue la clase «widgets-list-layout-links» al «Div» para que pudiéramos cambiar su apariencia vía CSS.</p>
<h3>Escarbamos más dentro de Top Posts de Jetpack</h3>
<p style="text-align: justify;">Una de las grandes ventajas del Open Source es que podemos mirar el código fuente de las aplicaciones que queramos. En mi caso, encontré el <a href="https://github.com/Automattic/jetpack/blob/3.8.2/modules/widgets/top-posts.php" target="_blank" rel="noopener">código fuente del widget</a> que quería. Pero, no encontré una forma de como cambiar el tamaño de las imágenes mostradas. Ni tampoco de como evitar que use el servicio Phonon.</p>
<p style="text-align: justify;">Posiblemente hay alguna forma de evitar lo último, pero por ahora ese no era un tema de alta prioridad.</p>
<p style="text-align: justify;">Por fortuna, veo que “<em>jetpack_top_posts_widget_image_options</em>” es lo que necesito para solucionar mi problema con los tamaños de la imagen.</p>
<p style="text-align: justify;">Las imágenes aparecían con un tamaño de 40px, pero las necesitaba en al menos 150px para que se vieran “decentes”.</p>
<p style="text-align: justify;">Tras escarbar un poco en que datos le pasaba a mi función, simplemente hago lo siguiente:</p>
<p>View the code on <a href="https://gist.github.com/kadai/b3def575604211b9e93cb926566bd8c4">Gist</a>.</p>
<p>Así es, simplemente sobre-escribo lo que tenga el array y ya estamos. Al menos con PHP.</p>
<h3>Estilizando Top Posts de Jetpack con CSS</h3>
<p style="text-align: justify;">Imitar la apariencia en el widget Top Posts de Jetpack fue un tanto especial.</p>
<p style="text-align: justify;">Tuve que usar mucho el Inspector de código de Google Chrome para darme una idea de donde se estaban estilizando las cosas.</p>
<p style="text-align: justify;">El primer gran problema era que Top Posts usa “divs” internos. Por lo cual ordenar el contenido podía ser un poco difícil. Esto por que el tema original lo hacia diferente.</p>
<p style="text-align: justify;">Pero con esto lo logré:</p>
<p>View the code on <a href="https://gist.github.com/kadai/0d68fef74055ef7b494a7e2295106bc5">Gist</a>.</p>
<p>Con este segmento, cambio la apariencia del icono mostrado para los Top Posts.</p>
<p style="text-align: justify;">Mientras que no soy fan del <em>!important</em>, parece ser la única manera en la cual se aplicaba el cambio en su tamaño. Todavía tenia que mover el texto adjunto un poco y darle mejor apariencia.</p>
<p>View the code on <a href="https://gist.github.com/kadai/c64bdf1b23db148e62746e191387f71f">Gist</a>.</p>
<p style="text-align: justify;">Con estos ya estamos casi listos. Esto cambia la apariencia de los enlaces en el interior del espacio del widget de Top Posts. Cambiamos la fuente, así como el espacio, el color y el comportamiento cuando pasamos el ratón sobre ellos.</p>
<p style="text-align: justify;">Incluso pegamos un poco más el texto a la imagen, para darle una mejor consistencia.</p>
<p>View the code on <a href="https://gist.github.com/kadai/477d643614a586527c85bb4eed469fc7">Gist</a>.</p>
<p style="text-align: justify;">Y con esto cambiamos la apariencia de la fecha mostrada. La hacemos más pequeña y cambiamos su color. Para que se parezca lo más posible al original.</p>
<h3>Conclusión</h3>
<p style="text-align: justify;">Los cambios en el CSS mostrados aplican solamente al tema que uso actualmente, “Lovecraft”. Diferentes temas tendrán diferentes aspectos que deberás de cambiar para que se vean de la forma en la cual necesitas.</p>
<p style="text-align: justify;">En mi caso, solo era emular. Y aun así tuve que meter mano para realizar varios cambios.</p>
<p style="text-align: justify;">Lo que si me quedo claro, es que siempre será mejor el crear un tema hijo. Aun cuando no juguemos con el código HTML o PHP del tema.</p>
<p style="text-align: justify;">¿Esto por qué? Ya que no sabemos en que momento vamos a necesitar hacer cambios a la apariencia que requieran de hacer uso de un tema hijo. De esa forma ya estamos preparados de antemano.</p>
<p style="text-align: justify;">Si bien existen formas de agregar el código mediante plugins, para mi es mejor hacerlo directamente en el tema.</p>
<p style="text-align: justify;">Aunque bueno… los cambios hechos igual podrían agregarse como un plugin, eventualmente. Esa es la gran flexibilidad que WordPress da.</p>
<p>The post <a href="https://kadai.com.mx/modificando-top-posts-de-jetpack/">Modificando Top Posts de Jetpack</a> appeared first on <a href="https://kadai.com.mx">Endless Manifesto</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://kadai.com.mx/modificando-top-posts-de-jetpack/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">563</post-id>	</item>
		<item>
		<title>[Función] Código PHP: imagecreatefrombmp</title>
		<link>https://kadai.com.mx/codigo-php-imagecreatefrombmp/</link>
					<comments>https://kadai.com.mx/codigo-php-imagecreatefrombmp/#respond</comments>
		
		<dc:creator><![CDATA[Kadai Crosshansen]]></dc:creator>
		<pubDate>Tue, 20 Jun 2017 19:22:43 +0000</pubDate>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[function]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[spanish]]></category>
		<guid isPermaLink="false">https://kadai.com.mx/?p=492</guid>

					<description><![CDATA[<p>Escribir código siempre tiene sus pros y contras. Entre las cosas que se aprenden es a mirar a otros lados a ver si ya existe alguien que haya solucionado un problema similar al que tengas. Revisando código «viejo», es que me encontré con una pequeña función que ciertamente me ayudó a sacarme de apuros en algún [&#8230;]</p>
<p>The post <a href="https://kadai.com.mx/codigo-php-imagecreatefrombmp/">[Función] Código PHP: imagecreatefrombmp</a> appeared first on <a href="https://kadai.com.mx">Endless Manifesto</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p style="text-align: justify;">Escribir código siempre tiene sus pros y contras. Entre las cosas que se aprenden es a mirar a otros lados a ver si ya existe alguien que haya solucionado un problema similar al que tengas.</p>
<p style="text-align: justify;">Revisando código «viejo», es que me encontré con una pequeña función que ciertamente me ayudó a sacarme de apuros en algún momento. Se trata de la función <em>imagecreatefrombmp</em>.</p>
<p><span id="more-492"></span></p>
<p style="text-align: justify;">Para quienes hayan manejado imágenes en PHP 5, ya sabrán lo horrible que es lidiar con archivos BMP.</p>
<p style="text-align: justify;">La necesidad de usarla nace debido a los propios usuarios del sistema. No les interesaba guardar las imágenes en un formato diferente al BMP o simplemente no sabían como hacerlo.</p>
<p style="text-align: justify;">¿Qué es más fácil entonces? ¿Amansar al burro o adaptarte al burro?</p>
<h3>El código de la función imagecreatefrombmp</h3>
<p style="text-align: justify;">Ciertamente tome el camino de adaptarme, probé muchas cosas hasta que encontré <a href="https://stackoverflow.com/questions/1586094/convert-bitmap-files-into-jpeg-using-the-gd-library-in-php" target="_blank" rel="noopener noreferrer">esta solución</a> bastante creativa:</p>
<p>View the code on <a href="https://gist.github.com/kadai/f105525043426e23fd351a1506cd33bd">Gist</a>.</p>
<p style="text-align: justify;">En pocas palabras: Esa función abre la imagen, la «descomprime» y luego lee los datos para crear un lienzo en PHP que se pueda usar.</p>
<p style="text-align: justify;">¿Pero por qué se necesita tanto? Sencillo, PHP no soporta las imágenes BMP. Al menos no hasta que<a href="http://php.net/manual/en/function.imagecreatefrombmp.php" target="_blank" rel="noopener noreferrer"> PHP 7.2 esté disponible</a>.</p>
<h3>Cerrando sobre función imagecreatefrombmp</h3>
<p style="text-align: justify;">Si bien esta solución no es perfecta, ya que cada imagen toma mucho tiempo en ser procesada, si ayuda mucho en lograr el objetivo.</p>
<p style="text-align: justify;">Ya hay versiones más «modernas» con mejor código, pero la que compartí es la que implementé en su momento.</p>
<p style="text-align: justify;">Y es algo que se ha de tener bajo la manga ya que no siempre todos distinguen entre las diferencias de los archivos BMP, JPEG, GIF, TIFF o PNG. Cada formato, un reino diferente.</p>
<p>The post <a href="https://kadai.com.mx/codigo-php-imagecreatefrombmp/">[Función] Código PHP: imagecreatefrombmp</a> appeared first on <a href="https://kadai.com.mx">Endless Manifesto</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://kadai.com.mx/codigo-php-imagecreatefrombmp/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">492</post-id>	</item>
		<item>
		<title>WordPress: Setting up some websites</title>
		<link>https://kadai.com.mx/wordpress/</link>
		
		<dc:creator><![CDATA[Kadai Crosshansen]]></dc:creator>
		<pubDate>Fri, 17 Mar 2017 04:28:54 +0000</pubDate>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[hosting]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[server]]></category>
		<category><![CDATA[webhosting]]></category>
		<category><![CDATA[wordpress]]></category>
		<guid isPermaLink="false">https://kadai.com.mx/?p=179</guid>

					<description><![CDATA[<p>The more I work with WordPress, the more I like it. Specially because it is much more easy to set up websites and other stuff with it. Something that was not that easy with Drupal. So far, WordPress has been quite easy to manipulate. Extend and even update without any major issues. Something that I [&#8230;]</p>
<p>The post <a href="https://kadai.com.mx/wordpress/">WordPress: Setting up some websites</a> appeared first on <a href="https://kadai.com.mx">Endless Manifesto</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>The more I work with WordPress, the more I like it. Specially because it is much more easy to set up websites and other stuff with it. Something that was not that easy with Drupal.</p>
<p><span id="more-179"></span></p>
<p>So far, WordPress has been quite easy to manipulate. Extend and even update without any major issues. Something that I did not experienced with Drupal 6, back in the day.</p>
<p>That is why the more I mess with WordPress, the more I like it.</p>
<h3>Keep building with WordPress</h3>
<p>Rebuilding has been a pleasure so far. And that I have not yet got into code and extend some functionality myself. This using PHP or JavaScript. But I totally plan to do so.</p>
<p>Maybe this one will fit on what I do need. For now, a simple blogging platform that I can mess with at will. Not caring much of a dissaster happens.</p>
<p>But one thing is true, I need to wipe out properly some old installations and domains. Or probably give them a proper set up for its own.</p>
<p>One of the things that I have seen is that you can do <a href="https://codex.wordpress.org/Create_A_Network" target="_blank" rel="nofollow noopener">Multisite installs</a>. And that really sounds amazing. I had something like that when I was on Drupal.</p>
<p>But on Drupal it was like an administration nightmare. I hope it is much more easy with this CMS. With what I have been quite happy, and been seeing that some rumors I did read back in the day where not totally true. At least for now.</p>
<p>I mean, back in the day, I did not went the WordPress route because it was regarded as <em>heavy</em> and <em>bloated</em>. Maybe that was right back in 2010 or earlier, when I got this space.</p>
<p>But for today standards, almost any hosting space can deal with its needs quite easily. Despite that, there is a lot of work to do. A lot of optimizations that need to be done.</p>
<p>So, its time to move on.</p>
<p>The post <a href="https://kadai.com.mx/wordpress/">WordPress: Setting up some websites</a> appeared first on <a href="https://kadai.com.mx">Endless Manifesto</a>.</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">179</post-id>	</item>
	</channel>
</rss>
