Hace unos minutos he publicado una entrada sobre los ShortCodes y la importante labor que pueden llegar a desempeñar en nuestros WordPress. Usando la API de ShortCodes he montado un pequeño script basado en execPHP que permite ejecutar PHP en nuestros posts mediante un sencillo shortcode.
Código
function eval_php($atts, $content=null) {
ob_start();
eval($content);
$output = ob_get_contents();
ob_end_clean();
return "Entro".$output;
}
add_shortcode("php", "eval_php");
// Forzamos el do_shortcode al principio
add_filter('the_content', 'do_shortcode', 1);
Modo de empleo
[php]Código PHP[/php]
Sin los tags de php <?php
ni ?>
.
Ejemplo
[php]
$str = "Hello {xx}";
echo str_replace('{xx}', 'World!', $str);
[/php]
¿Donde pongo este código?
Puedes ponerlo en el fichero functions.php de tu theme o crear un plugin con el código.
¿Precauciones?
Hay que pensar que se está ejecutando código PHP desde los posts, si no eres el único usuario que postea debes tener esto en cuenta y quizas modificar el script. He montado 2 ejemplos para los más vagos 😀
1. Limitando por ID de usuario
// ID's de usuarios permitidos $users_avail = array(1,2,3,4); function noPHP($data = null){ global $current_user, $users_avail; get_currentuserinfo(); if (in_array($current_user->ID, $users_avail)) return $data; $data["post_content"] = str_replace("[php]", "", str_replace("[/php]", "", $data["post_content"])); $data["post_content_filtered"] = str_replace("[php]", "", str_replace("[/php]", "", $data["post_content_filtered"])); return $data; } add_filter('wp_insert_post_data', 'noPHP'); function eval_php($atts, $content=null) { ob_start(); eval($content); $output = ob_get_contents(); ob_end_clean(); return $output; } add_shortcode("php", "eval_php"); // Forzamos el do_shortcode al principio add_filter('the_content', 'do_shortcode', 1);
2. Limitando por level mínimo
// Level mínimo
$minlevel = 5;
function noPHP($data = null){
global $current_user, $minlevel;
get_currentuserinfo();
if ($current_user->user_level > $minlevel)
return $data;
$data["post_content"] = str_replace("[php]", "", str_replace("[/php]", "", $data["post_content"]));
$data["post_content_filtered"] = str_replace("[php]", "", str_replace("[/php]", "", $data["post_content_filtered"]));
return $data;
}
add_filter('wp_insert_post_data', 'noPHP');
function eval_php($atts, $content=null) {
ob_start();
eval($content);
$output = ob_get_contents();
ob_end_clean();
return $output;
}
add_shortcode("php", "eval_php");
// Forzamos el do_shortcode al principio
add_filter('the_content', 'do_shortcode', 1);
Así y todo yo tendría cuidado con esto ya que mediante la ejecución de PHP en los posts, los autores, editores, … pueden hacer desastres de magnitudes impredecibles…
Limitaciones
No he podido hacer muchas pruebas, así que es posible que surjan errores y quizas haya limitaciones en el código que ponemos, podríamos comentarlas.
8 comentarios, 0 referencias
+
#