Cómo añadir atributos a un shortcode
Leyendo el codex, tengo:
function btn_shortcode( $atts, $content = null ) {
$a = shortcode_atts( array(
'class' => 'button',
), $atts );
return '<a class="' . esc_attr($a['class']) . '">' . $content . '</a>';
}
add_shortcode( 'button', 'btn_shortcode' );
En el WYSIWIG pongo [button class="btn btn-lg btn-default"]Learn More[/button]
y funciona como quiero, pero deseo escribir mi shortcode así:
[button href="foo" class="btn btn-lg btn-default"]Learn More[/button]
¿Cómo modificaría mi función para permitir esto?
Solo tienes que agregar otro elemento al array (y luego mostrarlo):
function btn_shortcode( $atts, $content = null ) {
$a = shortcode_atts( array(
'class' => 'button',
'href' => '#'
), $atts );
return '<a class="' . esc_attr($a['class']) . '" href="' . esc_attr($a['href']) . '">' . $content . '</a>';
}
add_shortcode( 'button', 'btn_shortcode' );
//EDITADO:
Para agregar estilos definidos por el usuario, también solo necesitas agregar otro elemento al array:
function btn_shortcode( $atts, $content = null ) {
$a = shortcode_atts( array(
'class' => 'button',
'href' => '#',
'style' => ''
), $atts );
return '<a class="' . esc_attr($a['class']) . '" href="' . esc_attr($a['href']) . '" style="' . esc_attr($a['style']) . '">' . $content . '</a>';
}
add_shortcode( 'button', 'btn_shortcode' );
Aquí un ejemplo de uso:
[button href="foo" class="btn btn-lg btn-default" style="font-weight:bold; margin-top:50px; background-color: #999"]Aprende más[/button]
//EDITADO2:
Puedes agregar diferentes atributos de estilo al shortcode y luego mostrarlos todos dentro del atributo style de la etiqueta HTML, pero esto limitará el CSS personalizado solo a estos atributos predefinidos y también debes tener algunos valores predefinidos para cada uno en caso de que el usuario los deje vacíos.
Si algunos se dejan vacíos y no tienes valores predefinidos, podrías terminar con algo como esto - <a href="#foo" class="button" style="font-weight:; margin-top: 20px; background-color:;"
function btn_shortcode( $atts, $content = null ) {
$a = shortcode_atts( array(
'class' => 'button',
'href' => '#',
'background-color' => '#999',
'font-weight' => 'normal',
'margin-top' => '10px'
), $atts );
return '<a class="' . esc_attr($a['class']) . '" href="' . esc_attr($a['href']) . '" style="font-weight:' . esc_attr($a['font-weight']) . '; background-color' . esc_attr($a['background-color']). '; margin-top:' . esc_attr($a['margin-top']) . ';">' . $content . '</a>';
}
Aquí un ejemplo de uso:
[button href="foo" class="btn btn-lg btn-default" font-weight="bold" margin-top="50px" background-color="#999"]Aprende más[/button]

¿Por estilos te refieres a algo como [button href="foo" class="btn btn-lg btn-default" style="font-weight:bold"]Aprende más[/button]
o a algo diferente (si es algo diferente, por favor proporcióna un ejemplo)?

Sí, por ejemplo, digamos que tenemos font-weight, margin-top, background-color como ejemplos.

Echa un vistazo a mi respuesta editada. Por cada nuevo atributo que necesites, solo tienes que añadir otro elemento al array (y usarlo más adelante, por supuesto).

entonces en el array añado 'background-color' => 'whatever'
pero ¿cómo lo añado al estilo? No sé, todavía estoy un poco confundido.

Entonces, ¿necesitas múltiples atributos para diferentes propiedades de estilo y no solo uno donde añadas CSS puro?

Me gustaría saber cómo, como otro método para hacer esto. Tu método es genial. Conozco CSS, así que puedo entrar allí. Siento que si hubiera múltiples atributos para diferentes estilos, sería más fácil para alguien, como un cliente, entrar y hacer cambios que serían más fáciles de modificar.

Esto aún requeriría que el usuario tuviera que escribir cosas en "style", aquí está cómo esperaba que se viera el shortcode [button class="foo" background-color="#000000" margin-top="20px;"]

[button class="btn" style=""background-color:#e6e7e8; margin-top:100px;"]
Puse algunos valores de prueba aquí, basados en tu código, pero no los lee y toma los valores por defecto.

@Darren Bachan - ¿Viste la sección //EDIT2: donde el nuevo código hace exactamente lo mismo?
