Obter shortcode do conteúdo e exibi-lo em outro lugar (na barra lateral, por exemplo)

Eu tenho um shortcode: [content_block]

Se esse shortcode existir em conteúdo e tem o atributo position = top, gostaria de removê-lo do conteúdo e exibi-lo em outro lugar. Por exemplo, na barra lateral.

Em suma:

  • Detectar se [content_block] existe
  • Se existir, detecte se a posição attibute = top
  • Se tem o atributo, armazene o código curto completo para exibi-lo em um lugar diferente (por exemplo, na barra lateral).
  • E remova-o do conteúdo.

Como eu posso fazer isso?

Obrigado.

Solutions Collecting From Web of "Obter shortcode do conteúdo e exibi-lo em outro lugar (na barra lateral, por exemplo)"

Você pode procurar o código que o WordPress usa para analisar os códigos abreviados para obter algumas idéias sobre como fazer isso. Existem algumas funções principais úteis para simplificar as coisas.

// our callback function to check for the shortcode. // this is where you'd put code to set a flag for rendering the shortcode elsewhere // the complete tag is in $tag[0], which can be passed to do_shortcode later function wpd_check_shortcode( $tag ){ if( 'content_block' == $tag[2] ){ // convert string of attributes to array of key=>val pairs $attributes = shortcode_parse_atts( $tag[3] ); if( array_key_exists( 'position', $attributes ) && 'top' == $attributes['position'] ){ // move shortcode to sidebar here // return empty to strip shortcode return ''; } } // return any non-matching shortcodes return $tag[0]; } // source text with shortcode $text = 'lorem ipsum [content_block]'; // this generates a regex pattern for all registered shortcodes $pattern = get_shortcode_regex(); // process all shortcodes through our callback function $text = preg_replace_callback( "/$pattern/s", 'wpd_check_shortcode', $text ); // modified $text with shortcode removed echo $text; 
 add_filter( 'the_content', 'wpse168789_shortcode_checker' ); function wpse168789_shortcode_checker( $content ) { // 1. Does the shortcode exist? if( has_shortcode( $content, 'content_block' ) ) { // 2. Is it using position='top'? $regex = '/\[content_block[^\]]*position=[\'"]?top[\'"]?[^\]]*\]/'; if( preg_match( $regex, $content ) ) { // 3. Filter the shortcode out of the_content $content = preg_replace( $regex, '', $content ); } } return $content; } 

Você provavelmente terá que massagear a expressão regular $regex – Eu não testei isso.

Quanto a exibir o conteúdo do shortcode em outro local – esta questão pode orientá-lo.

Referências

  • has_shortcode()
  • preg_match()
  • preg_replace()