WordPress – Cómo incluir un campo personalizado en un adjunto

En este caso tenía la necesidad de crear un campo personalizado para las imágenes (que en wordpress se consideran adjuntos) para después utilizarlo en un post. Para generar dicho campo simplemente he seguido los siguientes pasos:

En el functions.php que tengamos en nuestra personalización simplemente tendremos que añadir las siguientes líneas:

add_filter('attachment_fields_to_edit', 'edit_media_custom_field', 11, 2 );
add_filter('attachment_fields_to_save', 'save_media_custom_field', 11, 2 );

function edit_media_custom_field( $form_fields, $post ) {
	$form_fields['custom_field'] = array( 'label' => 'Custom Field', 'input' => 'text', 'value' => get_post_meta( $post->ID, '_custom_field', true ) );
	return $form_fields;
}

function save_media_custom_field( $post, $attachment ) {
	update_post_meta( $post['ID'], '_custom_field', $attachment['custom_field'] );
	return $post;
}

Con ello ya tendremos al subir cualquier imagen el siguiente resultado:

WordPress – Cómo incluir otro tipo de categoría taxonomía

A colación del otro post que cree hablando de “Cómo incluir otro tipo de post” diferente al los que hay por defecto necesité después ser capaz de categorizarlos, y para eso necesité informarme acerca de las taxonomías (vaya palabro)

Pero… ¿qué es una taxonomía?

Pues básicamente es una forma de agrupar determinados elementos juntos. En wordpress, es un mecanismo para agrupar algunos posts (o links o tipos de posts a medida como el que hicimos).

Existen ya algunas taxonomías creadas por defecto, que serían:

  • Category: Agrupar post (de tipo ‘post’)
  • Tag: Es como las categorías pero dando una mayor libertad.
  • Link Category: Es para categorizar los links.
  • Post Formats: Vale para ser usados por los temas, pero no podemos crearlos a voluntad como los otros.

En nuestro caso vamos a registrar una nueva taxonomía y asociarla al tipo de post que hicimos anteriormente mediante este código (incluido en el functions.php de un template que estamos usando):

add_action( 'init', 'create_web_taxonomies', 10, 0 );

function create_web_taxonomies() {
  // create a new taxonomy
  register_taxonomy(
    'cursos_category',
    array('cursos'),
    array(
      'labels' => array(
        'name' => __( 'Categorías de cursos' ),
        'singular_name' => __( 'Categoría de curso' ),
        'edit_item' => __( 'Editar curso' ),
        'add_new_item' => __( 'Añadir nuevo curso' ),
        'search_items' => __( 'Buscar cursos' )
      ),
      'public' => true,
      'hierarchical' => true,
      //'rewrite' => array( 'slug' => 'secciones_cursos' )
    )
  );
}

Ya con eso automáticamente nos apareció cuando pasábamos por “curso” un apartado Categoría del Curso, y cuando editábamos un curso nos permitía seleccionar la categoría del curso a la que pertenecía dicho curso.

Hay más información de Taxonomías en este link.

WordPress – Cómo incluir otro tipo de post

Actualmente, en wordpress, hay varios tipos de posts por defecto (todos ellos se almacenarán en la tabla wp_post), que son:

  • Post (Post Type: ‘post’).
  • Página (Post Type: ‘page’)
  • Adjunto (Post Type: ‘attachment’)
  • Revision (Post Type: ‘revision’)
  • Menú de navegación (Post Type: ‘nav_menu_item’)

Pero a veces necesitaremos crear otro nuevo tipo de post para posteriormente mostrarlo en el front de otra forma, bien a través de una template que contenga todos los nuevos posts, o que contenga solo uno,…

El código para crear un nuevo tipo de post (llamado por ejemplo curso) es el siguiente. Lo introduje en un archivo functions.php que tenía el template que estoy utilizando:

add_action( 'init', 'create_post_type' );
function create_post_type() {
  register_post_type( 'curso',
    array(
      'labels' => array(
        'name' => __( 'Cursos' ),
        'singular_name' => __( 'Curso' )
      ),
      'public' => true,
      'menu_icon' => 'dashicons-feedback',
      'rewrite' => array( 'slug' => 'curso' )
    )
  );
}

