web-dev-qa-db-ja.com

パラメータ内のパラメータを含むショートコード

私は私のサイトの至る所に異なるパラメータを持つ繰り返しの文章を持っています。

例:NAMEさんがDAYに本を読んでいますタイトル

大文字の単語は投稿ごとに異なり、(ここではキッカーです)私はDAYをリンクにします - 7つの個々のリンクのうちの1つ(週のそれぞれの日に1つ)。

私は曜日ごとのリンク用の7つのショートコードと文章用のショートコードを持っていますが、それらを一緒に動かすことはできません。

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");

そして、曜日のコードはかなり単純明快です。

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

私の投稿では

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

mary Sueが本を読んで| Jane Runを見る

しかし

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

「メアリーは本を読みました|」参照

私はこの問題に間違ったアプローチをしているように思われるかもしれませんが、他の方法で各投稿にいくつかの異なる変数を定義し、同じテキストを再利用する一貫性と単純さを維持する方法がわかりません。

3
A J

曜日のショートコードは必要ありません。また、 使用しようとしている方法は許可されていません。 タイトルを使用して、本のショートコードで必要なことをしないのはなぜですか。

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