Contenido

Ejecutar PHP en tus posts con shortcodes

4 Feb

+ 8

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.

  • Parece interesante! sin embargo hay que andar con cuidado al ejecutar codigo php desde posts.

  • Interesante, voy a tener en cuenta para alguna implementación de WordPress, puesto que por el momento estoy haciendo diseño muy a medida, y mas sobre todo aplicaciones webs.
    Saludos y el blog «siempre interesante»

  • Me da la impresion que el codigo que utilizas para limitar quien ejecuta el codigo PHP no es del todo correcto. En mi opinion se deberia usar el autor del post en lugar de $current_user puesto que este ultimo solo sirve para identificar el usuario que actualmente visita la pagina.

  • Andrés:

    Estoy desarrollando mi primer theme de WP desde cero, no tomé plantilla o código alguno de ninguna parte. de hecho estoy tratando de hacer todo por mi cuenta (estoy desempleado así que tiempo es lo que me sobra).

    El asunto es que estuve tratando de implementar los ShortCodes en mi código y hasta ahora nada de nada ha servido.

    Cuando publico el post donde uso el ShortCode, este queda como un literal.

    ¿Qué es lo que deseo?
    Tengo dos «Custom Fields» en mis posts, donde guardo unas 10 o quince palabras de lo escrito en el propio post. La idea es luego usar esos pequeños extractos como «Citas» destacadas dentro del escrito al estilo de las revistas (ver aquí).

    Mi código en functions.php es este:

    
    function PutPullQuoteTop() {
       global $wp_query;
    
       $postID = $wp_query->post->ID;
       $mylink = get_post_custom_values('MagazinePullquoteTop', $postID);
     
       return '' . $mylink[0] . '';
    }
    add_shortcode('pqt', 'PutPullQuoteTop');
    add_filter('the_content', 'do_shortcode', 1);
    

    Lo cierto es que no encuentro como resolver el asunto. Si puede ayudarme sería espectacular, de antemano, muchas gracias.

  • Dentro del propio texto de cada post agrego a pseudoetiqueta [pqt] que es la que he definido con add_shortcode…

    El resultado que obtengo es la propia pseudoetiqueta como parte del texto del post.

  • Bueno, asumo que no hay una respuesta a mi problema. De todas maneras muchas gracias Andrés por el tiempo que me regalaste.

    Saludos desde Venezuela 🙂

  • Hola, he intentado insertar un shortcode en un theme creado por mi desde cero.

    El problema es que parece que no lee el archivo shortcodes.php (no encuentra la función add_shortcode) , si lo incluyo directamente desde functions.php, hecha en falta otras funciones.

    No he encontrado la solucion por ningún sitio agradecería una ayudita.

    Un saludo

Comentar

#

Me reservo el derecho de eliminar y/o modificar los comentarios que contengan lenguaje inapropiado, spam u otras conductas no apropiadas en una comunidad civilizada. Si tu comentario no aparece, puede ser que akismet lo haya capturado, cada día lo reviso y lo coloco en su lugar. Siento las molestias.