Notas:

  • He incluido el icono feedback, aunque no sería necesario ningún icono.
  • Slug también es opcional, está por si quiero posteriormente acceder a través de una url amigable a los contenidos.

Y simplemente con ese código ya tendremos acceso en la administración a la creación de ese tipo de post.

Hay más información de lo que se puede hacer con register_post_type en este link.

Instalación de PHP en servidor Ubuntu

Hay dos opciones para instalar Apache en nuestro servidor Ubuntu, por módulo de apache (la forma normal) o por cgi. La forma preferible es a través de módulo, pero no todos los servidores lo permiten (como me ha pasado a mi hoy debido a que no tenía acceso a los repositorios del apt).

Importante aclarar que la forma ideal es hacerlo a través de apache puesto que por CGI parece ser que el rendimiento es mucho peor.

Pasos para la instalación por módulo de Apache

1º Actualizamos la lista de paquetes.

sudo apt-get update

2º Actualizamos los paquetes.

sudo apt-get upgrade

3º En caso de que ejecutando el comando anterior no se haya actualizado el php es porque posiblemente no hemos añadido el paquete de PHP. Lo haremos de la siguiente forma:

sudo apt-add-repository ppa:ondrej/php

4º Volvemos a ejecutar “sudo apt-get update” y posteriormente instalamos la versión de php que queramos

  • Para PHP 5.5 sudo apt-get install php5.5
  • Para PHP 5.6 sudo apt-get install php5.6
  • Para PHP 7 sudo apt-get install php7.0

Paso para la instalación por CGI de PHP

Descargamos la versión que queramos de PHP (en nuestro caso la 7.06)

2º A través de ftp subimos los archivos a una ruta. En nuestro caso será /usr/local/php706/.

Modificamos el archivo /etc/apache2/sites-available/default

En nuestro caso nos quedó de la siguiente manera:

<VirtualHost *:80>
  ServerAdmin webmaster@localhost
  ServerName blablabla.yises.com
  DocumentRoot /var/www

  <Directory /usr/local/php706/bin>
    AllowOverride None
    Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
    Order allow,deny
    Allow from all
  </Directory>

  ScriptAlias /php706-cgi /usr/local/php706/bin

  <Directory /var/www>
    Action php706-cgi /php706-cgi/php-cgi
    AddHandler php706-cgi .php
    <FilesMatch "\.php$">
      SetHandler php706-cgi
    </FilesMatch>
    Options Indexes FollowSymLinks
    AllowOverride All
    Order allow,deny
    allow from all
  </Directory>

  ErrorLog ${APACHE_LOG_DIR}/error.log

  # Possible values include: debug, info, notice, warn, error, crit,
  # alert, emerg.
  LogLevel warn

  CustomLog ${APACHE_LOG_DIR}/access.log combined

  Alias /doc/ "/usr/share/doc/"
  <Directory "/usr/share/doc/">
    Options Indexes MultiViews FollowSymLinks
    AllowOverride None
    Order deny,allow
    Deny from all
    Allow from 127.0.0.0/255.0.0.0 ::1/128
  </Directory>
</VirtualHost>

4º Reiniciamos el servicio de apache

sudo service apache2 restart

Notas importantes:

  • Puede que sea necesario añadir algunos módulos para que funcione correctamente. Por ejemplo:
sudo a2enmod rewrite
  • Se puede ver los mods disponibles en la ruta /etc/apache2/mods-available y los habilitados en /etc/apache2/mods-enabled
  • Normalmente los errores que nos vayan apareciendo se encontrarán en /var/log/apache2/error.log

WordPress – Cómo mostrar el número de visitas a un post sin utilizar un plugin

Hoy mostraremos una forma de realizar el conteo de las visitas en los diferentes posts que tengamos en un blog de wordpress usando el “post meta” que proporciona wordpress

Paso 1 – Incluir en el functions.php el siguientes código.

