web-dev-qa-db-ja.com

ページ内のCPT投稿コンテンツのショートコード

私はコーディングしているプラ​​グインと一緒にWizテーマを使います。 Wizテーマには、Visual Composerバンドルおよびページのテーマオプション(ヘッダー、サイドバー、フッターなど)が付属しています。ただし、これらのオプションはページにのみ使用でき、投稿には使用できません。私の顧客はページではなく投稿を作成する必要があります。なぜなら彼は私がプラグインでコーディングしたカスタム投稿タイプを使用しているからです。その後、私の顧客が新しい投稿でクローン作成および編集できる投稿と、投稿の内容をページに挿入することになっているショートコード[dw_evento]を作成しました。ショートコードのPHPコードは次のとおりです。

public static function dw_evento()
{
  global $wp_filter, $merged_filters, $wp_current_filter;
  global $post;

  $post_id = $_GET['post_id'];
  if (is_array($atts))
    extract($atts, EXTR_OVERWRITE);
  if (empty($post_id))
    return;
  $save_wp_filter = $wp_filter;
  $save_merged_filters = $merged_filters;
  $save_wp_current_filter = $wp_current_filter;
  $post = get_post($post_id);
  setup_postdata($post);
  $content = $post->post_content;
  $content = apply_filters('the_content', $content);        
  //$content = do_shortcode($content);
  $content = str_replace(']]>', ']]>', $content);

  $wp_filter = $save_wp_filter;
  $merged_filters = $save_merged_filters;
  $wp_current_filter = $save_wp_current_filter;
  return $content;
}

それから私はそのショートコードだけを含むページを作成しました、それで私はそのページのためにテーマオプション(ヘッダー、サイドバー、フッター)を設定することができます。最後に、私のプラグインは投稿アーカイブを表示し、リストの各項目をショートコードのみを含むページにリンクし、post_idを$ _GETに渡します。

問題は、パーマリンクで直接投稿を閲覧しているとき、および私のショートコードで対応するページを閲覧しているときに、投稿の内容が同じように表示されないことです。

コンテンツに関することは言うまでもありませんが、これは投稿に欠けているオプションに依存するため、ここでは投稿とページのコンテンツの違いを見ることができます。

これがそのパーマリンクによって閲覧された投稿です: http://www.miglioredirazzareport.eu/evento_type/internazionale-di-bari-2/enter image description here

そして、ここにショートコード[dw_evento]を付けてページにレンダリングされた同じ投稿があります: http://www.miglioredirazzareport.eu/evento/?post_id=3753page

ご覧のとおり、ページのレンダリング方法が異なります。特に、水平線が表示されていません。生成されたHTMLのその断片は、2つの文書で同じです。トロフィーの場合:

<div class="uvc-heading-spacer line_with_icon" style="topheight:32px;">
  <div class="ult-just-icon-wrapper ">
    <div class="align-icon" style="text-align:center;">
      <div class="aio-icon circle "  style="color:#f67207;font-size:32px;display:inline-block;">
        <i class="Defaults-trophy"></i>
      </div>
    </div>
  </div>
</div>

ただし、適用されるCSS規則は少し異なります。どのCSSルールがページに適用されるのかを調べると(Chromeで検査)、投稿に「:: after」が表示されていません。

<div class="uvc-heading-spacer line_with_icon" style="topheight:32px;">
  <div class="ult-just-icon-wrapper ">
    <div class="align-icon" style="text-align:center;">
      <div class="aio-icon circle "  style="color:#f67207;font-size:32px;display:inline-block;">
        <i class="Defaults-trophy"></i>
      </div>
    </div>
  </div>
  ::after
</div>

そして ":: after"は関連するCSSクラスを適用し、水平線を表示させる。

#ultimate-heading-447156b22ea4f2bf9 .uvc-heading-spacer.line_with_icon:before, #ultimate-heading-447156b22ea4f2bf9 .uvc-heading-spacer.line_with_icon:after {
    width: 182px;
    border-style: solid;
    border-color: #ccc;
    border-bottom-width: 1px;
}

今問題はWordpressがページを生成するとき含まれていないCSSファイルから来る。ドキュメントのソースから、ページのセクションがCSS以外のすべてのCSSをリンクしていることがわかります。

<link rel='stylesheet' id='ultimate-style-min-css'  href='http://www.miglioredirazzareport.eu/wp-content/plugins/Ultimate_VC_Addons/assets/min-css/ultimate.min.css?ver=3.13.7' type='text/css' media='all' />

これは、上記の "uvc-heading-spacer.line_with_icon:after"クラスを含むCSSファイルです。

"wp-head"アクションをフックすることで自分自身でそのファイルを追加できると確信していますが、それは私のプラグインをUltimate VC Addonsプラグインに人為的に依存させるでしょう。 。

WordPressが自分のページにそのスタイルシートを含まないのはなぜですか?

1
Lucio Crusca

私は問題を「解決する」というワードアラウンドを見つけましたが、それが唯一の解決策であるかどうかわからないまでは答えとして受け入れるつもりはありません(私はそれがそうではないと思う)。

私のページにはUVCAショートコードが含まれていない、または少なくとも最初のページの内容が含まれていないため、WPにUltimate VCアドオン(UVCA)CSSが含まれていないじゃない。 WP内のショートコードは再帰的ではありません。ショートコードが他のショートコードを含む出力を生成する場合、それらのショートコードを処理するのはプログラマーの責任です。私は実際に電話します

$content = apply_filters('the_content', $content); 

wp-headアクションはすでにその時点で実行されているので、それは必要なCSSを含めるために十分ではありません。 wp-headアクションでは、WPコードまたはUVCAコードのどちらであろうと、次のような抜粋があるはずです。

foreach ($registered_shortcodes as $shortcode)
  if (strpos($page_content, $shortcode) !== FALSE)
    output_link_tags(get_dependencies($shortcode));

(注意してください、これはほとんど疑似コードで、識別子は構成されています)。そのため、最初からページのコンテンツにUVCAショートコードを強制的に含めることで、WP(またはUVCA)に必要なCSSを含めずにコードをUVCAプラグインに依存させることができます。

私は自分の[dw_elenco]ショートコードで自分のページを編集し、これを追加することでこれを「解決」しました。

<div style="display: none;">[ultimate_heading main_heading="x"][/ultimate_heading]</div>

これは最善の解決策ではあり得ず、確かにバグを反映しています。バグは私のコード(おそらく)、UVCAコード(おそらく)、またはWPコード(ありそうもない)にあります。さらに、解決策は一般的ではありません。ある日、私の顧客がカスタムCSSを必要とする他のショートコードを含む他のプラグインを追加した場合、この解決策は不十分になります。

しかし、これは私がこれまでに見つけた最高の解決策です。

編集:私は今私の答えを受け入れることができます、唯一の解決策ではないにもかかわらず、この問題に対するきれいな解決策がないからです。私の他の、より一般的な質問 の詳細はこちら

0
Lucio Crusca