Permitindo códigos de acesso dentro dos atributos

4

Eu quero fazer uma infobox do tipo Wikipedia para alguns artigos em um site do WP. Eu acho que a coisa mais lógica a fazer é usar um shortcode personalizado - um que retorna uma marcação semelhante a uma tabela com uma ordem fixa de campos, cada um com mais marcações no custom ao longo de algumas coisas condicionais para mostrar ou não campos se eles não forem set, emulando algo assim:

 <!--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.]]
 }}
Ainda assim, tenho sido impedido de usá-los em uma abordagem mais literal por anos, devido a códigos de acesso interrompidos por ter colchetes dentro dos atributos. Teoricamente, deve funcionar, mas não porque a regex de shortcode pára com a primeira ocorrência de um colchete de fechamento (]) em um shortcode, portanto, neste:

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

"saídas":

[foo bar="[baz /]

Não sei de que outra forma posso fazer essa marcação funcionar ou outra coisa com o mesmo objetivo.

    
por peroyomas 05.02.2014 / 05:36

1 resposta

3

Desculpe, os colchetes ainda não são permitidos dentro de códigos de acesso, como você pode ver na API de código de acesso . No entanto, é possível usar códigos de acesso que permitem usar colchetes. Deixe-me demonstrar isso:

Shortcode: [foo bar="No brackets here!"]...use [brackets] here[/foo]

Você pode adicionar esse tipo de shortcode no seu functions.php da seguinte forma:

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

Também é possível executar o conteúdo dentro dos colchetes como outro código de acesso:

Shortcode: [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>';
}

Mas vamos simplificar. Por que não adicionar os colchetes dentro do próprio código de acesso?

Shortcode: [foo bar="shortcode"]

E dentro do seu 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;
}

Se você quiser ficar com seu tipo de shortcode, você pode contornar os colchetes e adicionar algo semelhante para reconhecê-lo e substituí-lo via regex:

Shortcode: [foo bar="Use your ___shortcode___ here"]

No seu functions.php , você pode substituir ___shortcode___ por [shortcode] e executá-lo novamente por meio 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;
}

Ok, é um pouco complicado agora, não é? Outra abordagem (se você não quiser continuar fazendo isso por meio de códigos de acesso) seria campos personalizados. Campos personalizados estão disponíveis por padrão e podem ser alternados através do Opções de tela .

Você pode usar o the_meta () ou obtê-lo via get_post_meta () função para produzi-los facilmente dentro do seu tema. Além disso, é mais fácil (em comparação com os códigos de acesso) manipular a entrada e a saída, e ninguém dos editores precisa se lembrar de todos esses códigos de acesso disponíveis.

Você também pode gerar campos personalizados avançados facilmente através da interface de um plugin ou construa e estilize-os por conta própria . De qualquer forma, você terá bons campos de entrada abaixo ou ao lado do seu editor de texto sem limitações (até mesmo upload de arquivos, datepicker ...). Será algo parecido com isto:

    
por Sven 06.02.2014 / 02:10