Como desactivar XMLRPC en WordPress

XMLRPC esta activado por defecto desde la versión 3.5 de WordPress sin la posibilidad de desactivarlo desde el panel de administración.

Recientemente se publicó un artículo en el blog de Sucuri sobre Ataques de fuerza bruta contra XMLRPC en WordPress, donde recomiendan desactivar xmlrcp en nuestras instalaciones de WordPress.

Puedes desactivarlo a través de un hook

add_filter('xmlrpc_enabled', '__return_false');

Pero yo diría que la mejor manera de hacer esto es bloqueando las peticiones desde el archivo .htaccess antes de que dichas peticiones lleguen a WordPress.
Para garantizar el funcionamiento de los plugins que usan xmlrpc ( en caso de tener alguno instalado ) puedes denegar completamente el acceso excepto para la IP que necesita acceder.

# Block WordPress xmlrpc.php requests
<Files xmlrpc.php>
order deny,allow
deny from all
allow from ( hosting IP )
</Files>

Como usar los filtros plugin_action_links y plugin_row_meta

En la lista de plugins instalados en el panel de administración de WordPress se pueden encontrar enlaces bajo el nombre del plugin a la izquierda (Desactivar, Editar) y otros enlaces bajo la descripción del plugin a la derecha, junto a otra información como la versión del plugin (Por el autor, Ver detalles).

default_action_links_es

Los enlaces que aparecen en la imagen encima de estas líneas son los que WordPress muestra por defecto, con excepción del enlace del autor que se define en el archivo principal del plugin donde se dan todos los detalles sobre el mismo Plugin Name, Description, Version, Author, Author URI…

No hace mucho publiqué un snippet de código muy sencillo para añadir enlaces debajo del nombre del plugin, como Ajustes o FAQ (o ambos). Pero con este snippet sólo se pueden añadir los enlaces al final de los ya existentes por defecto.

Tal vez lo que necesitas, además de mostrar enlaces adicionales, es la posibilidad de elegir si los quieres al principio o al final de los ya existentes. Y también puede que quieras añadir enlaces justo debajo de la descripción del plugin (a la derecha).

Hay disponibles 2 filtros diferentes para hacer esto, plugin_action_links para añadir enlaces debajo del nombre del plugin y plugin_row_meta para añadirlos debajo de la descripción del plugin.

additional_action_links_es

En el siguiente código veremos como usar los filtros plugin_action_links y plugin_row_meta. Las funciones my_add_action_links y my_plugin_row_meta, básicamente harían lo mismo, así que he creado una tercera función plugin_action_links que será convocada por las dos primeras, donde se pueden pasar como argumentos un array de los enlaces a mostrar y la posición de los mismos (antes o después de los enlaces por defecto).

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
add_filter( 'plugin_action_links', 'my_add_action_links', 10, 5 );
add_filter( 'plugin_row_meta',     'my_plugin_row_meta', 10, 2 );
 
/**
 * my_add_action_links
 */
 
function my_add_action_links( $actions, $plugin_file ) {
 
 $action_links = array(
 
   'settigns' => array(
      'label' => __('Settings', 'my_domain'),
      'url'   => get_admin_url(null, 'options-general.php?page=my-plugin-options')
    ), 
 
   'faq' => array(
      'label' => __('FAQ', 'my_domain'),
      'url' => 'http://www.my-plugins-site.com/faq'
       )
   );
 
  return plugin_action_links( $actions, $plugin_file, $action_links, 'before');
}
 
/**
 * my_plugin_row_meta
 */
 
function my_plugin_row_meta( $actions, $plugin_file ) {
 
 $action_links = array(
 
   'donate' => array(
      'label' => __('Donate', 'my_domain'),
      'url'   => 'http://www.my-plugins-site.com/donate'
    ));
 
  return plugin_action_links( $actions, $plugin_file, $action_links, 'after');
}
 
/**
 * plugin_action_links
 */
 
