<?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>Daniel Nabil: diseño web, Mallorca &#187; Blog</title>
	<atom:link href="http://www.danielnabil.com/seccion/blog/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.danielnabil.com</link>
	<description>Estudio de diseño web en Mallorca</description>
	<lastBuildDate>Mon, 20 May 2013 00:33:57 +0000</lastBuildDate>
	<language>es-ES</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.5.1</generator>
		<item>
		<title>Y lo llaman SEO</title>
		<link>http://www.danielnabil.com/blog/y-lo-llaman-seo/</link>
		<comments>http://www.danielnabil.com/blog/y-lo-llaman-seo/#comments</comments>
		<pubDate>Mon, 20 May 2013 00:33:57 +0000</pubDate>
		<dc:creator>Daniel</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[SEO]]></category>

		<guid isPermaLink="false">http://www.danielnabil.com/?p=509</guid>
		<description><![CDATA[En el debate sobre si la profesión dedicada al posicionamiento en buscadores (SEO) es sólo humo o si realmente sirve para algo, se ha escrito y debatido muchísimo y en todos los idiomas, pero al ver los resultados y, sobretodo, las preguntas que se siguen haciendo, parece que hace falta ... <a href="http://www.danielnabil.com/blog/y-lo-llaman-seo/" class="seguir"><img src="/wp-content/themes/dn2/img/mas.png" alt="" /></a>]]></description>
				<content:encoded><![CDATA[<p>En el debate sobre si la profesión dedicada al posicionamiento en buscadores (SEO) es sólo humo o si realmente sirve para algo, se ha escrito y debatido muchísimo y en todos los idiomas, pero al ver los resultados y, sobretodo, las preguntas que se siguen haciendo, parece que hace falta aportar más opiniones, dar ideas y definir un poco más <strong>qué es y qué no es el SEO</strong>.</p>
<p>Cada vez más clientes sienten la necesidad de contratar a una agencia de expertos en SEO justo después de haber diseñado y desarrollado la web para que hagan su magia y les coloquen en la primera página de Google y los demás buscadores.</p>
<p>Intento explicar a los clientes que en vez de ponerse a buscar urgentemente agencias de marketing, expertos en SEO, community managers, etc. lo que tienen que hacer cuando hemos terminado de construir la web es, la mayoría de las veces, <strong>darle vida y llenarla de contenido</strong>. Empezar a utilizarla. Si tiene un blog o una sección de noticias, publicar frecuentemente sobre el tema que trate la web; si hay una sección de ofertas, empezar a ofrecer productos; si es una tienda, añadir artículos&#8230; Compartirla, darla a conocer en las redes sociales y fuera de Internet.</p>
<p>Pero, como con la salud, parece que preferimos pagar a alguien para que nos arregle las cosas sin esfuerzo, fácil y rápidamente, en vez de cuidarnos un poco y prevenir enfermedades (o en este caso, una factura más que pagar a final de mes).</p>
<p>No digo que los profesionales en posicionamiento web sean innecesarios, sino que muchas veces son prescindibles, al menos en una primera etapa.</p>
<blockquote class="twitter-tweet" width="500"><p>Cansado de explicar que en vez de instalar tanto plugin es mejor dedicarse a crear contenido, pero se busca lo rápido… y luego no funciona.</p>
<p>&mdash; Daniel N. González (@daninabil) <a href="https://twitter.com/daninabil/status/327088572328996864">April 24, 2013</a></p></blockquote>
<p><script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script></p>
<p>Google y los demás buscadores son animales que comen texto y alguna otra cosa. Dales de comer, cuanto más mejor, y les tendrás contentos. El resto ya llegará. Los motores de búsqueda no ven las páginas web como las vemos las personas. Están limitados a leer el contenido y hacer suposiciones a partir de los datos que recogen, por eso es importante tratar de ponerse en su lugar (desde <a href="https://www.google.com/webmasters/tools/home?hl=es">Google Webmaster Tools</a>, por ejemplo). Un profesional del posicionamiento web es alguien que entiende y conoce al buscador, que sabe lo que le gusta, no alguien que le intenta engañar con campañas agresivas y trucos para conseguir resultados rápidos.</p>
<p>Demasiadas veces, las campañas SEO consisten en hacer spam, en conseguir direcciones de email como sea y empezar a enviar indiscriminadamente información no solicitada a la gente. De ahí que muchas veces se asocie el SEO con el correo no deseado. Hay buenos y malos profesionales en cualquier oficio, y en el mundo de las empresas dedicadas al posicionamiento en buscadores lógicamente hay de todo:</p>
<ul class="lessMargin">
<li>Algunos te cobran 300 euros por instalarte cuatro plugins (y lo llaman SEO)</li>
<li>Otros te dan de alta en cientos de directorios online (y lo llaman SEO)</li>
<li>Hay quien te llenará la web de basura (exceso de palabras clave en los textos, en las direcciones, código innecesario, etc), y lo llamará SEO</li>
<li>A veces la estrategia consistirá en instalar WordPress y poco más (pero lo llaman SEO)</li>
</ul>
<p>SEO no es instalar WordPress, no es instalar cuatro plugins ni darte de alta en buscadores y directorios (a no ser que sea <a href="http://www.dmoz.org/">DMOZ.org</a>) que nadie utiliza, no es obsesionarse con los &#8220;errores&#8221; del <a href="http://validator.w3.org/">validador de HTML</a>, sinó trabajar los contenidos para que sean lo más relevantes y útiles posibles para nuestras visitas y cuidar el lenguaje que utilizamos para construir la web (HTML, CSS, PHP, Javascript&#8230;).</p>
<blockquote><p>
<em>&#8220;Contratar a un SEO es una decisión muy importante que puede mejorar su sitio y ahorrarle tiempo, aunque también se arriesga a dañar su funcionamiento y reputación. Asegúrese de averiguar tanto las posibles ventajas como los daños que un SEO poco solvente puede provocar en su sitio.&#8221;</em> (Fuente: <a href="http://support.google.com/webmasters/bin/answer.py?hl=es&#038;answer=35291">Google</a>)
</p></blockquote>
<p>Una campaña de optimización web empieza desde el diseño y después el desarrollo de la web: colocar las etiquetas de título correctamente, imágenes con información adicional, direcciones descriptivas, código limpio y fácil de &#8220;digerir&#8221;, una estructura lógica, añadir enlaces relevantes, contenidos trabajados e interesantes, etc. Son cosas básicas, de sentido común, algunas responsabilidad del diseñador web, otras del desarrollador, otras de la persona o equipo encargado de crear el contenido y otras de alguien que entienda bien cómo funciona esto del posicionamiento. Si esto no está hecho, no es que necesites un experto SEO, es que tu web no está bien hecha.</p>
<p class="destacado">La mejor estrategia debería consistir, después de conseguir tener una base sólida sobre la que trabajar, en darle interés, hacer que nuestra web sea única y brillante en algún aspecto, en conseguir diferenciarnos del resto de competidores. Es decir, en destacar.</p>
<p>Una estrategia basada en mejorar un sitio web desde la base puede ser interesante, pero una que prometa aplicar trucos y secretos oscuros que solo los profesionales conocen y con &#8220;resultados demostrables y garantizados&#8221;, probablemente no.</p>
<p>En otras palabras, es importante ver nuestra nueva página web como un organismo, algo vivo que tenemos que alimentar y que tiene que servir a los lectores y usuarios, no al motor de búsqueda de Google. Se trata en definitiva de crear webs accesibles para los buscadores, pero hechas para los usuarios. La mejor estrategia debería consistir, después de conseguir tener una base sólida sobre la que trabajar, en darle interés, hacer que sea única y brillante en algún aspecto, en conseguir diferenciarnos del resto de competidores. Es decir, en destacar.</p>
<p>El factor diferenciador puede ser el precio de los productos que se ofrecen, pero también las facilidades de pago, las descripciones, el servicio postventa, la atención al cliente, el diseño, la experiencia de usuario, la autoridad de nuestra información, la calidad del material visual (fotos, vídeos&#8230;), las ofertas, la disponibilidad del contenido en el idioma del usuario, etc.</p>
<p>Salir en la primera página de Google puede ser muy fácil o muy complicado. <strong>En muchos casos no hace falta hacer nada para que nuestra web salga en el primer resultado</strong>, sin aplicar ninguna técnica especial de posicionamiento. Esto es lo que mucha gente no entiende: <em>si hay quien cobra por posicionar mi web, ¿cómo es que puedo salir sin hacer nada?</em></p>
<p>Además, pongamos que la campaña de posicionamiento ha funcionado perfectamente y estamos recibiendo un montón de visitas. Si estas visitas llegan a nuestra web y no ven nada interesante, como es lógico, volverán atrás y buscarán otra página, quizás peor posicionada, pero con mejor contenido o servicios. En otras palabras, aunque la campaña de posicionamiento sea un éxito, si la conversión falla, todo los esfuerzos anteriores habrán sido inútiles.</p>
<p>No soy experto en SEO, pero por mi experiencia, muchas veces las empresas, negocios y particulares más que una campaña de optimización en buscadores lo que necesitan urgentemente es un contenido apropiado, un contenido que ayude al usuario a encontrar y entender lo que busca, y que al mismo tiempo sea bien indexado por Google y el resto de buscadores.</p>
<p>No se puede hacer una campaña SEO con contenidos pobres, con entradas de una linea o un párrafo escrito de cualquier manera. El primer paso es hablar con el cliente y explicarle que no se trata de pagar más, se trata de ofrecer más al usuario, al visitante de su web, y para eso muchas veces no hace falta pagar a nadie (como mucho a alguien para que te explique esto y a otro para que te escriba los contenidos o le dé valor e interés a la web).</p>
<p>Poco a poco hemos ido generando una <strong>obsesión por el SEO</strong>. Aunque casi siempre será beneficioso contratar una campaña prolongada de optimización, las empresas invierten un montón de dinero en agencias de posicionamiento un poco a ciegas, sin saber muy bien dónde va ese dinero y qué alternativas tienen.</p>
<p>En muchos casos, el mejor SEO que te pueden ofrecer en un primer momento es explicarte cómo indexan los buscadores, cómo organizan los resultados, qué factores son importantes, y para eso muchas veces no es necesario instalar nada ni contratar a una agencia que nos cobre cada mes por sus servicios.</p>
<h2>Malas señales al contratar un SEO</h2>
<ul>
<li><strong>Promesas poco creíbles</strong>: cuando alguien promete resultados sorprendentes en la primera página de Google, o que en cuestión de 48 horas nuestra web aparecerá posicionada, especialmente si antes no se ha hecho un pequeño estudio previo. Garantizar resultados en la primera posición es bastante arriesgado, a no ser que la competencia para nuestras palabras clave sea bajísima.</li>
<li><strong>Envíos a cientos de buscadores y directorios online</strong>: si la estrategia de posicionamiento incluye envíos masivos a buscadores, es una señal clara de que el cerebro del SEO en cuestión se quedó parado en el año 2000. Las webs ya no necesitan ser enviadas por nadie a ningún buscador importante (excepto casos muy concretos)</li>
<li><strong>Enlaces externos asegurados</strong>: no todos los enlaces que se consiguen son relevantes. Si provienen de sitios que no tienen nada que ver con la temática de nuestra web, si no tienen una mínima credibilidad o no son de confianza, da igual que consigamos cientos de enlaces. Esta técnica ya no sirve.</li>
<li><strong>Envíos de spam o llamadas telefónicas no solicitadas</strong>: cuando una empresa tiene que recurrir a enviar correo no solicitado (<a href="http://www.danielnabil.com/blog/newsletters-spam-basura-imagen-empresa/">incluidas las newsletters</a>) o a hacer llamadas promocionales (&#8220;marketing telefónico&#8221;) para conseguir clientes y/o visitas. No confíes en empresas SEO, consultorías o agencias web que envían mensajes de correo no solicitado.</li>
<li>Si entre sus servicios <strong>no se incluye la creación y mejora del contenido</strong> es probable que la empresa se dedique básicamente a intentar engañar al buscador con trucos y recursos para conseguir resultados a corto plazo.</li>
<li><strong>Preocuparse más por la densidad de palabras clave</strong>, cantidad de enlaces permitidos, errores de validación, trucos recién descubiertos, etc. que por ofrecer contenido de calidad para el usuario y conseguir una relación con él abierta y duradera.</li>
</ul>
<h2>Cosas que puede hacer uno mismo</h2>
<p>Hay bastantes cosas que puede hacer uno mismo con un poco de tiempo y dedicación:</p>
<ul>
<li><strong>Estudiar, analizar un poco las palabras clave</strong> que nos interesan: haz una lista de palabras, frases y combinaciones de palabras con las que tu negocio se identifica. No es lo mismo salir en la primera página de Google con &#8220;Hoteles Mallorca&#8221; que con &#8220;Hoteles Palma Mallorca verano 2013&#8243;, por eso es necesario profundizar un poco y encontrar palabras que nos definan más allá de las obvias y seguramente difíciles de conseguir.</li>
<li><strong>Estudiar a la competencia</strong>: no es necesario pasarse días y escribir un informe exhaustivo, simplemente visita sus webs, mira cómo funcionan, qué ofrecen, por qué crees que tienen éxito&#8230;</li>
<li><strong>Crear contenido para la web</strong>: esto puede hacerlo uno mismo o contratar a alguien para que ayude, todo depende de cómo se nos dé escribir. Se trata de conseguir textos sinceros y útiles, más que propaganda vacía. Procura no ser demasiado escueto (Google es muy grande y come mucho), ni tampoco enrollarte sin necesidad. Aunque contrates a alguien, procura darle ideas sobre cómo debería enfocar esos textos, para que reflejen bien la intención y el alma de tu negocio, empresa o proyecto. Es fácil contratar a alguien para que se preocupe de crear el contenido, pero su conocimiento será limitado; quien mejor conoce nuestro negocio y a nuestros clientes somos nosotros mismos, por eso hay que asegurarse de que la esencia del proyecto se conserva en el contenido.</li>
<li><strong>Disponibilidad de contenidos en varios idiomas</strong>. Si queremos hacer llegar nuestro mensaje a más gente, puede ser una buena idea contratar a una <a href="http://www.signewords.com/">agencia de traducción, creación y revisión de textos</a>. En Mallorca, por ejemplo, aparte de hoteles, restaurantes y demás empresas dedicadas de lleno al sector turístico, puede ser interesante ofrecer nuestros contenidos en inglés y alemán (y por lo visto últimamente, <a href="http://www.elmundo.es/elmundo/2012/10/03/baleares/1349291779.html">ruso también</a>) para atraer a más visitantes aunque seamos diseñadores, entrenadores personales o artistas plásticos.</li>
<li>Asegúrate de que la <strong>estructura y el código de tu web está bien construido</strong>: tu web puede ser una plantilla comprada, gratuita, una web que te han hecho a medida o que has hecho tú mismo con algún programa de diseño. Como primer paso, abre la página de inicio y mira el código: Ver > Opciones para desarrolladores > Ver código fuente (o accesos similares). Pide o contrata a alguien para que eche un vistazo al código si tienes dudas. En principio, para empezar se trata de ver si todo está en su sitio y no hay mucho desorden.</li>
<li><strong>Conseguir buenos enlaces externos naturales</strong> que apunten hacia nuestra web (link building): se trata de relacionarse con otras webs y otras personas, tanto en Internet como fuera de la red. No se trata de pagar por enlaces hacia tu web, sinó de ver cómo conseguir esos enlaces sin pedirlos. Si el contenido, los productos o las ofertas son interesantes, normalmente los enlaces vendrán solos, con el tiempo. De hecho, funciona igual que cuando no existía Internet: las recomendaciones llegan con el tiempo, cuando tenemos clientes satisfechos y una imagen formada a partir de años de experiencia y dedicación.</li>
<li><strong>Relacionarse, online y offline</strong>, en redes sociales y en el bar, el gimnasio, la universidad, el trabajo&#8230;</li>
</ul>
<p>Habrá quien dirá que lo que pretendo con esta entrada es precisamente posicionar esta página para busquedas relacionadas con SEO, expertos en posicionamiento y búsquedas similares, pero no es así, básicamente porque no ofrecemos ese servicio. Las webs que montamos incluyen una optimización básica o avanzada (según el presupuesto), que consiste en dejar preparada la web para que funcione, que esté bien construida desde la base, pero eso no se llama SEO, se llama diseñar y desarrollar webs.</p>
<h2>Enlaces e información relacionada</h2>
<p>En Internet hay muchísimos artículos que tratan este tema y muestran la preocupación de diseñadores web al ver los resultados después de pasar por las manos de algunos expertos en SEO. De todas formas, los que están más en la linea de lo que aquí intento explicar son estos:</p>
<ul>
<li><a href="http://css-tricks.com/2276-common-sense-seo-checklist/">Common Sense SEO Checklist</a> (CSS Tricks)</li>
<li><a href="http://www.smashingmagazine.com/2012/12/11/seo-the-inconvenient-truth/">The Inconvenient Truth About SEO</a> (Smashing Magazine)</li>
<li><a href="http://searchengineland.com/thoughts-on-web-developers-seo-reputation-problems-28047">Thoughts On Web Developers, SEO &#038; Reputation Problems</a> (Search Engine Land)</li>
<li><a href="http://searchengineland.com/think-you-have-to-outsource-seo-to-an-expensive-firm-5-things-you-can-do-in-house-83625">Think You Have To Outsource SEO To An Expensive Firm? 5 Things You Can Do In House</a> (Search Engine Land)</li>
<li><a href="http://css-tricks.com/video-screencasts/83-thoughts-on-seo/">Thoughts on SEO</a>, CSS Tricks (vídeo en inglés)</li>
<li><a href="http://googlewebmastercentral.blogspot.com.es/2012/03/five-common-seo-mistakes-and-six-good.html">Five common SEO mistakes and six good ideas</a> (Google Webmaster Central)</li>
<li><a href="http://www.searchenginejournal.com/common-sense-the-secret-ingredient-of-any-seo-campaign/29149/">Common Sense: The Secret Ingredient of any SEO Campaign</a> (Search Engine Journal)</li>
</ul>
<h2>Enlaces generales sobre posicionamiento web</h2>
<ul>
<li><strong>Guía SEO de Google para principiantes</strong>: Manual para entender cómo funcionan los buscadores y cómo mejorar el posicionamiento de una web: accesibilidad, nociones básicas de SEO, etiquetas de cabecera, estructura interna, URLs, optimización de contenido, enlaces internos, tratamiento de imágenes, títulos, uso de robots.txt, nofollow, el SEO en dispositivos móviles, análisis, utilización de herramientas para webmasters…
<p><a href="http://static.googleusercontent.com/external_content/untrusted_dlcp/www.google.es/es/es/webmasters/docs/guia_optimizacion_motores_busqueda.pdf">PDF en español</a> | <a href="http://static.googleusercontent.com/external_content/untrusted_dlcp/www.google.com/en//webmasters/docs/search-engine-optimization-starter-guide.pdf">PDF en inglés</a></li>
<li><a href="http://www.seomoz.org/beginners-guide-to-seo">The beginners guide to SEO</a> (SEOmoz, en inglés): Manual de iniciación para principiantes. Una guía muy completa que cubre las estrategias fundamentales para hacer sitios web que funcionen correctamente en los buscadores.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.danielnabil.com/blog/y-lo-llaman-seo/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mostrar biografía e información sobre el autor en WordPress</title>
		<link>http://www.danielnabil.com/blog/wordpress-mostrar-biografia-informacion-sobre-autor/</link>
		<comments>http://www.danielnabil.com/blog/wordpress-mostrar-biografia-informacion-sobre-autor/#comments</comments>
		<pubDate>Wed, 01 May 2013 14:45:58 +0000</pubDate>
		<dc:creator>Daniel</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://www.danielnabil.com/?p=614</guid>
		<description><![CDATA[En las webs y blogs donde los contenidos son publicados por más de un autor, es frecuente añadir al final de cada entrada una pequeña biografía con información pública sobre el usuario que ha escrito esa entrada, generalmente mostrando el nombre del autor, una foto, una pequeña descripción y algunos ... <a href="http://www.danielnabil.com/blog/wordpress-mostrar-biografia-informacion-sobre-autor/" class="seguir"><img src="/wp-content/themes/dn2/img/mas.png" alt="" /></a>]]></description>
				<content:encoded><![CDATA[<p>En las webs y blogs donde los contenidos son publicados por más de un autor, es frecuente añadir al final de cada entrada una pequeña <strong>biografía con información pública sobre el usuario que ha escrito esa entrada</strong>, generalmente mostrando el nombre del autor, una foto, una pequeña descripción y algunos enlaces a su web personal y su cuenta de Twitter, Facebook, RSS, etc.</p>
<p>Mostrar esta información sobre el autor es una buena manera de dar credibilidad y personalidad a las noticias y de fomentar la participación, además de ayudar a la fidelización de nuestras visitas.</p>
<p>La gestión de usuarios en <strong>WordPress</strong> es muy completa e intuitiva. No solo podemos crear varios tipos de usuarios (administrador, editor, autor&#8230;) sinó que podemos contar con varios usuarios de un mismo tipo, por ejemplo, <strong>diferentes autores que contribuyen en una misma web</strong>.</p>
<p>Sin embargo, no existe ninguna opción en el área de administración que nos permita decidir si queremos mostrarla públicamente o no. Esto se deja a la elección del desarrollador y diseñador de cada tema.</p>
<p>De todas formas, no es complicado editar una plantilla para conseguir que se muestre la biografía pública del autor de la entrada sin tener que utilizar ningún plugin. WordPress ha ido incorporando una serie de etiquetas para hacer esto más fácil, por lo que al final solo tendremos que editar una o dos plantillas para conseguirlo.</p>
<h3>1. Añadimos nuevos campos en el perfil del usuario</h3>
<p>Lo primero que tendremos que hacer es <strong>añadir algunos campos en la ficha de cada usuario, es decir en las opciones del perfil</strong>. Por defecto, WordPress solo viene configurado con campos para añadir la dirección de correo del usuario, la página web, cuenta de AIM, mensajería de Yahoo, Jabber/Google Talk y una biografía (en Perfil > Acerca de ti > Información biográfica). No hay ningún sitio donde poder añadir otras cuentas más comunes como la de Twitter, Facebook, Skype, RSS, Flickr o LinkedIn, por ejemplo.</p>
<p>Para conseguir esto añadiremos una función al filtro &#8220;<a href="http://codex.wordpress.org/Plugin_API/Filter_Reference/user_contactmethods">user_contactmethods</a>&#8221; en el archivo de funciones (&#8220;<strong>functions.php</strong>&#8220;) del tema activo (o en un plugin de funciones, si queremos que nos sirva para otros temas que vayamos a instalar):</p>
<pre class="brush: php; title: ; notranslate">
// Función para añadir campos con información 
// extra al perfil del usuario de WordPress.
add_filter( 'user_contactmethods', 'perfil_usuario_personalizado' );
function perfil_usuario_personalizado( $user_contact ) {
	$user_contact['perfil_twitter'] = __('Twitter'); 
	$user_contact['perfil_facebook'] = __('Facebook'); 
	$user_contact['perfil_rss'] = __('RSS'); 
	return $user_contact;
}
</pre>
<p>Podemos añadir tantos campos como queramos. Aquí hemos añadido tres campos: una para poder añadir la dirección de Twitter del autor, otro para la de Facebook y uno más para la URL de su canal RSS.</p>
<p>Con esto ya tenemos solucionado el tema del perfil del autor. Si vamos al perfil de nuestro usuario veremos que se han añadido estos tres bloques nuevos. Lo único que faltará hacer es que cada usuario rellene los nuevos campos con su información. No es necesario rellenarlos todos, se puede dejar en blanco cualquiera de ellos, ya que más adelante lo que haremos es confirmar que el campo tiene alguna información, antes de imprimirlo en pantalla.</p>
<p><img src="http://www.danielnabil.com/img/campos-perfil-usuario-wordpress.gif" alt="Nuevos campos en el perfil de usuario de WordPress" width="564" height="383" class="aligncenter size-full wp-image-619" /></p>
<p>Ya que estamos, si lo que queremos es además <strong>eliminar alguno de los campos que WordPress trae por defecto</strong>, podemos hacerlo de la misma forma, añadiendo algunas lineas a nuestra función:</p>
<pre class="brush: php; title: ; notranslate">
// Función para añadir o eliminar información extra al perfil.
add_filter( 'user_contactmethods', 'perfil_usuario_personalizado' );
function perfil_usuario_personalizado( $user_contact ) {

	/* Añadimos campos al perfil: Twitter y Skype */
	$user_contact['perfil_twitter'] = __('Twitter'); 
	$user_contact['perfil_skype'] = __(' Skype'); 

	/* Eliminamos los campos AIM, Jabber y Yahoo IM del perfil */
	unset($user_contact['aim']);
	unset($user_contact['jabber']);
	unset($user_contact['yim']);

	return $user_contact;
}
</pre>
<p>Nota: con este método no se pueden eliminar los campos URL o biografía, solo AIM, Yahoo IM y Jabber/Google Talk.</p>
<h3>2. Añadimos la información del perfil en la plantilla, al final de cada entrada</h3>
<p>El siguiente paso se podría hacer incluyendo más código en nuestro archivo de funciones (es la solución que dan en muchos tutoriales y plugins), pero creo que es mucho mejor <strong>utilizar las etiquetas que WordPress proporciona</strong> e incluirlo directamente en la plantilla donde queremos que aparezca esta información (normalmente en &#8220;single.php&#8221;).</p>
<p>Además, el método que muchos plugins utilizan de filtrar &#8220;the_content&#8221; y añadir la biografía después, es más probable que de problemas, por ejemplo, en diseños más complejos que un simple blog, o si estamos utilizando &#8220;the_content&#8221; en nuestro tema en lugares poco frecuentes, además de en las entradas (por ejemplo, si nuestros archivos muestran toda la información en lugar de solo un resumen con &#8220;the_excerpt&#8221;, que es lo más habitual).</p>
<p>Como lo que queremos es que sea fácil de editar y no tener que añadir clases CSS y tanto código HTML dentro de las funciones, vamos a <strong>añadir la información del perfil del autor en la plantilla que se encarga de mostrar una entrada completa, o sea &#8220;single.php&#8221;</strong>, para poder añadir la biografía y los links a redes sociales debajo de cada entrada, <strong>después de la función &#8220;the_content&#8221;</strong>:</p>
<pre class="brush: xml; title: ; notranslate">
&lt;!-- Información del autor: nombre, foto, biografía y links a redes sociales  --&gt;
&lt;div class=&quot;autor-biografia&quot;&gt;
	&lt;div class=&quot;autor-info&quot;&gt;
		&lt;?php echo get_avatar( get_the_author_meta('email'), '80' ); ?&gt;
		&lt;h3 class=&quot;autor-nombre&quot;&gt;Autor: &lt;?php the_author_link(); ?&gt;&lt;/h3&gt;
		&lt;p class=&quot;autor-descripcion&quot;&gt;&lt;?php the_author_meta('description'); ?&gt;&lt;/p&gt;
		&lt;ul class=&quot;autor-enlaces&quot;&gt;
			&lt;li class=&quot;autor_web&quot;&gt;Web: &lt;a href=&quot;&lt;?php the_author_meta('user_url');?&gt;&quot;&gt;&lt;?php the_author_meta('user_url');?&gt;&lt;/a&gt;&lt;/li&gt;&lt;?php 
				
				// TWITTER			
				$perfil_twitter = get_the_author_meta( 'perfil_twitter' );
				if ( $perfil_twitter &amp;&amp; $perfil_twitter != '' ) {
					echo '&lt;li class=&quot;autor_tw&quot;&gt;Twitter: &lt;a href=&quot;' . esc_url($perfil_twitter) . '&quot;&gt;' . esc_url($perfil_twitter) . '&lt;/a&gt;&lt;/li&gt;';
				}
				
				// FACEBOOK
				$perfil_facebook = get_the_author_meta( 'perfil_facebook' );
				if ( $perfil_facebook &amp;&amp; $perfil_facebook != '' ) {
					echo '&lt;li class=&quot;autor_fb&quot;&gt;Facebook: &lt;a href=&quot;' . esc_url($perfil_facebook) . '&quot;&gt;' . esc_url($perfil_facebook) . '&lt;/a&gt;&lt;/li&gt;';
				}
	
				// RSS
				$perfil_rss = get_the_author_meta( 'perfil_rss' );
				if ( $perfil_rss &amp;&amp; $perfil_rss != '' ) {
					echo '&lt;li class=&quot;autor_rss&quot;&gt;RSS: &lt;a href=&quot;' . esc_url($perfil_rss) . '&quot;&gt;' . esc_url($perfil_rss) . '&lt;/a&gt;&lt;/li&gt;';
				} 
				?&gt;
	
		&lt;/ul&gt;
	&lt;/div&gt;&lt;!-- .autor-info--&gt;
&lt;/div&gt;&lt;!-- .autor-biografia--&gt;
</pre>
<p>Las etiquetas que se encargan de entregarnos la información del perfil son:</p>
<ul class="lessMargin">
<li>Imagen (avatar): <a href="http://codex.wordpress.org/Function_Reference/get_avatar">get_avatar()</a></li>
<li>Enlace a la web del autor: <a href="http://codex.wordpress.org/Function_Reference/the_author_link">the_author_link()</a></li>
<li>Información extra: <a href="http://codex.wordpress.org/Function_Reference/the_author_meta">the_author_meta()</a> y <a href="http://codex.wordpress.org/Function_Reference/get_the_author_meta">get_the_author_meta()</a></li>
</ul>
<p>Si nuestros usuarios no tienen avatar o no saben como cambiarlo, aquí encontrarán información:<br />
<a href="http://www.danielnabil.com/blog/como-cambiar-avatar-por-defecto-wordpress/">Cómo cambiar el avatar por defecto de WordPress</a></p>
<h3>3. Y le damos un poco de estilo</h3>
<p>Ahora solo nos queda darle un poco de estilo a la información que hemos añadido. Sin este último paso, la biografía y los enlaces ya se imprimirá correctamente en nuestra plantilla, pero la colocación de cada elemento dependerá de las reglas CSS de nuestro tema.</p>
<p>Para que no haya conflictos con otros estilos utilizados para el diseño general de nuestra web, es importante <strong>utilizar nombres de clases que ayuden a concretar</strong>, es decir, nada de utilizar clases demasiado generales como &#8220;bio&#8221;, &#8220;info&#8221;, &#8220;autor&#8221;, &#8220;facebook&#8221;, etc.</p>
<p>El siguiente código CSS lo deberíamos <strong>incluir en la hoja de estilos generales &#8220;style.css&#8221;</strong>, aunque funcionará igualmente si lo colocamos antes del código HTML anterior (todo depende de si queremos que nuestro código valide correctamente y siga los estándares):</p>
<pre class="brush: css; title: ; notranslate">
/* Estilos para la biografía del autor (perfil del usuario) */
.autor-biografia { margin-top: 50px; background-color: #ddd; border: 1px solid #ccc; padding: 20px 35px; font-size: 12px; line-height: 16px; }
.autor-info { padding-left: 90px; }
.autor-info .avatar { float: left; margin-left: -100px; border: 1px solid #fff; }
.autor-biografia h3 { display: inline-block; margin: 0 0 10px; font-weight: bold; font-size: 18px; }
.autor-enlaces { margin: 20px; }
.autor-enlaces li { margin: 0; }
.autor-enlaces a { /* Añadir estilos para los enlaces de la lista */ }
</pre>
<p><img src="http://www.danielnabil.com/img/biografia-autor-entradas.jpg" alt="Biografía del autor al final de las entradas" width="620" height="261" class="aligncenter size-full wp-image-621" /></p>
<p>Lógicamente, cada uno puede editar a su gusto estos estilos. Por ejemplo, si queremos mejorarlo un poco más, podemos convertir los enlaces a redes sociales y RSS en iconos, para hacerlo un poco más atractivo.</p>
<p>Si en vez de enlaces de texto preferimos utilizar iconos para cada red social, habrá que hacer algunos ajustes en el código CSS anterior y añadir estas reglas:</p>
<pre class="brush: css; title: ; notranslate">
.autor-enlaces { margin: 0; padding: 0; }
.autor-enlaces li { margin: 0 10px 0 0; display: inline-block; }
.autor-enlaces a { display: block; width: 35px; height: 35px; background-color: #a00; text-indent: 100%; white-space: nowrap; overflow: hidden; }
.autor-enlaces .autor_web a { background: url('ruta-del-icono.png'); }
.autor-enlaces .autor_tw a { background: url('ruta-del-icono.png'); }
.autor-enlaces .autor_fb a { background: url('ruta-del-icono.png'); }
.autor-enlaces .autor_rss a { background: url('ruta-del-icono.png'); }
</pre>
<p>Aquí solo será necesario sustituir la ruta donde se encuentran los iconos que queremos utilizar, y probablemente el tamaño de las imágenes.</p>
<p>Como toque final, si queremos que la foto (el avatar del autor) en vez de cuadrado salga en un círculo, <strong>podemos añadir border redondeados a la imagen con &#8220;border-radius: 50%&#8221;</strong>.</p>
<h3>Plugins, el camino fácil</h3>
<p>Si todo esto te parece muy complicado y prefieres <strong>utilizar un plugin</strong>, no te va a ser difícil encontrar alguno que se adapte a tus necesidades. Es la manera más fácil de añadir funcionalidad en WordPress, pero la desventaja es que prácticamente no se aprende nada, y además estaremos limitados al diseño y desarrollo de su autor, por lo que puede que no encaje muy bien con el diseño de nuestra web.</p>
<p>Estos son algunos de los plugins que se encargan de añadir información sobre el autor:</p>
<ul>
<li><a href="http://wordpress.org/extend/plugins/social-autho-bio/">Social Author Bio</a>: Añade automáticamente a las entradas un bloque con la biografía del autor, junto con un avatar e iconos de redes sociales.</li>
<li><a href="http://wordpress.org/extend/plugins/wp-biographia/">WP Biographia</a>: Añade la biografía del usuario en la página de inicio, archivos, entradas e incluso en el feed RSS. También dispone de un widget para añadirlo al lateral (sidebar).</li>
<li><a href="http://wordpress.org/extend/plugins/author-box-2/">Author Box Reloaded</a>: Añade información sobre el autor en cualquier blog, con opciones para configurar algunos detalles.</li>
<li><a href="http://wordpress.org/extend/plugins/author-box-after-posts/">Author Box After Posts</a>: Añade una caja con información sobre el autor después del contenido, incluyendo el avatar del usuario, nombre, contador de entradas, web personal, descripción y email.</li>
<li><a href="http://wordpress.org/extend/plugins/wp-about-author/">WP About Author</a>: Muestra una biografía con varias opciones de personalización después de las entradas.</li>
</ul>
<h2>Cómo hacer una lista con todos los autores (usuarios) de WordPress</h2>
<p>Además de añadir la biografía del autor al final de cada entrada, cuando una web o un blog cuenta con varios autores, puede ser muy útil crear una página que muestre una <strong>lista completa de los usuarios</strong> que contribuyen a crear el contenido, e incluso facilitar la fidelización de nuestra visitas con enlaces al canal RSS de cada autor.</p>
<p>Esto se puede conseguir fácilmente gracias a la función <a href="http://codex.wordpress.org/Function_Reference/wp_list_authors">wp_list_authors</a>. Si no vamos a incluir muchas opciones (argumentos) a la función, podemos hacerlo así, en una sola línea:</p>
<pre class="brush: xml; title: ; notranslate">
&lt;ul&gt;
     &lt;?php wp_list_authors('exclude_admin=0&amp;show_fullname=1'); ?&gt;
&lt;/ul&gt;
</pre>
<p>Y si queremos ver las opciones que tenemos más ordenadas, podemos incluir primero todos los argumentos en una variable y después pasarla a la función &#8220;wp_list_authors&#8221;.</p>
<pre class="brush: php; title: ; notranslate">
&lt;?php   // Lista de autores
	$args = array(
	    'orderby'       =&gt; 'name', // Orden de los resultados
	    'order'         =&gt; 'ASC', // Dirección ascendente o descendente
	    'number'        =&gt; null, // Número máximo de usuarios que listar
	    'optioncount'   =&gt; false, // Mostrar la cantidad de entradas publicadas por cada usuario
	    'exclude_admin' =&gt; true, // Excluir al usuario administrador
	    'show_fullname' =&gt; false, // Mostar el nombre completo (nombres y apellidos) o solo el nombre público
	    'hide_empty'    =&gt; true, // Ocultar usuarios sin ninguna entrada publicada
	    'echo'          =&gt; true, // Mostrar los resultados
	    'feed'          =&gt; [empty string], // Texto del enlace al feed RSS de cada autor
	    'feed_image'    =&gt; [empty string], // Dirección del archivo de imagen
	    'feed_type'     =&gt; [empty string], // Tipo de feed (RSS, RSS2, Atom...)
	    'style'         =&gt; list, // Estilo del HTML generado: lista no ordenada (UL) o sin estilo
	    'html'          =&gt; true // Formato de salida del código: HTML o texto sin formato
    ); 
    wp_list_authors( $args );
?&gt;
</pre>
<p>Podemos añadir esta función por ejemplo en el lateral (sidebar.php) o, si tenemos muchos autores, crear una <a href="http://codex.wordpress.org/Pages#Page_Templates">plantilla de página</a> nueva para utilizarla como base y poder personalizar mejor el aspecto de esta lista.</p>
<h2>Mostrar la lista de autores en un desplegable con selección de usuario</h2>
<p>Si lo que queremos es mostrar una <strong>lista desplegable de autores</strong> desde la que podamos seleccionar uno y ver todos los artículos o entradas que éste ha publicado, existe una función de WordPress poco conocida pero perfectamente documentada desde la versión 2.3 que nos permite hacer exactamente eso: <strong><a href="http://codex.wordpress.org/Function_Reference/wp_dropdown_users">wp_dropdown_users</a></strong>.</p>
<p>En este ejemplo creamos un bloque en el que incluímos un formulario con un desplegable para poder seleccionar el autor y un botón para enviar la información a través del método GET, es decir, pasando la cadena de texto a la URL:</p>
<pre class="brush: xml; title: ; notranslate">
&lt;!-- Lista desplegable de autores --&gt;
&lt;div id=&quot;lista-autores&quot;&gt;
	&lt;h2&gt;&lt;?php _e('Lista de autores:'); ?&gt;&lt;/h2&gt;
	&lt;form action=&quot;&lt;?php bloginfo('url'); ?&gt;&quot; method=&quot;get&quot;&gt;
		&lt;?php wp_dropdown_users( array( 'name' =&gt; 'author' ) ); ?&gt;
		&lt;input type=&quot;submit&quot; name=&quot;submit&quot; value=&quot;Mostrar artículos&quot; /&gt;
	&lt;/form&gt;
&lt;/div&gt;
</pre>
<p>Al seleccionar un autor y pulsar el botón &#8220;Mostrar artículos&#8221;, el sistema nos enviará a la página &#8220;http://www.ejemplo.com/author/nombre-del-autor/&#8221;. Esta página de contenidos por autor la podemos personalizar tanto como queramos añadiendo una plantilla &#8220;author.php&#8221; o incluso &#8220;author-$id.php&#8221; a nuestro tema que sustituya a &#8220;archive.php&#8221; (ver <a href="http://codex.wordpress.org/Template_Hierarchy">jerarquía de plantillas en WordPress</a>).</p>
<p>Pasándole algunos argumentos (opciones) a la función, podemos ajustarla a nuestras necesidades. Por ejemplo, ordenar los autores de una determinada manera, incluir o excluir de la lista e incluso seleccionar el sitio en una instalación de WordPress multi-usuario para mostrar usuarios únicamente de ese blog.</p>
<h3>Conclusión</h3>
<p>WordPress nos da todas las facilidades posibles para que la gestión de usuarios no sea complicada de aplicar en nuestras plantillas. Aunque todos estos filtros y funciones no tienen por qué estar presentes por defecto en el tema que estemos utilizando, incluirlas es bastante fácil y nos permitirá crear plantillas más flexibles y con más posibilidades de personalización.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.danielnabil.com/blog/wordpress-mostrar-biografia-informacion-sobre-autor/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Trucos para encontrar lo que buscas en Google</title>
		<link>http://www.danielnabil.com/blog/consejos-trucos-busquedas-google/</link>
		<comments>http://www.danielnabil.com/blog/consejos-trucos-busquedas-google/#comments</comments>
		<pubDate>Sat, 13 Apr 2013 17:46:21 +0000</pubDate>
		<dc:creator>Daniel</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[Internet]]></category>

		<guid isPermaLink="false">http://www.danielnabil.com/?p=521</guid>
		<description><![CDATA[Aunque el buscador web de Google es muy fácil de utilizar a nivel básico, mucha gente sigue sorprendiéndose cuando descubre que, cambiando la forma en que le &#8220;preguntamos&#8221; a Google, se obtienen resultados mucho mejores. De hecho, según el caso, encontrar lo que estamos buscando puede depender totalmente de conocer ... <a href="http://www.danielnabil.com/blog/consejos-trucos-busquedas-google/" class="seguir"><img src="/wp-content/themes/dn2/img/mas.png" alt="" /></a>]]></description>
				<content:encoded><![CDATA[<p>Aunque el buscador web de Google es muy fácil de utilizar a nivel básico, mucha gente sigue sorprendiéndose cuando descubre que, cambiando la forma en que le &#8220;preguntamos&#8221; a Google, se obtienen resultados mucho mejores. De hecho, según el caso, encontrar lo que estamos buscando puede depender totalmente de conocer o no estas posibilidades.</p>
<h3>Truco 1: Búsquedas exactas (las comillas)</h3>
<p>Los resultados de una búsqueda con y sin comillas suelen ser muy diferentes. Al escribir nuestra búsqueda entre comillas estamos especificando que queremos ver <strong>resultados que coincidan exactamente con todas las palabras y en el mismo orden</strong>.</p>
<p>El ejemplo más claro es cuando buscamos nombres de personas, películas, títulos de canciones, errores del ordenador, etc. Además, podemos combinar el uso de comillas con otras palabras. Veamos algunos ejemplos:</p>
<ul>
<li><strong>&#8220;A B C&#8221;</strong>: queremos ver resultados en los que aparezcan estas tres palabras siempre juntas y en este orden específico. Por ejemplo: &#8220;Your love is the place where I come from&#8221;, &#8220;Teenage Fanclub&#8221;, &#8220;Songs from Northern Britain&#8221;&#8230; Buscar estas palabras sin comillas nos devolvería resultados completamente diferentes.</li>
<li><strong>&#8220;A B&#8221; C</strong>: queremos ver resultados en los que la primera y segunda palabra vayan seguidas y en ese orden, pero que también aparezca la tercera palabra en alguna parte, aunque no sea a continuación de la anterior. Por ejemplo: &#8220;Teenage Fanclub&#8221; letras canciones.</li>
</ul>
<h3>Truco 2: Eliminar resultados de la búsqueda (el guión)</h3>
<p>A veces lo que buscamos se parece o coincide demasiado con otras palabras y los resultados que nos ofrece el buscador no son útiles. Para eliminar alguna palabra de los resultados, es decir, para hacer que Google busque algo ignorando una palabra concreta, <strong>podemos utilizar el signo negativo o guión (-) justo delante de la palabra que queremos omitir</strong>. Así: A B -C</p>
<p>Ejemplos: </p>
<ul>
<li><strong>ono -yoko</strong>: mostrar resultados para la palabra &#8220;ono&#8221; siempre y cuando no aparezca la palabra &#8220;Yoko&#8221;</li>
<li><strong>pianista -pelicula</strong>: mostrar resultados para la palabra &#8220;pianista&#8221; siempre y cuando no aparezca la palabra &#8220;película&#8221;</li>
<li><strong>salsa -comida</strong>: queremos ver webs que hablen sobre la Salsa, pero intentando que nos muestre resultados sobre el género musical, no relacionados con la comida.</li>
</ul>
<h3>Truco 3: Búsquedas con comodín (el asterisco)</h3>
<p>De la misma manera, podemos utilizar un <strong>asterisco como comodín cuando no sabemos qué palabra utilizar, o bien porque nos sirve cualquier resultado</strong>. En el caso de Google, el asterisco nos sirve únicamente para sustituir palabras completas, pero no partes de éstas.</p>
<p>Por ejemplo, si buscamos &#8220;<strong>diseño * Mallorca</strong>&#8220;, Google nos mostrará resultados sustituyendo el asterisco por cualquier palabra que encuentre, como por ejemplo &#8220;diseño gráfico Mallorca&#8221;, &#8220;diseño Palma Mallorca&#8221;, &#8220;diseño web Mallorca&#8221;, etc.</p>
<p>El asterisco también es muy útil para completar una frase. Por ejemplo, &#8220;<strong>la miel es buena para *</strong>&#8221; nos devolverá resultados en los que aparezca esta frase con variaciones como &#8220;la miel es buena para calmar la tos&#8221;, &#8220;la miel es buena para el acné&#8221;, etc.</p>
<p>Otro ejemplo: &#8220;<strong>Google me ha * la vida</strong>&#8220;. Escrito tal cual, con las comillas y el asterisco, encontraremos páginas web donde se utilice exactamente este frase, sustituyendo el comodín por cualquier palabra o grupo de palabras.</p>
<p>Se puede ir incluso más allá y utilizar más de un asterisco. Por ejemplo, si buscamos &#8220;<strong>cada vez que * me dan ganas de *</strong>&#8221; encontraremos todo tipo de afirmaciones que coinciden con la estructura de nuestra frase.</p>
<h3>Truco 4: Limitar resultados a una web o tipo de dominio (site:)</h3>
<p>Es posible limitar nuestra búsqueda a una web determinada o a un tipo de dominio (.com, .es. mx, etc.). Esta opción es mucho más útil de lo que puede parecer, porque muchas veces recordamos el sitio web donde encontramos algo, pero no la página exacta. En estos casos <strong>podemos concretar más la búsqueda añadiendo &#8220;site:&#8221;</strong> delante o detrás del resto de palabras.</p>
<p>Esto nos permite utilizar toda la potencia de Google como si se tratara de un buscador interno de una web, sin tener que instalar nada. Por ejemplo, muchas veces utilizamos el sistema nativo de búsquedas de WordPress, que es muy limitado. Con este truco podemos saltarnos esta limitación y encontrar exactamente lo que buscamos dentro de una web determinada.</p>
<p>Ejemplos:</p>
<ul>
<li><strong>informática site:.es</strong><br />
Pongamos que queremos encontrar webs sobre informática, pero nos aparecen muchos resultados de páginas y servicios que no están en España. Añadiendo &#8220;site:.es&#8221; a nuestra búsqueda, Google limitará los resultados a los dominios acabados en &#8220;.es&#8221;.</li>
<li><strong>wordpress site:danielnabil.com</strong><br />
Además de buscar por tipo de dominio, podemos especificar una página web completa. En este caso, buscará la palabra &#8220;wordpress&#8221; sólo en el contexto de esta web. Es decir, Google hará de buscador interno, incluso aunque la web no tenga esta función.</li>
</ul>
<h3>Truco 5: Palabras relacionadas, sinónimos (la virgulilla)</h3>
<p>Añadiendo el símbolo &#8220;~&#8221; (la tilde de la letra &#8220;ñ&#8221;) delante de una palabra le estamos diciendo a Google que <strong>busque esa palabra y también otras relacionadas o sinónimos</strong>. Por ejemplo, si escribimos &#8220;páginas web ~baratas&#8221; (las comillas no son necesarias en este caso) se incluirán resultados como &#8220;páginas webs económicas&#8221;, &#8220;páginas web asequibles&#8221;, &#8220;páginas web gratis&#8221;, etc.</p>
<h3>Truco 6: Especificar el tipo de archivo (filetype:)</h3>
<p>Puede darse el caso que lo que estemos buscando esté incluído en un tipo de archivo concreto, por ejemplo PDFs, documentos de Word, Pages, presentaciones de Powerpoint o Keynote, etc. <strong>Con &#8220;filetype:&#8221; acotamos la búsqueda a archivos y documentos</strong>, dejando fuera los resultados cuyo contenido esté escrito directamente en la página web.</p>
<p>Ejemplos:</p>
<ul>
<li><strong>filetype:doc fashion madrid</strong><br />
En este caso le estamos diciendo a Google que busque en documentos de Word las palabras &#8220;fashion&#8221; y &#8220;madrid&#8221; (no seguidas, porque no las hemos entrecomillado).</li>
<li><strong>filetype:pdf &#8220;huerto * ecologico&#8221;</strong><br />
Aquí combinamos la búsqueda por tipo de archivo con el comodín. En este caso queremos encontrar concretamente documentos PDF que contengan la palabra &#8220;huerto&#8221; seguida de cualquier otra palabra (comodín) y seguido de &#8220;ecologico&#8221;, en este orden preciso. Esto nos mostrará resultados para &#8220;huerto urbano ecológico&#8221;, &#8220;huerto municipal ecológico&#8221;, etc.</li>
</ul>
<h3>Especificar ubicación (intitle:)</h3>
<p>Aunque puede parecer raro, especificar a Google que busque solamente en el título de una página (es decir, en el contenido de la etiqueta &#8220;title&#8221;, dentro de la estructura HTML) nos da la posibilidad de filtrar aun más los resultados. Por ejemplo:</p>
<ul>
<li><strong>intitle:&#8221;web oficial&#8221;</strong> nos devolverá resultados de todas las páginas en las que aparecen las palabras &#8220;web oficial&#8221; en el título.</li>
</ul>
<h2>Otras curiosidades</h2>
<p>Además de utilizar el buscador de Google como herramienta para encontrar lo que sea, tenemos a nuestra disposición otros recursos útiles para tareas rápidas, como realizar una operación matemática, convertir una moneda a otra, traducir y definir palabras, ver información meteorológica actualizada e incluso consultar la cartelera de películas de nuestra ciudad.</p>
<h3>Google como calculadora</h3>
<p>Para realizar operaciones matemáticas rápidas nada mejor que utilizar programas tipo lanzador de aplicaciones, como <a href="http://www.alfredapp.com/">Alfred</a> o <a href="http://qsapp.com/">Quicksilver</a>. Pero si solo tenemos acceso a un nagevador, Google nos permite trabajar con su calculadora interna, tan completa como cualquier otra. Para ello basta introducir la operación (por ejemplo: 256*256) y el buscador nos mostrará el resultado, acompañado de una calculadora completa (tanto para operaciones básicas como complejas).</p>
<h3>Google como conversor de divisas</h3>
<p>También es posible utilizar el buscador para tener una orientación sobre las conversiones entre monedas. Para ello solo tenemos que escribir las cantidades y el tipo de moneda. Por ejemplo: &#8220;99 dolares a euros&#8221;, &#8220;25 euros a dolares&#8221; (las comillas no son necesarias).</p>
<h3>Google como traductor y diccionario</h3>
<p>Aparte del servicio de <a href="http://translate.google.es/?hl=es">Google Translate</a>, podemos utilizar el buscador para hacer traducciones rápidas y búsquedas de sinónimos. Para ello solo tenemos que escribir &#8220;traducir X&#8221;. Por ejemplo &#8220;traducir book&#8221; (no es necesario utilizar comillas).</p>
<p>Lógicamente, los resultados no siempre serán buenos ni estarán disponibles, especialmente para palabras o expresiones del lenguaje coloquial. Pero para palabras comunes, es una buena opción, y sobre todo muy rápida.</p>
<h3>Encontrar definiciones</h3>
<p>Si necesitamos una definición rápida, basta escribir &#8220;definir X&#8221; y Google nos mostrará, siempre que esté disponible, una explicación breve. Por ejemplo, si escribimos &#8220;definir rio&#8221;, el resultado será una definición rápida de la accepción más utilizada, seguida de un enlace a la Wikipedia.</p>
<h3>Google y el tiempo</h3>
<p>Google ofrece resultados sobre consultas como la información meteorológica. Por ejemplo, si buscamos &#8220;tiempo mallorca&#8221;, Google nos mostrará un resumen con datos sobre la temperatura, viento, humedad y pronóstico para los próximos días, todo ello sin tener que entrar en ninguna web. Al principio era necesario ponerlo en inglés (weather:mallorca), pero hoy en día el buscador ya nos entiende también al ponerlo en español.</p>
<h3>Google como guía de cines</h3>
<p>Cuando necesitamos saber en qué cine de nuestra ciudad hacen alguna película, en vez de comprar el periódico o consultar alguna web, podemos buscar simplemente &#8220;películas mallorca&#8221; y Google nos ofrecerá una lista detallada de salas y películas, especificando la duración de la película, los horarios de los pases, el reparto e incluso, dependiendo de la ciudad, la posibilidad de comprar entradas para un pase determinado.</p>
<h3>Más información</h3>
<p>Existen muchos más trucos para aprovechar toda la potencia del buscador de Google, pero si es la primera vez que oyes hablar de todo esto, es mejor no intentar conocerlos todos a la vez. A continuación encontrarás algunos enlaces para aprender más:</p>
<ul>
<li>Ayuda básica para las búsquedas: <a href="http://www.google.com/support/websearch/bin/answer.py?answer=134479">http://www.google.com/support/websearch/bin/answer.py?answer=134479</a></li>
<li>Ayuda de Google relacionada con las búsquedas: <a href="http://www.google.com/support/websearch/bin/answer.py?answer=136861">http://www.google.com/support/websearch/bin/answer.py?answer=136861</a></li>
<li>Consejos para mejorar tus búsquedas: <a href="http://www.google.com/help/features.html">http://www.google.com/help/features.html</a></li>
<li>Google search tips: <a href="http://www.mapelli.info/ultimate-google-search-tips-guide">http://www.mapelli.info/ultimate-google-search-tips-guide</a></li>
<li>Consejos para buscar en Google: <a href="http://www.microsiervos.com/archivo/internet/consejos-para-buscar-en-google.html">http://www.microsiervos.com/archivo/internet/consejos-para-buscar-en-google.html</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.danielnabil.com/blog/consejos-trucos-busquedas-google/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Libros y recursos gratuitos sobre diseño y desarrollo web</title>
		<link>http://www.danielnabil.com/blog/ebooks-libros-gratuitos-sobre-diseno-desarrollo-web/</link>
		<comments>http://www.danielnabil.com/blog/ebooks-libros-gratuitos-sobre-diseno-desarrollo-web/#comments</comments>
		<pubDate>Sat, 06 Apr 2013 13:59:44 +0000</pubDate>
		<dc:creator>Daniel</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[Diseño web]]></category>
		<category><![CDATA[HTML/CSS]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[SEO]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://www.danielnabil.com/?p=581</guid>
		<description><![CDATA[Cada vez que alguien me pregunta si conozco algún libro, a ser posible gratuito, sobre diseño web, HTML, CSS, desarrollo en WordPress, SEO, Javascript, etc. tengo que ponerme a buscar entre libros en papel, PDFs, eBooks, favoritos&#8230; Así que voy a ir haciendo una lista pública con los libros que ... <a href="http://www.danielnabil.com/blog/ebooks-libros-gratuitos-sobre-diseno-desarrollo-web/" class="seguir"><img src="/wp-content/themes/dn2/img/mas.png" alt="" /></a>]]></description>
				<content:encoded><![CDATA[<p>Cada vez que alguien me pregunta si conozco algún libro, a ser posible gratuito, sobre diseño web, HTML, CSS, desarrollo en WordPress, SEO, Javascript, etc. tengo que ponerme a buscar entre libros en papel, PDFs, eBooks, favoritos&#8230; Así que voy a ir haciendo una lista pública con los libros que me parecen más interesantes, tanto en inglés como en español.</p>
<p>Además, las recopilaciones de libros gratuitos que circulan por Internet suelen estar bastante anticuadas (por ejemplo, con libros que son gratis simplemente porque han quedado obsoletos). En Internet hay un montón de información en HTML, pero también es posible encontrar eBooks y PDFs muy recomendables, y sobre todo actuales, sobre estos temas. </p>
<h2>Sobre HTML y CSS</h2>
<ul>
<li>
<h3>HTML5 For Web Designers</h3>
<p>Guía de usuario con ejemplos sobre lo que los desarrolladores y diseñadores web necesitan saber sobre HTML5 y cómo utilizarlo hoy en día en los navegadores actuales.</p>
<p>Autor: Jeremy Keith (A book apart)<br />
Disponible en: web, papel, eBook<br />
Tipo: versión web gratuita (versiones disponibles de pago en papel, ebook, PDF y ePub)<br />
URL: <a href="http://html5forwebdesigners.com/">http://html5forwebdesigners.com/</a>
</li>
<li>
<h3>Guide to HTML &#038; CSS</h3>
<p>Una guía para aprender HTML y CSS muy completa y bien presentada. Trata tanto temas básicos (como aprender la estructura de una página HTML, etiquetas, utilización de selectores CSS, etc.) hasta el uso de transiciones y transformaciones, posicionamiento avanzado, trabajar con preprocesadores o aprender a hacer diseños web adaptativos).</p>
<p>Autor: Shay Howe<br />
Tipo: página web (gratuito)<br />
Para principiantes: <a href="http://learn.shayhowe.com/advanced-html-css/">http://learn.shayhowe.com/html-css/</a><br />
Para usuarios más avanzados: <a href="http://learn.shayhowe.com/advanced-html-css/">http://learn.shayhowe.com/advanced-html-css/</a>
</li>
<li>
<h3>The Web Book. How to create Web sites and applications with HTML, CSS, Javascript, PHP and MySQL</h3>
<p>Una guía muy completa sobre todos los aspectos relacionados con la creación de sitios web, desde el alta y gestión de dominios y servidores hasta nociones básicas de optimización en buscadores (SEO), PHP, Javascript, trabajo con formularios, copias de seguridad, cómo aceptar pagos online, etc.</p>
<p>Autor: Robert Schifreen (Oakworth Business Publishing Ltd.)<br />
Disponible en: PDF<br />
Tipo: gratuito para uso personal<br />
URL: <a href="http://www.itp.uzh.ch/~suzanne/ebooks/The%20Web%20Book-A4-HM.pdf">http://www.itp.uzh.ch/~suzanne/ebooks/The%20Web%20Book-A4-HM.pdf</a>
</li>
</ul>
<h2>Sobre WordPress</h2>
<ul>
<li>
<h3>Locking Down WordPress</h3>
<p>Todo lo que necesitas saber para asegurarte de que tienes WordPress bajo control.</p>
<p>Autor: Rachel Baker, Brad Williams, John Ford (Code Poet)<br />
Disponible en: PDF, Kindle, ePub<br />
Tipo: gratuito (es necesario crear una cuenta)<br />
URL: <a href="http://build.codepoet.com/2012/07/10/locking-down-wordpress/">http://build.codepoet.com/2012/07/10/locking-down-wordpress/</a>
</li>
<li>
<h3>WordPress Meet Responsive Design</h3>
<p>Aprende cómo utilizan los profesionales las media queries de CSS, imágenes fluidas y retículas para crear webs adaptativas en WordPress.</p>
<p>Autor: Chris Coyier, Ian Stewart, Sara Cannon (Code Poet)<br />
Disponible en: PDF, Kindle, ePub<br />
Tipo: gratuito (es necesario crear una cuenta)<br />
URL: <a href="http://build.codepoet.com/2012/05/11/wordpress-meet-responsive-design/">http://build.codepoet.com/2012/05/11/wordpress-meet-responsive-design/</a>
</li>
<li>
<h3>WordPress Multisite 101</h3>
<p>Un libro a modo de tutorial básico para aprender a trabajar con WordPress Multiusuario: requisitos necesarios, configuración de la red, gestión de sitios, gestión de usuarios, plugins, trabajo con temas, mapeo de dominios&#8230;</p>
<p>Autor: Mika Epstein, Andrea Rennick<br />
Disponible en: PDF, ePub, mobi, Amazon<br />
Tipo: PDF gratuito (con posibilidad de donación a los autores)<br />
URL: <a href="http://halfelf.org/ebooks/wordpress-multisite-101/">http://halfelf.org/ebooks/wordpress-multisite-101/</a>
</li>
<li>
<h3>WordPress Multisite 110. Troubleshooting, debugging, testing and more</h3>
<p>Segunda parte del anterior, pensado para los que quieren ir un paso más allá de la simple instalación, configuración y edición básica. Para aprender a gestionar de manera avanzada y entender cómo funciona WordPress multiusuario: manipulaciones del servidor, copias de seguridad, plugins&#8230;</p>
<p>Autor: Mika Epstein, Andrea Rennick<br />
Disponible en: PDF, ePub, mobi, Amazon<br />
Tipo: PDF gratuito (con posibilidad de donación a los autores)<br />
URL: <a href="http://halfelf.org/ebooks/wordpress-multisite-110/">http://halfelf.org/ebooks/wordpress-multisite-110/</a>
</li>
<li>
<h3>Easy WordPress Guide</h3>
<p>Manual de WordPress actualizado para la versión 3.5 y enfocado, más que a diseñadores y desarrolladores, a la gestión de contenidos para usuarios principiantes. Con esta guía podremos aprender cómo funciona WordPress: creación de páginas y entradas, enlaces, insertar imágenes y galerías de fotos, incrustar vídeos, categorías y etiquetas, widgets, plugins, etc.</p>
<p>Autor: Anthony Hortin (Maddison Designs)<br />
Disponible en: iBookstore, Amazon, Nook, PDF y Word (doc)<br />
Tipo: versión web, PDF y Word gratuitos<br />
URL: <a href="http://easywpguide.com/">http://easywpguide.com/</a>
</li>
</ul>
<h2>Posicionamiento web y optimización en buscadores (SEO)</h2>
<ul>
<li>
<h3>Google Search Engine Optimization Starter Guide</h3>
<p>Guía para entender cómo funcionan los buscadores y cómo mejorar el posicionamiento de una web: accesibilidad, nociones básicas de SEO, etiquetas de cabecera, estructura interna, URLs, optimización de contenido, enlaces internos, tratamiento de imágenes, títulos, uso de robots.txt, nofollow, el SEO en dispositivos móviles, análisis, utilización de herramientas para webmasters&#8230;</p>
<p>Autor: Google<br />
Tipo: PDF gratuito<br />
URL:<br />
- En español: <a href="http://static.googleusercontent.com/external_content/untrusted_dlcp/www.google.es/es/es/webmasters/docs/guia_optimizacion_motores_busqueda.pdf">http://static.googleusercontent.com/&#8230;/guia_optimizacion_motores_busqueda.pdf</a><br />
- En inglés: <a href="http://static.googleusercontent.com/external_content/untrusted_dlcp/www.google.com/en//webmasters/docs/search-engine-optimization-starter-guide.pdf">http://static.googleusercontent.com/&#8230;/search-engine-optimization-starter-guide.pdf</a>
</li>
<li>
<h3>The beginners guide to SEO</h3>
<p>Manual de iniciación para principiantes. Una guía muy completa que cubre las estrategias fundamentales para hacer sitios web que funcionen correctamente en los buscadores.</p>
<p>Autor: SEOmoz<br />
Tipo: versión web y PDF gratuitos<br />
URL: <a href="http://www.seomoz.org/beginners-guide-to-seo">http://www.seomoz.org/beginners-guide-to-seo</a>
</li>
</ul>
<h2>General / Otros temas</h2>
<ul>
<li>
<h3>jQuery Fundamentals</h3>
<p>Guía para aprender los conceptos básicos de jQuery. Incluye ejemplos interactivos para demostrar y practicar lo aprendido en cada capítulo.</p>
<p>Autor: Rebecca Murphey<br />
Tipo: gratuito (versión web)<br />
URL: <a href="http://jqfundamentals.com/">http://jqfundamentals.com/</a>
</li>
<li>
<h3>20 cosas que he aprendido sobre Internet y los navegadores</h3>
<p>Un libro para leer online sobre Internet, CSS, HTML y Javascript, cookies, navegadores&#8230;</p>
<p>Autor: Google<br />
Tipo: gratuito (versión web)<br />
URL: <a href="http://www.20thingsilearned.com/es-ES/home">http://www.20thingsilearned.com/es-ES/home</a>
</li>
<li>
<h3>Best of Smashing Magazine (5th Anniversary eBook)</h3>
<p>Este libro está basado en los artículos más útiles e interesantes publicados en esta popular revista online en sus primeros cinco años en la red.</p>
<p>Autor: Varios autores (Smashing Magazine)<br />
Disponible en: iTunes, PDF, ePUB, Mobipocket<br />
URL: <a href="http://www.smashingmagazine.com/2011/09/08/to-five-smashing-years-and-a-free-anniversary-ebook-treat/">http://www.smashingmagazine.com/&#8230;/free-anniversary-ebook-treat/</a>
</li>
</ul>
<h2>Sobre Javascript, PHP, VIM&#8230;</h2>
<ul>
<li>
<h3>Eloquent JavaScript. A Modern Introduction to Programming</h3>
<p>Introducción al lenguaje JavaScript y a la programación en general.</p>
<p>Autor: Marijn Haverbeke<br />
Tipo: versión HTML gratuita, Amazon<br />
URL: <a href="http://eloquentjavascript.net/">http://eloquentjavascript.net/</a>
</li>
<li>
<h3>VIM Book</h3>
<p>Edición de archivos, búsquedas, comandos y todo lo necesario para aprender a utilizar VIM, uno de los editores de texto más potentes que existen.</p>
<p>Tipo: PDF gratuito<br />
URL: <a href="ftp://ftp.vim.org/pub/vim/doc/book/vimbook-OPL.pdf">ftp://ftp.vim.org/pub/vim/doc/book/vimbook-OPL.pdf</a>
</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.danielnabil.com/blog/ebooks-libros-gratuitos-sobre-diseno-desarrollo-web/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Cómo forzar la comprobación de actualizaciones de plugins en WordPress</title>
		<link>http://www.danielnabil.com/blog/forzar-comprobacion-actualizaciones-plugins-wordpress/</link>
		<comments>http://www.danielnabil.com/blog/forzar-comprobacion-actualizaciones-plugins-wordpress/#comments</comments>
		<pubDate>Tue, 05 Feb 2013 12:48:10 +0000</pubDate>
		<dc:creator>Daniel</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://www.danielnabil.com/?p=600</guid>
		<description><![CDATA[Como máximo cada 12 horas WordPress revisa automáticamente las versiones tanto de plugins como de temas y del propio sistema y las compara con la versión alojada en el repositorio de WordPress.org, para asegurarse de que tenemos toda nuestra instalación bien actualizada.
Cuando detecta que existe una actualización, nos lo notifica ... <a href="http://www.danielnabil.com/blog/forzar-comprobacion-actualizaciones-plugins-wordpress/" class="seguir"><img src="/wp-content/themes/dn2/img/mas.png" alt="" /></a>]]></description>
				<content:encoded><![CDATA[<p>Como máximo cada 12 horas WordPress revisa automáticamente las versiones tanto de plugins como de temas y del propio sistema y las compara con la versión alojada en el repositorio de WordPress.org, para asegurarse de que tenemos toda nuestra instalación bien actualizada.</p>
<p>Cuando detecta que existe una actualización, nos lo notifica a través del sistema de avisos, perfectamente conocidos para cualquiera que haya administrado una instalación de WordPress.</p>
<p>Aunque esto es más que suficiente en la mayoría de los casos, hay veces en que puede ser necesario <strong>forzar esta comprobación</strong>, bien porque somos el propio desarrollador de un plugin, por ejemplo, o bien porque sabemos que existe una actualización más reciente y necesitamos instalarla para poder continuar con nuestro trabajo. </p>
<p>Una solución podría ser simplemente volver a descargar la versión más actual y sustituirla por la anterior a través de FTP. Pero no es la única solución, ni la más rápida.</p>
<h2>1. Desde el area de administración</h2>
<p>La primera opción debería ser simplemente ir a <strong>Escritorio > Actualizaciones > Comprobar de nuevo</strong> y ver si así aparecen los avisos de nuevas actualizaciones. </p>
<p>Esto lógicamente habrá que hacerlo con una cuenta de administrador (o que tenga privilegios suficientes para actualizar el sistema). </p>
<p>Desde esta página podremos saber también cuándo fue la última vez que se examinó el sistema.</p>
<h2>2. Accediendo a la base de datos</h2>
<p>Cada vez que WordPress hace una comprobación de este tipo guarda la información en una entrada de tipo &#8220;transient&#8221; llamada &#8220;update_plugins&#8221;. Si accedemos a la bases de datos (desde un gestor como phpMyAdmin, por ejemplo) podremos hacer una consulta SQL para vaciar esta opción y así hacer creer al sistema que es necesario hacer una nueva comprobación:</p>
<p>Vaciamos la fila &#8220;_site_transient_update_plugins&#8221;, en la tabla &#8220;wp_options&#8221; (si nuestro prefijo es diferente a &#8220;wp_&#8221;, el que se instala por defecto, habrá que sustituirlo aquí también):</p>
<pre class="brush: sql; title: ; notranslate">
update wp_options set option_value='' where option_name='_site_transient_update_plugins';
</pre>
<p>En el caso de que estemos utilizando WordPress Network (multisite), la consulta será diferente:</p>
<pre class="brush: sql; title: ; notranslate">
update wp_sitemeta set meta_value='' where meta_key='_site_transient_update_plugins';
</pre>
<p>Después de esto solo tendremos que acceder al panel de administración y volver a visitar la página de plugins.</p>
<p>Por otra parte, si lo que queremos es <a href="http://codex.wordpress.org/FAQ_Troubleshooting#An_update_was_just_released.2C_so_why_does_my_blog_not_recognize_the_update_is_available.3F">forzar la comprobación de actualizaciones del sistema</a> (no de los plugins), lo que tenemos que borrar es el contenido de la opción &#8220;update_core&#8221;, en la tabla &#8220;wp_options&#8221;.</p>
<h2>3. Instalando el plugin &#8220;Force Update Check&#8221;</h2>
<p><a title="Force Update Check" href="http://w-shadow.com/blog/2009/10/01/force-update-check-plugin/">Este plugin</a> sirve precisamente para forzar la comprobación de actualizaciones, para no tener que esperar hasta 12 horas a que el sistema haga su siguiente chequeo automático.</p>
<p>Lo que hace esta extensión es resetear la información almacenada relacionada con las actualizaciones de plugins y vuelve a poner en marcha la comprobación.</p>
<h2>Desactivar las actualizaciones para temas y/o plugins privados</h2>
<p>Relacionado con todo esto, si estamos desarrollando un plugin o una plantilla de WordPress para un cliente determinado y no queremos que el sistema haga estas comprobaciones de actualizaciones (en otras palabras, si estamos montando algo que no está pensado para ser distribuido a nivel general), conviene leer esto:</p>
<p><a href="http://markjaquith.wordpress.com/2009/12/14/excluding-your-plugin-or-theme-from-update-checks/">Excluding your plugin or theme from update checks</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.danielnabil.com/blog/forzar-comprobacion-actualizaciones-plugins-wordpress/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Añadir el total de entradas a la nube de etiquetas de WordPress con jQuery</title>
		<link>http://www.danielnabil.com/blog/nube-etiquetas-wordpress-anadir-total-entradas/</link>
		<comments>http://www.danielnabil.com/blog/nube-etiquetas-wordpress-anadir-total-entradas/#comments</comments>
		<pubDate>Thu, 01 Nov 2012 09:55:46 +0000</pubDate>
		<dc:creator>Daniel</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://www.danielnabil.com/?p=591</guid>
		<description><![CDATA[Algo frecuente al utilizar la nube de etiquetas de WordPress, tanto si es a través de un widget como si añadimos el código a mano, es querer mostrar el número de entradas guardadas dentro de cada etiqueta.
Se trata de algo que ya viene configurado por defecto, sin embargo es una ... <a href="http://www.danielnabil.com/blog/nube-etiquetas-wordpress-anadir-total-entradas/" class="seguir"><img src="/wp-content/themes/dn2/img/mas.png" alt="" /></a>]]></description>
				<content:encoded><![CDATA[<p>Algo frecuente al utilizar la <strong>nube de etiquetas de WordPress</strong>, tanto si es a través de un widget como si añadimos el código a mano, es querer mostrar el número de entradas guardadas dentro de cada etiqueta.</p>
<p>Se trata de algo que ya viene configurado por defecto, sin embargo es una información que, al menos hasta la versión actual (WordPress 3.4.2), queda relegada al atributo &#8220;title&#8221; de cada enlace, con lo cual el total no está accesible a simple vista, únicamente aparece al dejar el cursor unos segundos encima de cada etiqueta. En esta imagen se puede ver claramente el problema y lo que queremos conseguir:</p>
<p><img src="http://www.danielnabil.com/img/nube-etiquetas-wordpress.png" alt="Nube de etiquetas de WordPress" title="Dos versiones diferentes de la nube de etiquetas" width="487" height="350" class="alignnone size-full wp-image-592" style="margin-top:25px" /></p>
<p>Esto puede ser un inconveniente, por ejemplo, al visitar la web desde una tableta o dispositivo móvil, desde donde es más difícil acceder a elementos ocultos o que se activan con el estado &#8220;hover&#8221; del enlace.</p>
<p>Está claro que, dependiendo del tema de la web o del blog, este cambio puede no ser algo esencial, pero hay casos en los que podría ser una información importante para el usuario. Por ejemplo, una web o un directorio en el que las etiquetas se utilicen para clasificar las especialidades entre un listado de profesionales: psicólogos, psiquiatras, médicos, pediatras&#8230;</p>
<p>En este caso vamos a utilizar <strong>jQuery</strong> para conseguir lo que queremos, por varios motivos: porque WordPress ya incluye una versión de jQuery (o sea que seguramente no hace falta cargar nada que no se haya cargado ya) y porque podemos solucionarlo con muy pocas líneas de código.</p>
<h3>La nube de etiquetas</h3>
<p>La función <a href="http://codex.wordpress.org/Function_Reference/wp_tag_cloud">&#8220;nube de etiquetas&#8221; (wp_tag_cloud)</a> de WordPress nos permite presentar todas nuestras entradas publicadas clasificadas según sus etiquetas.</p>
<p>Podemos crear esta función simplemente activando el widget &#8220;Nube de etiquetas&#8221; o bien añadiendo la función directamente en nuestra plantilla:</p>
<pre class="brush: php; title: ; notranslate">
&lt;?php wp_tag_cloud(array(
	'smallest' =&gt; 12,
	'largest' =&gt; 12,
	'unit' =&gt; 'px',
	'number' =&gt; 0, // 0 = Mostrar todas
	'topic_count_text_callback' =&gt; 'prefix_tag_text_callback',
	'format' =&gt; 'list' // 'flat' (separadas por un espacio) o 'list' (en forma de lista)
	)); ?&gt;
</pre>
<p>A través de una serie de parámetros que esta función incluye, podemos personalizar este listado casi como queramos: especificar el tamaño de letra más pequeño (para las etiquetas poco utilizadas) y el más grande (para las más populares), la cantidad máxima de etiquetas, el formato, el símbolo de separación, etc. Puedes ver todas las posibilidades <a href="http://codex.wordpress.org/Function_Reference/wp_tag_cloud">en el Codex</a>.</p>
<h3>Modificamos la salida con jQuery</h3>
<p>Como ninguna de estas opciones nos permite cambiar la salida del total de entradas guardadas, vamos a tener que hacer algo más para modificarlo.</p>
<p>Una vez que tenemos la función &#8220;wp_tag_cloud()&#8221; correctamente configurada, solo tenemos que acceder a los elementos creados y hacer algunos reajustes. Y para eso, nada mejor que jQuery:</p>
<pre class="brush: jscript; title: ; notranslate">
&lt;script&gt;
// Añadimos contador de temas a la nube de etiquetas de WordPress (wp_tag_cloud)
$(document).ready(function() { 
   var etiquetas = $('#sidelist .wp-tag-cloud a'); // Cambiar los selectores CSS según el caso
   etiquetas.each(function() {
	   var title = $(this).attr('title');
	   var total = parseInt(title);
	   $(this).after('&lt;span class=&quot;total&quot;&gt; (' + total + ')&lt;/span&gt;');
   });
});
&lt;/script&gt;
</pre>
<h3>Explicación del código</h3>
<p>Es muy importante saber lo que estamos haciendo. No basta con copiar y pegar, especialmente cuando estamos cambiando, aunque sea ligeramente, una función nativa del sistema (técnicamente en este caso no estamos cambiando la función, sólo la salida final, después de que se haya cargado todo el contenido).</p>
<ul>
<li>Linea 3: Empezamos a trabajar una vez cargado el documento. En este caso es muy importante porque según en qué momento lleguemos, el número total de etiquetas podrían no haberse cargado aun.</li>
<li>Linea 4: Especificamos los selectores CSS que nos interesan, en este caso, los elementos &#8220;a&#8221; (enlaces) que están dentro del bloque con la clase &#8220;wp-tag-cloud&#8221; que hay en la columna lateral (sidebar). En muchos casos funcionará tal como está, pero conviene asegurarse. Guardamos estos links en una variable, para ganar rapidez y hacer el código más legible</li>
<li>Linea 5: Cada vez que se encuentre una etiqueta&#8230;</li>
<li>Linea 6: Guardamos el contenido del atributo &#8220;title&#8221; en una variable (por ejemplo: &#8220;12 temas&#8221;)</li>
<li>Linea 7: Como sólo nos interesa el total (en este caso no queremos la palabra &#8220;temas&#8221;), eliminamos el resto con &#8220;parseInt&#8221; y lo guardamos en una variable (ahora nos queda &#8220;12&#8243;)</li>
<li>Linea 8: Finalmente adjuntamos el número total justo después del enlace, entre etiquetas &#8220;span&#8221;, para poder darles estilo con CSS más tarde.</li>
</ul>
<h3>Cómo cambiar la palabra &#8220;temas&#8221; en la nube de etiquetas</h3>
<p>Para personalizar aun más nuestro trabajo, además de cambiar la salida del total de etiquetas podemos fácilmente sustituir el texto. En el ejemplo anterior lo hemos eliminado con jQuery, pero si lo queremos mantener, podemos cambiarlo por otra palabra.</p>
<p>Por defecto en las versión oficial de WordPress en castellano la palabra &#8220;items&#8221; de la nube de etiquetas se traduce por &#8220;temas&#8221;. Según el objetivo de nuestra web, puede ser interesante cambiarlo por algo como &#8220;Ciudades&#8221;, &#8220;Profesionales&#8221;, &#8220;Grupos&#8221;, o cualquier otra cosa.</p>
<p>Para ello, primero tendremos que añadir esta función en el archivo <code>functions.php</code>. Aquí es donde cambiamos la palabra &#8220;tema&#8221; (en singular y en plural) por lo que queramos:</p>
<pre class="brush: php; title: ; notranslate">
&lt;?php // Funcion para sustituir 'temas' por 'ciudades' en wp_tag_cloud
      function miprefijo_tag_text_callback($count) {
         return sprintf(_n('%s ciudad', '%s ciudades', $count), number_format_i18n($count)); 
      } ?&gt;
</pre>
<p>Después, en la plantilla donde se encuentra la llamada a &#8220;wp_tag_cloud()&#8221;, añadimos el nombre de la función que acabamos de crear:</p>
<pre class="brush: php; title: ; notranslate">
&lt;?php // Adjuntamos la función para cambiar la palabra &quot;temas&quot;
      wp_tag_cloud(array(
      'topic_count_text_callback' =&gt; 'miprefijo_tag_text_callback'
      )); ?&gt;
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.danielnabil.com/blog/nube-etiquetas-wordpress-anadir-total-entradas/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mostrar contenido en WordPress según el usuario que está conectado</title>
		<link>http://www.danielnabil.com/blog/mostrar-contenidos-wordpress-usuarios-conectados/</link>
		<comments>http://www.danielnabil.com/blog/mostrar-contenidos-wordpress-usuarios-conectados/#comments</comments>
		<pubDate>Sat, 20 Oct 2012 13:53:40 +0000</pubDate>
		<dc:creator>Daniel</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://www.danielnabil.com/?p=585</guid>
		<description><![CDATA[A raiz de un comentario en esta página, pensé que sería interesante compartir una manera rápida de poder separar los contenidos de una web basada en WordPress según el usuario que está conectado.
Por ejemplo, pongamos que quiero mostrar una barra lateral condicional para mis usuarios, una función, o simplemente añadir ... <a href="http://www.danielnabil.com/blog/mostrar-contenidos-wordpress-usuarios-conectados/" class="seguir"><img src="/wp-content/themes/dn2/img/mas.png" alt="" /></a>]]></description>
				<content:encoded><![CDATA[<p>A raiz de un comentario <a href="http://www.danielnabil.com/blog/como-personalizar-barra-herramientas-wordpress-3-3/">en esta página</a>, pensé que sería interesante compartir una manera rápida de poder <strong>separar los contenidos de una web basada en WordPress según el usuario que está conectado</strong>.</p>
<p>Por ejemplo, pongamos que quiero mostrar una barra lateral condicional para mis usuarios, una función, o simplemente añadir una nota o aviso dirigida a alguien en concreto.</p>
<p>Conviene aclarar que cuando hablamos de &#8220;usuarios&#8221; nos referimos a usuarios de WordPress, es decir, que están dados de alta en el sistema, sea con el rol de administrador, editor, autor, colaborador o suscriptor (no usuarios de la web en general).</p>
<p>La versatilidad de WordPress en cuanto a la gestión de usuarios es muy completa, por lo que para hacer este tipo de ajustes en principio no necesitamos ningún plugin. En realidad es muy fácil de conseguir, siempre y cuando nos encontremos cómodos editando las plantillas de WordPress y ajustando algunos detalles básicos en la lógica condicional de PHP.</p>
<p>Vamos a ver algunos ejemplos.</p>
<h3>Mostrar u ocultar contenidos según el nombre o ID de cada usuario</h3>
<p>Para empezar podemos utilizar la función <a href="http://codex.wordpress.org/Function_Reference/get_currentuserinfo">get_currentuserinfo()</a>, que nos permite acceder a información del usuario como su nombre, su número de identificador, su dirección de email, etc.</p>
<pre class="brush: php; title: ; notranslate">
&lt;?php // Accedemos a la variable global
	  global $current_user;
	  
	  // Obtenemos la informacion del usuario conectado y asignamos los valores a las variables globales
	  // Mas info sobre 'get_currentuserinfo()': 
	  // http://codex.wordpress.org/Function_Reference/get_currentuserinfo
	  get_currentuserinfo();
	  
	  // Guardamos el nombre del usuario en una variable
	  $usuario = esc_attr($current_user-&gt;user_login);

	  // Condicionales: mostramos contenido segun el nombre de cada usuario	  
	  if ($usuario === 'Admin') {
		  // Aqui incluimos el contenido para el usuario 'Admin'
	  } elseif ($usuario === 'Daniel') {
		  // Aqui incluimos el contenido para el usuario 'Daniel' 
	  } else {
		  // Aqui incluimos el contenido para el resto de usuarios y visitantes
	  } 
?&gt;
</pre>
<p>Podríamos añadir el código anterior en la plantilla &#8220;sidebar.php&#8221;, o &#8220;header.php&#8221; para dar la bienvenida a cada usuario llamándole por su nombre, o por ejemplo para mostrar una foto diferente según el usuario. Las posibilidades dependen de la imaginación de cada uno.</p>
<p>Lo mismo se puede hacer si, en vez de diferenciar el contenido según el nombre, queremos hacerlo según su número de identificador (ID), su dirección de correo o su nombre de pantalla. Por ejemplo, para mostrar contenido diferente según el ID de cada usuario:</p>
<pre class="brush: php; title: ; notranslate">
&lt;?php 
$user_id = get_current_user_id();
if ( is_user_logged_in() ) {
     if ( 2 == $user_id ) {
	// Contenido exclusivo para el usuario con ID=2
     } elseif ( 3 == $user_id ) {
	// Contenido exclusivo para el usuario con ID=3
     } else {
	// Contenido para el resto de usuarios registrados
        // Cualquier ID menos los anteriores (2 y 3)
     }
} else {
     // Contenido para los usuarios que no están registrados
}
?&gt;
</pre>
<h3>Condicionar los contenidos según el rol y permisos del usuario</h3>
<p>Separar los contenidos de nuestra web según el rol o los privilegios de cada usuario es aun más fácil, gracias al sistema de <a href="http://codex.wordpress.org/Roles_and_Capabilities">roles y capacidades</a> que WordPress incluye desde la versión 3.0:</p>
<pre class="brush: php; title: ; notranslate">
&lt;?php if (current_user_can('update_core')) {
		  // Contenido para los usuarios con capacidad para actualizar el sistema (es decir, administradores)
		  echo 'Tú debes ser el administrador, ¿verdad?. Bienvenido a casa!';
     } elseif (current_user_can('edit_pages')) {
		  // Contenido para editores y usuarios con un rol superior (con capacidad para editar páginas)
		  echo 'Hola editores y administradores de esta web!';
     } ?&gt;
</pre>
<p>Antes de la inclusión de este sistema de capacidades, podíamos separar a los usuarios según su nivel. Aunque sigue funcionando en las versión actuales de WordPress, esta práctica se considera obsoleta:</p>
<pre class="brush: php; title: ; notranslate">
&lt;?php global $current_user;
	  get_currentuserinfo();
	  $usuario = esc_attr($current_user-&gt;user_level);
	  if ($usuario == 10) {
		  // Contenido para los usuarios cuyo nivel sea 10, es decir, administradores:
		  echo 'Tú debes ser el administrador, ¿verdad?. Bienvenido a casa! Tu nivel de usuario es: ' . $usuario;
	  } elseif ($usuario == 7) {
		  // Contenido para los usuarios cuyo nivel sea 7, es decir, editores:
		  echo 'Hola editor! Tu nivel de usuario es: ' . $usuario;
	  } elseif ($usuario == 2) {
		  // Contenido para los usuarios cuyo nivel sea 2, es decir, autores:
		  echo 'Hola autor! Tu nivel de usuario es: ' . $usuario;
	  } else {
		  
	  }
</pre>
<p>También podemos especificar niveles de usuarios utilizando otros <a href="http://php.net/manual/es/language.operators.comparison.php">operadores de comparación</a> como &#8216;<' (menor que) o '>&#8216; (mayor que):</p>
<pre class="brush: php; title: ; notranslate">
	  if ($usuario &gt;= 7) {
	  	echo '&lt;br /&gt;Esto es solo para administradores y editores. Nadie más puede verlo.';
	  } else {
		echo '&lt;br /&gt;Si estás viendo este mensaje es que no eres editor ni administrador de esta web.';
	  } ?&gt;
</pre>
<p>Pero recuerda, los <a href="http://codex.wordpress.org/User_Levels">niveles de usuario</a> dejaron de utilizarse hace bastante tiempo en favor del sistema de <a href="http://codex.wordpress.org/Roles_and_Capabilities">roles y capacidades</a>.</p>
<h3>Cómo crear un tipo de usuario nuevo (añadir rol)</h3>
<p>Algo muy útil que WordPress nos permite hacer fácilmente es <a href="http://codex.wordpress.org/Function_Reference/add_role">crear roles nuevos</a> y asignarles capacidades exclusivas. Por ejemplo, vamos a imaginarnos que tenemos un cliente que necesita acceder a una parte de la web (un widget, una barra lateral, un texto&#8230;):</p>
<pre class="brush: php; title: ; notranslate">
&lt;?php // Accedemos a la variable global creada por WordPress
	  global $wp_roles;
	  // Añadimos un nuevo rol para este tipo de usuarios
	  $wp_roles-&gt;add_role('cliente', 'Cliente', array(
      	'read' =&gt; true, // Les damos permisos de lectura (como a los suscriptores)
      	'edit_posts' =&gt; false, // No tienen permisos suficientes para editar entradas
      	'delete_posts' =&gt; false, // No tienen permisos suficientes para eliminar entradas
      	'leer_datos' =&gt; true // Creamos una capacidad nueva exclusiva para este rol
      ));
 
      if (current_user_can('leer_datos')) {
	      // Contenido exclusivo para el nuevo rol que hemos creado
	      echo '¡Hey, tú tienes permiso para leer esto!';
	  } else {
		  // Mostramos (o no) un contenido diferente para el resto de usuarios
	  }

	  // Para eliminar el nuevo rol que hemos creado:
	  // global $wp_roles;
	  // $wp_roles-&gt;remove_role('Cliente');
?&gt;
</pre>
<h3>Mostrar contenido según el estado (conectado/no conectado)</h3>
<p>De manera más general, podemos diferenciar a los usuarios conectados, del resto de personas que visitan nuestra web para mostrarles contenido, aplicar una funcionalidad concreta o cualquier cosa:</p>
<pre class="brush: php; title: ; notranslate">
&lt;?php if (is_user_logged_in()) {
		  // Contenido visible únicamente para usuarios conectados
	  } else {
		  // Contenido para el resto de visitas (o usuarios no conectados)
	  } 
?&gt;
</pre>
<p>Uno de los usos más frecuentes y útiles de esta función es cargar el código de seguimiento de estadísticas (Google Analytics, por ejemplo) solo para los usuarios que no están conectados:</p>
<pre class="brush: php; title: ; notranslate">
&lt;?php // Si el usuario no esta conectado...
	  if (!is_user_logged_in()) {
		  // Aqui copiamos el código de Analytics
	  } 
?&gt;
</pre>
<h3>Plugins relacionados</h3>
<ul>
<li><strong>Optional Content</strong>: Mostrar u ocultar contenido de manera condicional en una página o post (basado en shortcodes). Es decir, nos permite restringir el acceso de fragmentos de una entrada o página a un tipo de usuario.<br />
URL: <a href="http://wordpress.org/extend/plugins/optional-content/">http://wordpress.org/extend/plugins/optional-content/</a>
</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.danielnabil.com/blog/mostrar-contenidos-wordpress-usuarios-conectados/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Peticiones a la API de Twitter que dejan de funcionar</title>
		<link>http://www.danielnabil.com/blog/peticiones-api-twitter-dejan-de-funcionar/</link>
		<comments>http://www.danielnabil.com/blog/peticiones-api-twitter-dejan-de-funcionar/#comments</comments>
		<pubDate>Tue, 16 Oct 2012 10:49:09 +0000</pubDate>
		<dc:creator>Daniel</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://www.danielnabil.com/?p=583</guid>
		<description><![CDATA[Últimamente algunas funciones relacionadas con Twitter y su integración en páginas web o acceso a canales RSS a través de su API están fallando. En vez de aparecer, por ejemplo, una lista con las últimas actualizaciones de una cuenta, aparece un mensaje que dice &#8220;No public Twitter messages&#8220;, o simplemente ... <a href="http://www.danielnabil.com/blog/peticiones-api-twitter-dejan-de-funcionar/" class="seguir"><img src="/wp-content/themes/dn2/img/mas.png" alt="" /></a>]]></description>
				<content:encoded><![CDATA[<p>Últimamente algunas funciones relacionadas con Twitter y su integración en páginas web o acceso a canales RSS a través de su API están fallando. En vez de aparecer, por ejemplo, una lista con las últimas actualizaciones de una cuenta, aparece un mensaje que dice &#8220;<strong>No public Twitter messages</strong>&#8220;, o simplemente deja de funcionar y no muestra ningún tweet.</p>
<p>Esto también afecta a algunas extensiones (por ejemplo, plugins de WordPress) que se encargan de incrustar mensajes de Twitter en una web. Por ejemplo, el plugin &#8220;<a href="http://wordpress.org/extend/plugins/twitter-for-wordpress/">Twitter for WordPress</a>&#8221; hace tiempo que no se actualiza, y por tanto dejará de funcionar correctamente.</p>
<p>El problema es que en marzo de 2012 Twitter anunció que haría algunos cambios en su API, pero en algunos casos han seguido funcionando sin problema hasta octubre, fecha en la que han desactivado definitivamente las solicitudes obsoletas.</p>
<p>Para identificar estas URLs que hay que actualizar, tenemos que buscar direcciones de este tipo:</p>
<p><strong>http://twitter.com/statuses/user_timeline/nombre-usuario.json?callback&#8230;</strong></p>
<p>Y sustituirlas por:</p>
<p><strong>https://api.twitter.com/1/statuses/user_timeline/nombre-usuario.json?callback&#8230;</strong></p>
<p>Es decir, en la primera dirección, falta el subdominio &#8220;api&#8221; delante de &#8220;twitter.com&#8221;, así como el número de la versión que se utiliza.</p>
<p>Por ejemplo, si utilizábamos algo así para recuperar el último mensaje publicado en una cuenta de Twitter&#8230;</p>
<pre class="brush: jscript; title: ; notranslate">
&lt;script&gt;
// Esto ya no funciona
// Devuelve el tweet más recientes publicado por el usuario indicado
$.getJSON(&quot;http://twitter.com/statuses/user_timeline/nombre-usuario.json?callback=?&quot;, function(data) {
	$(&quot;#twitter&quot;).html(data[0].text);
});
&lt;/script&gt;
</pre>
<p>&#8230;Ahora tendremos que modificar la URL así:</p>
<pre class="brush: jscript; title: ; notranslate">
&lt;script&gt;
// Esto sí funciona
// Devuelve el tweet más recientes publicado por el usuario indicado
$.getJSON(&quot;https://api.twitter.com/1/statuses/user_timeline.json?screen_name=nombre-usuario&amp;callback=?&quot;, function(data) { 
	$(&quot;#twitter&quot;).html(data[0].text);
});
&lt;/script&gt;
</pre>
<p>Lo mismo pasa con cualquier solicitud al RSS de una cuenta:</p>
<p>Esto ya no funciona: &#8220;<em>http://twitter.com/statuses/user_timeline/daninabil.rss</em>&#8221;<br />
En cambio esto sí funciona: &#8220;<em>https://api.twitter.com/1/statuses/user_timeline/daninabil.rss</em>&#8221;</p>
<p>De todas formas, en la versión 1.1 dejarán de funcionar estas solicitudes al RSS del timeline público con &#8220;api.twitter.com/1/statuses/public_timeline&#8221;. O sea que aunque hagamos este cambio, eventualmente dejará de funcionar (concretamente, en marzo de 2013 dejaran de aceptarse las peticiones a la API versión 1).</p>
<p>Por ejemplo, en el caso del plugin &#8220;Twitter for WordPress&#8221;, para que siga funcionando tendremos que abrir el archivo &#8220;twitter.php&#8221; y sustituir la linea 54:</p>
<pre class="brush: php; title: ; notranslate">
&lt;?php 
// Esta URL ya no se utiliza
$messages = fetch_rss('http://twitter.com/statuses/user_timeline/'.$username.'.rss'); 
?&gt;
</pre>
<p>Por esta otra dirección:</p>
<pre class="brush: php; title: ; notranslate">
&lt;?php 
// URL actualizada según las recomendaciones de la API del servicio
$messages = fetch_rss('https://api.twitter.com/1/statuses/user_timeline/'.$username.'.rss'); 
?&gt;
</pre>
<p>En este caso se trata de un plugin que no se actualiza hace años, o sea que no conviene esperar a que el autor lo haga por nosotros.</p>
<h3>Resumiendo</h3>
<p>Si estás utilizando algún servicio relacionado con Twitter (incrustar mensajes en una página web, acceso a timelines de usuarios, a canales RSS de una cuenta, etc.) y en octubre de 2012 ha dejado de funcionar o aparecen mensajes como &#8220;No public Twitter messages&#8221;, lo más probable es que la URL que apunta a la API del servicio haya quedado obsoleta. Hay que sustituirla por la dirección actualizada, que debe incluir el subdominio &#8220;api&#8221; y el número de versión de ésta.</p>
<h3>Más información</h3>
<ul class="lessMargin">
<li><a href="https://dev.twitter.com/docs/deprecations/spring-2012">Twitter Deprecations &#8211; Spring 2012</a></li>
<li><a href="https://dev.twitter.com/blog/api-housekeeping">Twitter API housekeeping</a> (marzo 2012)</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.danielnabil.com/blog/peticiones-api-twitter-dejan-de-funcionar/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Sin acceso a entradas o páginas protegidas por contraseña tras actualizar a WordPress 3.4</title>
		<link>http://www.danielnabil.com/blog/error-acceso-entradas-protegidas-contrasena-wordpress-3-4/</link>
		<comments>http://www.danielnabil.com/blog/error-acceso-entradas-protegidas-contrasena-wordpress-3-4/#comments</comments>
		<pubDate>Thu, 13 Sep 2012 11:54:38 +0000</pubDate>
		<dc:creator>Daniel</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://www.danielnabil.com/?p=578</guid>
		<description><![CDATA[En una entrada anterior vimos cómo personalizar el formulario de contraseña de WordPress cuando queremos proteger nuestras páginas o entradas. Hasta la versión 3.3, este código funcionaba sin problema, pero después de actualizar a 3.4, si hemos personalizado este formulario, no podremos acceder al contenido, aunque la contraseña sea correcta.
Esto ... <a href="http://www.danielnabil.com/blog/error-acceso-entradas-protegidas-contrasena-wordpress-3-4/" class="seguir"><img src="/wp-content/themes/dn2/img/mas.png" alt="" /></a>]]></description>
				<content:encoded><![CDATA[<p>En una entrada anterior vimos <a href="http://www.danielnabil.com/blog/wordpress-proteger-contrasena-paginas-entradas/">cómo personalizar el formulario de contraseña de WordPress</a> cuando queremos proteger nuestras páginas o entradas. Hasta la versión 3.3, este código funcionaba sin problema, pero después de actualizar a 3.4, si hemos personalizado este formulario, no podremos acceder al contenido, aunque la contraseña sea correcta.</p>
<p>Esto ocurre porque a partir de la versión 3.4, WordPress deja de utilizar &#8220;<code>wp-pass.php</code>&#8221; (es decir, pasa a &#8220;deprecated&#8221;), sustituyéndolo por &#8220;<code>wp-login.php</code>&#8220;. En la <a href="http://codex.wordpress.org/Version_3.4">lista de cambios de la versión 3.4</a> se especifica:</p>
<p><em>&#8220;Set post password cookies via an action in wp-login.php; <strong>retire wp-pass.php</strong> (one less root file); obey login ssl preferences for post password form submission&#8221;</em></p>
<p>Por tanto, la solución en este caso no es complicada: <strong>tenemos que sustituir la llamada a &#8220;<code>wp-pass.php</code>&#8221; por &#8220;<code>wp-login.php?action=postpass</code>&#8220;</strong> en nuestro formulario de contraseña personalizado (que seguramente estará en el archivo &#8220;<code>functions.php</code>&#8221; del tema activo, en algún plugin, o bien en alguna hoja de funciones separada):</p>
<pre class="brush: php; title: ; notranslate">
function custom_password_form() {
	global $post;
	$label = 'pwbox-'.(empty($post-&gt;ID) ? rand() : $post-&gt;ID );
	$o = '&lt;form class=&quot;protected-post-form&quot; action=&quot;' . get_option('siteurl') . '/wp-login.php?action=postpass&quot; method=&quot;post&quot;&gt;
		' . __( &quot;&lt;p&gt;&lt;strong&gt;Esta informaci&amp;oacute;n est&amp;aacute; protegida.&lt;/strong&gt;&lt;br /&gt;Por favor, para verla escribe la contrase&amp;ntilde;a a continuaci&amp;oacute;n:&lt;/p&gt;&quot; ) . '
	&lt;p&gt;&lt;input name=&quot;post_password&quot; id=&quot;' . $label . '&quot; type=&quot;password&quot; size=&quot;25&quot; /&gt;&lt;input type=&quot;submit&quot; name=&quot;Submit&quot; value=&quot;' . esc_attr__( &quot;Submit&quot; ) . '&quot; /&gt;&lt;/p&gt;&lt;/form&gt;';
	return $o; }
	add_filter('the_password_form', 'custom_password_form');
</pre>
<p>Cualquier plugin o theme que haga referencia al archivo &#8220;wp-pass.php&#8221; debería haberse actualizado (la actualización de WordPress 3.4 es de junio de 2012), o sea que si tenemos problemas relacionados con el acceso a entradas con contraseña, una buena idea sería revisar también los plugins activos o cambiar temporalmente el theme activo para ver si esto soluciona el error.</p>
<p>Es algo que conviene revisar en todas las webs que utilicen esta función, para asegurarnos de que todos los contenidos son accesibles. Si no lo hacemos, será el cliente o los usuarios quienes nos avisen del error.</p>
<p>La función de protección de contenidos por contraseña está incluida en WordPress por defecto. No es necesario retocar nada ni hacer ningún cambio para que funcione. Sin embargo, si queremos modificar el aspecto visual y el contenido (por ejemplo, sustituir la palabra &#8220;Protegido&#8221; por algo que nos guste más), tenemos que modificar este formulario, normalmente añadiéndolo en el archivo &#8220;<code>functions.php</code>&#8221; o a través de un plugin.</p>
<h3>Resumiendo</h3>
<ul class="lessMargin">
<li>Si la versión de WordPress instalada es la 3.4 o superior</li>
<li>Y si utilizas un <a href="http://www.danielnabil.com/blog/wordpress-proteger-contrasena-paginas-entradas/">formulario de acceso por contraseña personalizado</a></li>
<li>Buscar la función con la cual se modifica ese formulario (generalmente en functions.php)</li>
<li>Y sustituir la llamada a &#8220;wp-pass.php&#8221; por &#8220;wp-login.php?action=postpass&#8221;</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.danielnabil.com/blog/error-acceso-entradas-protegidas-contrasena-wordpress-3-4/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cómo crear enlaces anclados internos (y añadir una función al editor de WordPress)</title>
		<link>http://www.danielnabil.com/blog/enlaces-ancla-anadir-boton-editor-wordpress/</link>
		<comments>http://www.danielnabil.com/blog/enlaces-ancla-anadir-boton-editor-wordpress/#comments</comments>
		<pubDate>Tue, 05 Jun 2012 11:11:39 +0000</pubDate>
		<dc:creator>Daniel</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[HTML/CSS]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://www.danielnabil.com/?p=574</guid>
		<description><![CDATA[Los enlaces que más se utilizan son los que apuntan a otra dirección en Internet, sea dentro de nuestra propia web o hacia cualquier otra página. Pero el sistema de enlazado hipertextual (HTML) nos permite ir un paso más allá y enlazar directamente a un punto concreto de una página ... <a href="http://www.danielnabil.com/blog/enlaces-ancla-anadir-boton-editor-wordpress/" class="seguir"><img src="/wp-content/themes/dn2/img/mas.png" alt="" /></a>]]></description>
				<content:encoded><![CDATA[<p>Los enlaces que más se utilizan son los que apuntan a otra dirección en Internet, sea dentro de nuestra propia web o hacia cualquier otra página. Pero el sistema de enlazado hipertextual (HTML) nos permite ir un paso más allá y <strong>enlazar directamente a un punto concreto de una página web o a una parte de un documento</strong>, es decir, crear enlaces internos.</p>
<p>Un enlace &#8220;normal&#8221; al artículo sobre HTML de la Wikipedia tiene esta forma:</p>
<pre class="brush: xml; title: ; notranslate">
&lt;a href=&quot;http://es.wikipedia.org/wiki/HTML&quot;&gt;Artículo sobre el HTML en la Wikipedia&lt;/a&gt;
</pre>
<p>Pero hay veces que es muy útil enlazar directamente a un punto concreto de un documento, en vez de a la parte superior de una página. Por ejemplo, si queremos guiar a alguien a la misma página de la Wikipedia pero a la sección sobre nociones básicas de HTML, en vez de decirle que lo busque, como la página de destino es bastante larga, es mejor facilitarle la vida y ofrecerle un enlace directo a un ancla. Así:</p>
<pre class="brush: xml; title: ; notranslate">
&lt;a href=&quot;http://es.wikipedia.org/wiki/HTML#Nociones_b.C3.A1sicas_de_HTML&quot;&gt;Nociones básicas de HTML&lt;/a&gt;
</pre>
<p>Un <strong>enlace anclado</strong> (enlaces ancla, o simplemente enlaces internos) no es más que un enlace normal y corriente al que añadimos el símbolo de la almohadilla &#8220;#&#8221; y el nombre de algún elemento de esa página, que <strong>puede ser un atributo &#8220;name&#8221; o &#8220;id&#8221;</strong>. Esto quiere decir que podemos dirigir al usuario a un punto concreto de cualquier página, incluso de la misma página en la que está. La Wikipedia, sin ir más lejos, hace un uso intensivo de este tipo de enlaces internos en sus artículos.</p>
<p>Vamos a ver paso a paso cómo hacer esto utilizando el editor de texto de WordPress (TinyMCE). </p>
<h3>Cómo añadir un enlace anclado a un punto de una misma página</h3>
<p>Si utilizamos la opción de código (la pestaña &#8220;HTML&#8221;), solo tenemos que hacer dos cosas:</p>
<ol>
<li>Añadir el link así: &lt;a href=&quot;#mi-ancla&quot;&gt;Palabras enlazadas&lt;/a&gt;</li>
<li>En el punto de destino, añadir el ancla, así: &lt;a name=&quot;mi-ancla&quot;&gt;&lt;/a&gt; (no hace falta que haya nada dentro de las etiquetas, puede estar vacío)</li>
</ol>
<p>Pero no es estrictamente necesario hacerlo a mano y arriesgarnos a cometer errores. <strong>Podemos añadir un botón al editor de contenido de WordPress</strong> para facilitar el trabajo (<a href="#boton-wp">ver instrucciones más abajo</a>). Si contamos con este nuevo botón, podremos utilizar la pestaña de edición &#8220;Visual&#8221;. El procedimiento entonces será un poco más largo, pero más fácil para quien no tenga unas nociones básicas de HTML:</p>
<ol>
<li>Seleccionar la/s palabra/s que queremos que sean el enlace</li>
<li>Pulsamos el botón de la cadenita (Añadir enlace)</li>
<li>En el campo &#8220;URL&#8221;, eliminamos &#8220;http://&#8221;, añadimos el destino así: <strong>#mi-ancla</strong> y pulsamos el botón &#8220;Añadir enlace&#8221;</li>
<li>Después colocamos el cursor en el destino (el punto de la página donde queremos que nos lleve ese enlace). No hace falta seleccionar nada, solo situar el cursor.</li>
<li>Pulsamos el botón del ancla, en la primera fila de botones, al final (recuerda, este botón no aparece por defecto, hay que añadirlo siguiendo las instrucciones que ahora explicaremos)</li>
<li>Añadir el nombre del ancla, así: <strong>mi-ancla</strong> (sin el símbolo &#8220;#&#8221;, ni &#8220;http://&#8221; ni nada más) y pulsar &#8220;Insertar&#8221;</li>
</ol>
<h3 id="boton-wp">Cómo añadir el botón &#8220;Anchor&#8221; al editor de WordPress</h3>
<p>El botón &#8220;Anchor&#8221; (ancla) no aparece por defecto en una instalación normal de WordPress. Es necesario especificar que lo queremos utilizar, añadiendo una función para ampliar las posibilidades del editor TinyMCE.</p>
<p>En el archivo <code>functions.php</code> del tema activo o en nuestro plugin de funciones, tenemos que añadir este código:</p>
<pre class="brush: php; title: ; notranslate">
// Configurando TinyMCE editor
add_action('init', 'nueva_config_tinymce');
function nueva_config_tinymce() {

	// Si el usuario no tiene permiso para editar páginas o entradas
	// no aplicamos la nueva configuración
	if (!current_user_can('edit_posts') &amp;&amp; !current_user_can('edit_pages'))
		return;
		
	// Si el usuario utiliza el modo visual (Rich Editor)
	if (get_user_option('rich_editing') == 'true') {

		// Recuperamos botones ocultos
		add_filter('mce_buttons', 'nuevos_botones_mce');
		function nuevos_botones_mce($buttons) {
			// Especificamos los botones que nos interesan. En nuestro caso, &quot;anchor&quot;
			// Posibilidades: anchor, backcolor, cleanup, code, copy, cut, fontselect, fontsizeselect, hr, paste, redo, styleselect, sub, sup, undo
			array_push($buttons, 'anchor');
			return $buttons; 
		}
	}
}
</pre>
<p>Este código nos da la posibilidad de añadir, además del botón para anclaje de enlaces, etiquetas y funciones muy útiles como HR, CODE, CUT, STYLESELECT y muchas más al editor de WordPress, facilitando así el trabajo de edición a nuestros clientes y usuarios.</p>
<h3>Plugins de WordPress relacionados</h3>
<ul>
<li><a href="http://wordpress.org/extend/plugins/better-anchor-links/">Better Anchor Links</a><br />
Sirve para crear índices de página (al estilo de la Wikipedia), añadiendo automáticamente enlaces anclados internos a las etiquetas de cabecera (H1, H2, H3&#8230;) que hayamos incluído.</li>
<li><a href="http://wordpress.org/extend/plugins/tinymce-advanced/">TinyMCE Advanced</a><br />
Un plugin muy completo que nos puede ayudar a mejorar la funcionalidad del editor de WordPress, activando características que no aparecen por defecto.</li>
</ul>
<h3>Más información</h3>
<ul class="lessMargin">
<li><a href="http://www.w3.org/TR/html401/struct/links.html">Links in HTML documents</a> (W3C Recomendation)</li>
<li><a href="http://www.seomoz.org/learn-seo/internal-link">Internal Links. Best Practices for SEO</a> (SEOMoz)</li>
<li><a href="http://codex.wordpress.org/TinyMCE_Custom_Buttons">TinyMCE Custom Buttons</a> (WordPress Codex)</li>
<li><a href="http://www.ilovecolors.com.ar/display-buttons-tinymce/">How to display hidden buttons in TinyMCE for WordPress</a> (ilovecolors.com)</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.danielnabil.com/blog/enlaces-ancla-anadir-boton-editor-wordpress/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
	</channel>
</rss>
