Permitiendo códigos cortos dentro de los atributos

4

Quiero hacer un infobox similar a Wikipedia para algunos artículos en un sitio WP. Supongo que lo más lógico es usar un shortcode personalizado, uno que devuelva un marcado similar a una tabla con un orden fijo de campos, cada uno con más marcado en la costumbre junto con algunas cosas condicionales para mostrar o no los campos si no están Conjunto, emulando algo así:

 <!--MediaWiki markup-->
 {{infobox-cd
 |name=Abbey Road"
 |cover=[[File:laserdisc.jpg]]
 |artist=[[The Bombay Beach Boys]]
 |country={{flag id=mx}} Argentina<br />{{flag id=dk}} Vanuatu (post-production)
 |rating={{stars no=3}}
 |prev=[[The Wall]]
 |next=[[Born in the U.S.A.]]
 }}

Sin embargo, se me ha impedido usarlos en un enfoque más literal durante años debido a que los códigos cortos se rompen al tener corchetes dentro de los atributos. En teoría, debería funcionar, pero no porque la expresión regular del código abreviado se detiene con la primera aparición de un corchete de cierre (]) en un código abreviado, por lo que en esto:

[foo bar="[baz /]"]content[/foo]

se "produce":

[foo bar="[baz /]

No estoy seguro de cómo puedo conseguir que este marcado funcione o algo más con el mismo objetivo.

    
pregunta peroyomas 05.02.2014 - 05:36

1 respuesta

3

Lo sentimos, los corchetes aún no están permitidos dentro de códigos cortos, como se puede ver en la API de código corto . Sin embargo, es posible usar códigos cortos de encierro que permitirán usar corchetes. Déjame demostrar esto:

Código corto: [foo bar="No brackets here!"]...use [brackets] here[/foo]

Puedes agregar este tipo de código abreviado en tu functions.php de esta manera:

add_shortcode( 'foo', 'foo_shortcode' );
function foo_shortcode( $atts, $content = null ) {
extract( shortcode_atts(
    array(
      'bar' => '',
    ), $atts )
  );
  return '<p>' . $bar . ' ' . $content . '</p>';
}

También es posible ejecutar el contenido entre corchetes como otro código abreviado:

Código corto: [foo bar="No shortcodes here!"]...use [shortcodes] here[/foo]

add_shortcode( 'foo', 'execute_foo_shortcode' );
function execute_foo_shortcode( $atts, $content = null ) {
extract( shortcode_atts(
    array(
      'bar' => '',
    ), $atts )
  );
  return '<p>' . $bar . ' ' . do_shortcode($content) . '</p>';
}

Pero seamos sencillos. ¿Por qué no agregar los corchetes dentro del shortcode en sí?

Código corto: [foo bar="shortcode"]

Y dentro de tu functions.php

add_shortcode( 'foo', 'build_foo_shortcode' );
function build_foo_shortcode( $atts ) {
  extract( shortcode_atts(
    array(
      'bar' => '',
    ), $atts )
  );

  if ( isset( $bar ) ) :
    return '<p>' . do_shortcode( '[' . $bar . ']' ) . '</p>';
  endif;
}

Si desea permanecer con su tipo de código abreviado, puede ir entre los corchetes y agregar algo similar, para reconocerlo y reemplazarlo a través de expresiones regulares:

Código corto: [foo bar="Use your ___shortcode___ here"]

Dentro de su functions.php puede reemplazar ___shortcode___ con [shortcode] y nuevamente ejecutarlo a través de do_shortcode()

add_shortcode( 'foo', 'regex_foo_shortcode' );
function regex_foo_shortcode( $atts ) {
  extract( shortcode_atts(
    array(
      'bar' => '',
    ), $atts )
  );

  if ( isset( $bar ) ) :
    $foo_bar = preg_replace_callback("/(.*)_{3}(.*)_{3}(.*)/", function($m) {
        return $m[1] . do_shortcode('[' . $m[2] . ']') . $m[3];
    }, $bar);
    return '<p>' . $foo_bar . '</p>';
  endif;
}

Está bien, ahora es un poco complicado, ¿no? Otro enfoque (si no desea seguir haciéndolo a través de códigos cortos) sería campos personalizados. Los campos personalizados están disponibles por defecto y se pueden activar a través de Opciones de pantalla .

Puede usar the_meta () o puede obtenerlo a través de get_post_meta () para mostrarlos fácilmente dentro de su tema. Además, es más fácil (en comparación con los códigos cortos) manejar la entrada y la salida, y ninguno de los editores tiene que recordar todos los códigos cortos disponibles.

También puede generar campos personalizados avanzados fácilmente a través de la interfaz de un complemento o cree y diseñe su estilo por su cuenta . De todos modos, tendrá bonitos campos de entrada debajo o al lado de su editor de texto sin limitaciones (incluso carga de archivos, selector de fechas ...). Se verá algo como esto:

    
respondido por el Sven 06.02.2014 - 02:10

Lea otras preguntas en las etiquetas