function  plugin_action_links ( $actions, $plugin_file,  $action_links = array(), $position = 'after' ) { 
 
  static $plugin;
 
  if( !isset($plugin) ) {
      $plugin = plugin_basename( __FILE__ );
  }
 
  if( $plugin == $plugin_file && !empty( $action_links ) ) {
 
     foreach( $action_links as $key => $value ) {
 
        $link = array( $key => '<a href="' . $value['url'] . '">' . $value['label'] . '</a>' );
 
         if( $position == 'after' ) {
 
            $actions = array_merge( $actions, $link );    
 
         } else {
 
            $actions = array_merge( $link, $actions );
         }
 
 
      }//foreach
 
  }// if
 
  return $actions;
 
}

Añade funcionalidad a Contact Form 7

Puedes añadir funcionalidad extra en el plugin Contact Form 7 después de que tomen lugar algunas acciones, por ejemplo cuando un email se ha enviado correctamente.
Contact Form 7 dispara una serie de eventos JavaScript a los que puedes acceder fácilmente, aquí hay un ejemplo usando JQuery.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
if( $('.wpcf7').length > 0 ) {
 
  $(document).on('spam.wpcf7', function () {
    console.log('submit.wpcf7 triggered!');
  });
 
  $(document).on('invalid.wpcf7', function () {
    console.log('invalid.wpcf7 triggered!');
  });
 
  $(document).on('mailsent.wpcf7', function () {
    console.log('mailsent.wpcf7 triggered!');
  });
 
  $(document).on('mailfailed.wpcf7', function () { 
    console.log('mailfailed.wpcf7 triggered!');
  });
}

Como truncar el título de un post

1
2
3
4
5
6
7
8
9
10
11
12
$limit = 50;
 
$title = get_the_title(); 
$length = strlen($title);
 
$the_title = substr($title, 0, $limit);
if ($length > $limit) $the_title .= '...';
 
echo $the_title;
 
// get_the_title puede ser reemplazado por $post->post_title;
// reemplazar el valor deseado en $limit

Instala Jetpack sin conectar con WordPress.com

Puedes usar Jetpack en su modo Desarrollo para poder trabajar sin activar el plugin con WordPress.com.

Existen dos métodos para hacer esto, añadiendo una línea en el archivo wp-config.php

define( 'JETPACK_DEV_DEBUG', true);

O bien a través del filtro:

add_filter( 'jetpack_development_mode', '__return_true' );

Como establecer una variable global con todos los IDs mostrados como en Genesis

El framework Genesis establece una variable global $_genesis_displayed_ids la cual contiene un array con todos los IDs de post que están siendo mostrados en pantalla, ya sea en el loop por defecto u otro loop que se esta ejecutando a la vez.

Necesitaba tener este tipo de datos para un proyecto en concreto que no hacía uso del framework Genesis.
Existe la función the_post() pero también disponemos del action hook the_post a través del cual conseguí recopilar los datos.
Este es el código que hace uso de este hook para obtener todos los IDs en una variable global.

1
2
3
4
5
6
7
8
add_action( 'the_post', 'set_displayed_items' );
 
public static function set_displayed_items( $post_object ) {
 
 global $_displayed_ids;
 $_displayed_ids[] = $post_object->ID;
 
}

Añadir varias opciones Order a la query

Puedes añadir varios valores orderby a los argumentos de WP_Query, pero WP_Query no soporta añadir direntes opciones de orden (DESC,ASC) a cada valor del argumento orderby (o al menos no lo he encontrado).

Para poder realizar esta tarea tendremos que usar el filtro posts_orderby.

1
2
3
4
5
6
7
 
$args = array(......
	      'orderby'        => 'post_title comment_count', 
	      'order'          => 'ASC', 
	      .....
	       );
new WP_Query( $args );

Esto generaría lo siguiente en la query:

 
SELECT .... FROM ..... ORDER BY post_title ASC, comment_count ASC

Pero si lo que queremos es

 
SELECT .... FROM ..... ORDER BY post_title ASC, comment_count DESC

usaríamos el filtro post_orderby de esta manera:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
function my_new_order_option($orderby) {
 
  global $wpdb;
  $order  = $wpdb->posts . '.post_title ASC, ';
  $order .= $wpdb->posts . '.comment_count DESC';
 
  return $order;
} 
 
add_filter( 'posts_orderby', 'my_new_order_option' ); 	
 
$query = new WP_Query( $args );
 
remove_filter( 'posts_orderby', 'my_new_order_option' );