function getPostViews($postID){
    $count_key = 'post_views_count';
    $count = get_post_meta($postID, $count_key, true);
    if($count==''){
        delete_post_meta($postID, $count_key);
        add_post_meta($postID, $count_key, '0');
        return "0";
    }
    return $count;
}
function setPostViews($postID) {
    $count_key = 'post_views_count';
    $count = get_post_meta($postID, $count_key, true);
    if($count==''){
        $count = 0;
        delete_post_meta($postID, $count_key);
        add_post_meta($postID, $count_key, '0');
    }else{
        $count++;
        update_post_meta($postID, $count_key, $count);
    }
}
// Remove issues with prefetching adding extra views
remove_action( 'wp_head', 'adjacent_posts_rel_link_wp_head', 10, 0);

Paso 2 – Incluir en la página single.php el siguiente código (permitirá almacenar una visita al post, hará uso del código que hemos incluido en el paso 1).

<?php setPostViews(get_the_ID()); ?>

Paso 3 – Incluir en la página single.php dentro del bucle del fichero el siguiente código (permite visualizar dicho número de visitas.

<?php echo getPostViews(get_the_ID());?>

En mi caso por ejemplo el código que he introducido dentro del single.php es el siguiente (el tema incluye font-awesome)

<li><i class="fa fa-eye"></i><span><?php echo getPostViews(get_the_ID()).' visitas'; ?><span></li>

Tomada esta información de este link y ligeramente modificada para su correcta visualización

El fenómeno de Pokemon Go

Hoy hablaremos de uno de los fenómenos que más noticias están generando a lo largo de este mes, y es la app de Pokemon Go.

Ingress, el preludio de Pokemon Go

Como ya sabréis, Pokemon Go es una aplicación creada por una empresa llamada Niantic a imagen y semejanza de otra aplicación que sacaron que se llama Ingress.

Logo Ingress

En este Ingress el objetivo de juego consiste en capturar “portales” y establecer un vínculo entre ellos que permiten crear campos triangulares virtuales a través de áreas geográficas. Más info en este enlace.

¿Y por qué es importante hablar de ella? Pues porque para hacer el Pokemon Go se han basado en este primer juego. El sistema de facciones se mantiene, la base de datos de pokeparadas/gimnasios pokemon son portales que podías añadir en el juego, … Para que te hagas una idea ahora mismo tengo una pokeparada en el trabajo en el estoy gracias a que un compañero lo incluyó como edificio remarcable (ese compañero se ha convertido automáticamente en héroe para unos y villano para otros).

El presente, Pokemon Go

pokemongo

Pero sigamos con el Pokemon Go. Esta es una aplicación que está disponible tanto en Google Play(Android) como en Itunes(Ios) y en ella participan (se llevan beneficios) varias empresas:

  • Nintendo (10%)
  • Pokemon Group, empresa que no es propiedad exclusiva de Nintendo, es más tiene un 33% (30%)
  • Niantic, empresa creada por Google y que es parte del holding de empresas Alphabet (30%)
  • Google y Apple. Dependiendo de donde se produzcan los pagos un 30% de ellos irá a parar a manos de Google o de Apple, dependiendo de si tienes un Android o un Ios (30%).

Link con información

Cosas que me han parecido geniales de este juego

  1. Eso de que puedas hacer fotos mientras encuentras pokemon le da un toque viral (yo ya tengo mi foto con Charmander) y, por supuesto mi hijo tiene una foto con un Meaowth. Le ha dado el toque viral que necesitaba para que tuviera un despegue rápido la aplicación.
  2. El que te obligue a andar para conseguir llegar a un gimnasio, pokeparada, que eclosione un huevo.
  3. Modelo freemium. Puedes jugar todo lo que quieras al juego sin pagar, y podrás hacer lo mismo que un jugador que pague. Por supuesto la evolución será mucho más lenta y no podrás competir en gimnasios porque te pulirán las personas que hayan pagado más.

Cosas que me han parecido muy mal gestionadas

  1. Existen pokemon que sólo pueden ser cogidos en un continente determinado (enlace, otro enlace). El listado de pokemon de este tipo es: Tauros (Norte América), Mr. Mime (Europa), Kangaskhan (Australia) y Farfetch’d (Asia)
    Y aquí viene mi pregunta… ¿costaba tanto añadir un pokemon específico para África o para América del Sur? Si ya vas a hacer algo específico por continente… ¿porque continentes más pobres no pueden tenerlo? ¿no les interesa a los creadores?
  2. Se que está en modo beta, pero el que no se puedan intercambiar pokemon de un móvil a otro de alguna forma la verdad es que le quita parte del espíritu que tenía el pokemon de siempre.
  3. Gasta batería como si no hubiera un mañana. Al obligar a que el GPS esté activado junto con los datos hace que sea imposible andar 4 pasos sin estar pensando donde puedes recargar la batería en 3 horas.
  4. ¡En mi móvil antiguo no funciona! Es necesario android 4.3 o superior.

¿El futuro?

Y ahora viene una serie de conclusiones después de estar viendo la evolución de este juego:

  • La gente cada vez es menos constante en juegos y en todo tipo de apps. Si no tienes éxito en la primera semana ya tu app puedes tirarla prácticamente a la basura. Cada vez más las apps que triunfan lo hacen el primer mes (¿alguien se acuerda de Crash Royale? ¿Qué ha sido de él?)
  • Aunque pueda ganar mucho dinero al comienzo, toda aplicación en muy poco tiempo acaba cayendo.

Evolución usuarios Pokemon Go

Imagen tomada de este link

Yii2 – Como desarrollar una aplicación multilenguaje

Hace ya tiempo hablamos de cómo desarrollar una aplicación multilenguaje para yii versión 1, y hoy os traemos los pasos para realizarlo con la versión yii2:

Básicamente hay que seguir los siguientes pasos:

1 – Abrir una línea de comandos (cmd) y acceder a la raíz de nuestro proyecto. Y una vez ahí incluir la siguiente orden. Esto generará un archivo dentro de la ruta config/ llamado i18n.php, que será el que contenga los valores globales de la internacionalización.

yii message/config @app/config/i18n.php

2 – Tendremos que modificar la línea languages indicando los idiomas que queramos:

'languages' => ['es_ES','en_US'],

3 – También será necesario modificar el sourcePath y el messagePath con los siguiente valores:

'sourcePath' => __DIR__. DIRECTORY_SEPARATOR .'..',
'messagePath' => __DIR__ . DIRECTORY_SEPARATOR .'..'. DIRECTORY_SEPARATOR . 'messages',

4 – Será necesario crear la carpeta messages en el directorio raíz de la aplicación.
5 – Incluir dentro del congif/web.php la siguientes líneas dentro de components (en caso de que no se haga sólo se podrán introducir traducciones en el fichero app)

'i18n' => [
        'translations' => [
            '*' => [
                'class' => 'yii\i18n\PhpMessageSource',
                'basePath' => '@app/messages',
                'sourceLanguage' => 'en',
                'fileMap' => [
                    //'main' => 'main.php',
                ],
            ],
        ],
    ],

6 – Una vez tengamos eso, tendremos que generar los ficheros de dichos idiomas (o cuando queramos actualizarlos). Para ello es necesario ejecutar:

yii message/extract @app/config/i18n.php

Recomendación:
En config/i18n.php si queréis que el extract de todos los mensajes vaya más rápido podéis introducir un except de los vender.

Yii2 – Redirecciones y Htaccess

Hoy toca incluir cómo hacer las redirecciones y htaccess en yii2 para que fácilmente se puedan hacer urls amigables. Lo saqué de está página (aunque hay unas modificaciones mías en el archivo web.php).

Básicamente es necesario hacer 3 pasos (recordar que {root} es el lugar donde hemos creado la plantilla básica:

Paso 1: Crear fichero {root}/.htaccess (para redireccionarlo todo a la carpeta web menos aquellos ficheros o directorios que existan)

<IfModule mod_rewrite.c>
 Options +FollowSymlinks
 RewriteEngine On
</IfModule>
<IfModule mod_rewrite.c>
 RewriteCond %{REQUEST_URI} ^/.*
 RewriteRule ^(.*)$ web/$1 [L]
 RewriteCond %{REQUEST_URI} !^/web/
 RewriteCond %{REQUEST_FILENAME} !-f [OR]
 RewriteCond %{REQUEST_FILENAME} !-d
 RewriteRule ^.*$ web/index.php
</IfModule>

Paso 2: Crear fichero {root}/web/.htaccess (para que pase todo por el index.php, menos como en el caso anterior aquellos ficheros o directorios que existan)

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.php

Paso 3: Actualizar fichero {root}/config/web.php (indicar a yii2 que se van a mostrar urls amigables y definir las primeras reglas). Estas reglas te permitirán también pasar un parámetro por get.

'request' => [
    'baseUrl' => '',
],
'urlManager' => [
    'enablePrettyUrl' => true,
    'showScriptName' => false,
    'rules' => [
        '' => 'site/index',
        //'<action>'=>'site/<action>',
        '<controller:\w+>/<id:\d+>'=>'<controller>/view',
        '<controller:\w+><action:\w+>/<id:\d+>'=>'<controller>/<action>',
        '<controller:\w+><action:\w+>'=>'<controller>/<action>',
    ],
],

Unity vs Gamemaker, ¿cuál escoger?

Hoy vamos a hablar de las diferencias entre dos plataformas que son bastante conocidas en el mercado: Gamemaker y Unity, así como los puntos claves que al final mueven la balanza hacia la elección de uno u otro.

Gamemaker vs Unity

Gamemaker

Podéis probarlo descargándolo desde la página oficial: https://www.yoyogames.com/gamemaker

  • Es muy simple hacer un juego sencillo en la plataforma.
  • Es excelente para juegos en 2D, pero para juegos en 3D es muchísimo más limitado y ya hay que hacer trucos.
  • Tiene un montón de funciones predefinidas que te solucionan las cosas. En caso contrario te permite introducir código para hacer funciones más personalizadas.

Unity

Una de las plataformas de creación de juegos mejores, aquí tenéis el link: https://unity3d.com/es

  • Es más complicado comenzar, pero para juegos grandes es mucho mejor que gamemaker.
  • Es excelente para programación en 3D, pero para juegos en 2D el paquete resultante puede ser demasiado pesado.
  • Te da mucha más libertad puesto que gran parte de la programación se acabará haciendo en C#.
  • Tiene una comunidad mucho más grande que gamemaker.

En cuanto a precio… pues los dos tienen una versión gratuita, pero si quieres exportarlo a iOS, android,… ya toca pagar bastante en los dos casos (más en el caso de Unity).

Actualización (2017/01/16): Parece que actualmente exportar un proyecto Unity a dispositivo móvil ya es gratuito, en caso de que las ganancias sean menores a 100000 euros por ejercicio fiscal (link). @Pablo ¡Gracias!

Conclusión final

En definitiva, en el caso de que quieras ponerte con una de las plataformas yo te recomendaría que pensaras exactamente cómo de grande va a ser el juego, el tipo de este y cuantos programadores estarán trabajando en él. Cuanto más pequeño sea el proyecto (y en 2D), más posibilidades hay de que Gamemaker sea la opción.

En tu caso, ¿cuál has escogido y por qué?

Cómo saber cuando ha sido la última vez que Google visitó tu sitio web

Hoy explicaremos cómo podemos saber cuando Google a través de su spider Google Bot ha visitado por última vez nuestro sitio web.

Podemos utilizar dos caminos:

El método automático

Simplemente hay que ir a esta página (link) y poner la url que quieres comprobar.

Forma de ver cuando ha pasado Google Bot por tu sitio

El método manual

Simplemente hay que seguir los siguientes pasos:

  • Ir a Google y hacer una búsqueda de la url del sitio.
  • Seleccionar la opción “En caché”.

Ver tu página en la caché de Google

  • Fijarse en la fecha que pone en la parte superior.

Ver fecha de cuando google pasó por tu página

 

En mi caso, justo hoy (me encanta que los planes salgan bien 😉 )

¡Espero haberos ayudado!