web-dev-qa-db-fra.com

Shortcode avec paramètres à l'intérieur des paramètres

J'ai une phrase répétitive sur tout mon site avec différents paramètres.

Exemple: NAME a lu un livre le jour | TITRE

où les mots en majuscules varient avec chaque poste et (voici le kicker), je veux que DAY soit un lien - un des sept liens individuels (un pour chaque jour de la semaine).

J'ai sept codes abrégés pour les liens avec chaque jour de la semaine et un code abrégé pour la phrase, mais je ne parviens pas à les faire fonctionner ensemble.

function books($atts, $content = null) {
extract(shortcode_atts(array(
    "name" => '',
    "day" => '',
    "title" => '',
), $atts));
$output = '<div class="cite">';
if($name) { $output .= ''.$name.' read a book';}
if($day) { $output .= ' on '.do_shortcode($content).'';}
$output .= ' | '.$title.'</div>';
    return $output;
}
add_shortcode("books", "books");

Et puis le code pour les jours de la semaine est assez simple:

function monday() {        
return '<a href="http://website.com/" target="_blank">Monday</a>'; 
}
add_shortcode("monday", "monday");

Dans mon post

[books name="Mary Sue" title="See Jane Run"]

fonctionne très bien et sort: Mary Sue a lu un livre | Voir Jane Run

mais

[books name="Mary Sue" title="See Jane Run" day="[monday]"]

va wonky et sort: "Mary a lu un livre sur |" Voir

Je pense que le problème est peut-être mal abordé, mais je ne sais pas comment définir différentes variables dans chaque publication et conserver la cohérence et la simplicité de la réutilisation du même texte.

3
A J

Les codes abrégés des jours de la semaine ne sont pas nécessaires. En outre, la façon dont vous essayez de les utiliser n'est pas autorisée. Pourquoi ne pas simplement utiliser le titre et faire ce que vous voulez dans le shortcode des livres?

function books($atts, $content = null) {
  $atts = shortcode_atts( [
    "name" => '',
    "day" => '',
    "title" => '',
  ], $atts );

  $atts[ 'day' ] = ucfirst( strtolower( $atts[ 'day' ] ) );

  //* If you want to change the URL, you could switch on the day
  switch( $atts[ 'day' ] ) {
    case 'Monday':
      $url = 'https://example.com/';
      break;
    case 'Tuesday':
      $url = 'https://someotherurl.com/';
      break;
    //* etc.
  }

  return sprintf( 
    '<div class="cite">%1$s%2$s | %3$s</div>',
    '' === $atts[ 'name' ] ? '' : $atts[ 'name' ] . ' read a book',
    '' === $atts[ 'day' ] ? '' : 
      sprintf( ' on <a href="%1$s" target="_blank">%2$s</a>', $atts[ 'day' ], $url ),
    $atts[ 'title' ]
);
2
Nathan Johnson