Verificando se existe um atributo em um shortcode

5

Eu escrevi um pequeno plugin que cospe o html para um botão. Funciona muito bem, exceto por uma coisa: se o usuário não especificar uma imagem, a imagem aparecerá quebrada. Existe uma maneira de eu verificar e ver se o usuário especificou uma imagem, e apenas imprimir o código da imagem se for esse o caso?

Este é o código do meu plug-in:

function button_shortcode($args) {
    return "<a class=\"button\" href=\"" . $args["url"] . "\"><img alt=\"" . $args["bigtext"] . "\" class=\"alignleft\" src=\"" . $args["img"] . "\" /><small>" . $args["smalltext"] . "</small>" . $args["bigtext"] . "</a>";
}
add_shortcode("button", "button_shortcode");

Aqui está o shortcode:

[button url="http://www.example.com/" img="/path/to/image.png" smalltext="Smaller Text" bigtext="Bigger Text"]

    
por JacobTheDev 01.05.2014 / 20:54

3 respostas

0

Borek apontou na direção certa, aqui está meu bom código *:

function button_shortcode($attributes, $content) {
    if ($attributes["image"] != "") {
        $img = "<img alt=\"" . $content . "\" class=\"alignleft\" src=\"" . $attributes["image"] . "\" />";
    } else {
        $img = "";
    }
    if ($attributes["intro"] != "") {
        $intro = "<small>" . $attributes["intro"] . "</small>";
    }
    return "<a class=\"button\" href=\"" . $attributes["link"] . "\">" . $img . $intro . $content . "</a>";
}
add_shortcode("button", "button_shortcode");

* Nota: eu mudei alguns nomes de atributos e outras coisas também, mas isso não foi necessário.

    
por JacobTheDev 01.05.2014 / 21:41
4

Ok, eu reescrevi a função para que ela faça o seguinte:

  • verifica se os valores da matriz estão definidos antes de usá-los. Você nem sempre pode ter certeza de que eles estarão lá.
  • se a imagem estiver vazia, ela retornará com uma mensagem de erro. Não tenho certeza se é isso que você quer, mas você pode simplesmente removê-lo.
  • primeiro cria sua imagem em html.
  • então, se houver um URL especificado, a imagem será encerrada no HTML do seu link. Caso contrário, apenas retornará seu HTML de imagem.

Observe a maneira como criei seu HTML. Quebrar e abrir cordas e escapar de citações etc. é confuso e difícil de ler. Use aspas simples ao construir strings HTML para que você possa usar aspas duplas sem escapar delas.

Eu também usei sprintf () e depois substituo cada peça que eu quero. Muito mais fácil de ler e modificar depois.

Espero que ajude!

function button_shortcode($args) {

    if ( empty( $args['img'] ) ) {
        return 'Error - no image source was specified';
    }

    $sBigText = isset( $args['bigtext'] )? $args['bigtext'] : '';
    $sSmallText = isset( $args['smalltext'] )? $args['smalltext'] : '';

    $sHtmlToReturn = sprintf( '<img alt="%s" class="alignleft" src="%s" /><small>%s</small>%s', $sBigText, $args['img'], $sSmallText, $sBigText );

    if ( !empty( $args['url'] ) ) {
        $sHtmlToReturn = sprintf( '<a class="button" href="%s">%s</a>', $args['url'], $sHtmlToReturn );
    }

    return $sHtmlToReturn;
}

Paulo.

    
por Paul G. 01.05.2014 / 21:41
2

Que tal simplesmente atribuir uma imagem padrão a essa variável? Então, se nenhuma imagem é especificada, um URL de imagem padrão (ao invés de vazio) é usado? BTW. O que há com essas barras invertidas? Apenas use aspas simples e duplas.

function button_shortcode($args) {
    extract(shortcode_atts($default=array(
        'url' => 'http://default.com',
        'bigtext' => 'Your default big text',
        'img' => 'http://your-default-img-path.com/img.png',
        'small' => 'Your default small text',
    ), $args));
    return '<a class="button" href="' . $url . '"><img alt="' . $bigtext . '" class="alignleft" src="' . $img . '" /><small>' . $smalltext . '</small>' . $bigtext . '</a>';
}
add_shortcode("button", "button_shortcode");

Agora, se você precisar gerar botões separados (se a imagem estiver presente ou não), use as condicionais da seguinte forma:

function button_shortcode($args) {
    extract(shortcode_atts($default=array(
        'url' => 'http://default.com',
        'bigtext' => 'Your default big text',
        'img' => '',
        'small' => 'Your default small text',
    ), $args));

    if (!empty($url)) {
        $button_output = '<a class="button" href="' . $url . '"><img alt="' . $bigtext . '" class="alignleft" src="' . $img . '" /><small>' . $smalltext . '</small>' . $bigtext . '</a>';
    } else { 
        $button_output = '<a class="button" href="' . $url . '"><small>' . $smalltext . '</small>' . $bigtext . '</a>';
    }

    return $button_output;
}
add_shortcode("button", "button_shortcode");
    
por Borek 01.05.2014 / 21:15