サポート » テーマ » ウィジェットでechoが出力されません。。

  • 解決済 nonoo

    (@wamg)


    現在、WordPress 3.8.4 、Fashionistasのテーマを使用しています。

    ウィジェットにて、
    <?php the_title(); ?>であれば出力されるのですが、

    $post_title = $post->post_title;
    if(mb_strlen($post_title)>30) {
    	$post_title = mb_substr($post_title,0,30).'...';};

    を指定し、
    <?php echo( $post_title ); ?>

    <?php print( $post_title ); ?>
    などで出力をすると、文字が出力されません。

    テーマ内の他の部分であれば完璧に出力できるのですが、
    ウィジェット内のみ出力がされません。。

    ちなみに、

    <ul><li><a href="<?php the_permalink() ?>"><?php echo( $post_title ); ?></a></li>
    </ul>

    とした場合、の部分はソースで確認するかぎり、出力されております。

    どなたか、ご教示頂けると幸いです。

9件の返信を表示中 - 1 - 9件目 (全9件中)
  • トピック投稿者 nonoo

    (@wamg)

    最後の部分、リンクになってしまいましたが、
    パーママリンク、aタグの部分は出力されておりますが、
    タイトル部分は全く何も出力されていない状態です。

    ウィジェットの中で $post->post_title を使う前に、$post にどんな値をセットしていらっしゃいますか?

    トピック投稿者 nonoo

    (@wamg)

    <?php query_posts(
    array(
        'cat' => -3,
         'post_type' => array('post1','post2'),
         'posts_per_page' => 5 ));
     ?>
    <ul>
    <?php if (have_posts()) : while(have_posts()) : the_post();
    $cat = get_the_category();
    $cat = $cat[0];
    $mypost = get_post($post->ID);
    $cat_description = $cat->category_description;
    $post_title = $post->post_title;
    if(mb_strlen($post_title)>30) {
    	$post_title = mb_substr($post_title,0,30).'...';};
    ?>
    <li>
    <a href="<?php the_permalink() ?>"><?php echo( $post_title ); ?></a>
    </li>
    <?php endwhile; endif; wp_reset_query(); ?>
    </ul>

    >ウィジェットの中で $post->post_title を使う前に、$post にどんな値をセットしていらっしゃいますか?

    恥ずかしながら、知識がなく、、
    $postに関しての記述はなさそうです…

    今、サンプルページ(ウィジェット外)で作動しているのはこのようなコードになっております。
    アドバイス宜しくお願いします。

    トピック投稿者 nonoo

    (@wamg)

    連投すいません。
    サンプルのコードを挙げてしまいましたが、
    実際、出力の方では

    <li class="sample_list"><span class="sample-<?php echo $cat->category_nicename; ?><?php echo esc_html(get_post_type_object(get_post_type())->name); ?>"><?php echo $cat_description; ?><?php echo esc_html(get_post_type_object(get_post_type())->description ); ?></span> <a href="<?php the_permalink() ?>"><?php echo( $post_title ); ?></a></li>
    <?php endwhile; endif; wp_reset_query(); ?>
    </ul>

    となってます。
    コードは素人でグチャグチャかもしれませんが、
    カスタム投稿と、通常投稿の2つを同時に読み込んだ後、
    両方共の説明文を出力し、タイトルの前に出力をしています。

    ややこしくてすいません。。

    $postに関しての記述はなさそうです…

    ウィジェットの方では、$post に現在の投稿データが入っていないので(まったく何も入っていない状態)$post->post_title を表示しても何も出力されません。
    サンプルページの方はループwhileからendwhile)の中で呼び出している the_post() によって、$post に現在の投稿データが入ります。

    そういう訳ですので、ウィジェットの中でもクエリ(get_posts等)で投稿を指定してから、その投稿のタイトルを表示する、という流れにする必要があります。標準の TwentyFourteen テーマの「最近の投稿」ウィジェットはそういう中身になっています。

    nonooさんのやりたいことと違うかもしれませんが、例えば Posts in Sidebar プラグインが使えるかもしれないですね。

    トピック投稿者 nonoo

    (@wamg)

    ご返信ありがとうございます。

    nonooさんのやりたいことと違うかもしれませんが、例えば Posts in Sidebar プラグインが使えるかもしれないですね。

    プラグインを一度導入してみましたが、
    やはり、自分の希望とは少し違い
    使用を断念をしました。

    イマイチ、クエリでの指定の仕方、
    単純に基本的なphpコードの流れが理解しきれておらず、
    繰り返しの質問になって申し訳ないのですが、
    いま現在のやり方(query_posts)だとサイドバーでのタイトル表示は難しいのでしょうか?

    色々とググって、こんなかんじでコードを組んでみましたが、
    こちらも同様にタイトルのみ出力はされません、、、。

    <?php
    $arg = array(
    'cat' => -1,
    'post_type' => array('post','test'),
    'posts_per_page' => 5 );
    ?>
    <ul>
    <?php $my_posts = get_posts( $args );
    foreach ( $my_posts as $post ) :
    setup_postdata( $post );
    $cat = get_the_category();
    $cat = $cat[0];
    $mypost = get_post($post->ID);
    $cat_description = $cat->category_description;
    $post_title = $post->post_title;
    if(mb_strlen($post_title)>30) {
    	$post_title = mb_substr($post_title,0,30).'...';};
    ?>
    <li>
    <span class="test-<?php echo $cat->category_nicename; ?><?php echo esc_html(get_post_type_object(get_post_type())->name); ?>">
    <span class="test2"><?php echo $cat_description; ?><?php echo esc_html(get_post_type_object(get_post_type())->description ); ?>
     </span></span>
    <a href="<?php the_permalink() ?>"><?php echo( $post_title ); ?></a></li>
    <?php endforeach; ?><?php wp_reset_postdata(); ?>
    </ul>

    私が、実際に動作させたいコードは
    ■サイドバーに新着記事一覧を表示
    ■通常投稿の中から特定のカテゴリの記事(上のコードでは全ての通常投稿を出力したあと、特定カテゴリのみ削除しています)と、カスタム投稿の中から特定のカテゴリの記事のみ出力
    ■記事一覧のタイトル横に各カテゴリの説明文を表示
    ■各説明文にカテゴリごとでのクラス名をつける
    ■長いタイトルは省略する。
    です。

    どなたご教授頂けると幸いです。
    宜しくお願いします。

    var_dumpしてみれば…と思ったけどthe_titleが大丈夫なのであればget_the_title使えば早いかもしれませんね。

    モデレーター gatespace

    (@gatespace)

    うーん。
    ウィジェット内でPHPコードをかけるようにするプラグインを使用されている事と思いますが、(脆弱性の観点から)おすすめできませんので、考え方だけ。

    まず、ウィジェットをおきたい場所(sideber.phpなど)でPHPのコードを書いて、
    期待通りの出力になるように調整してください。

    そのあと(おすすめできませんが)、ウィジェット内にうまくいったコードをコピペしてください。
    出来れば、このとき自作のウィジェットを作るのがベストですが。

    例えば、sidebar.phpに書いたときはうまくいくのに、ウィジェットにコードを書くとうまくいかない、など、問題の切り分けも出来ますよ

    トピック投稿者 nonoo

    (@wamg)

    ご返信ありがとうございます。

    get_the_title使えば早いかもしれませんね。

    アドバイスを頂いたとおり
    <?php echo wp_trim_words( get_the_title(), 20 ); ?>
    を使うことで無事、解決出来ました!
    本当にありがとうございました。

    もしどなたかの参考になれば幸いなので、
    最終的なコードを表示させておきます。

    query_posts(
    array(
        'cat' => -1,
         'post_type' => array('post','test'),
         'posts_per_page' => 5 ));
     ?>
    <ul>
    <?php if (have_posts()) : while(have_posts()) : the_post();
    $cat = get_the_category();
    $cat = $cat[0];
    $mypost = get_post($post->ID);
    $cat_description = $cat->category_description;
    ?>
    <li><span class="test-<?php echo $cat->category_nicename; ?><?php echo esc_html(get_post_type_object(get_post_type())->name); ?>"><span class="test"><?php echo $cat_description; ?><?php echo esc_html(get_post_type_object(get_post_type())->description ); ?>
     </span></span> <a href="<?php the_permalink() ?>"><?php echo wp_trim_words( get_the_title(), 20 ); ?></a></li>
    <?php endwhile; endif; wp_reset_query(); ?>
    </ul>

    また、gatespaceさんからもご返信頂いた内容を勉強させて頂き、
    色々と調べてみると”Shortcode Exec PHP”や”PHP Code Widget”などのphpが使えるような
    プラグインは危険とのことでしたので、
    サイドバーはショートコードを使用し運用することにしました。
    ご指摘頂き、ありがとうございました。

    ちなみに上記のphpコードをショートコードに変換することが、
    自分の技術不足でうまくいかなかったので、(苦笑)
    “Post Snippets”というプラグインを使用し、運用しています。

    ご返信頂き、サポートして頂いた皆様、本当にありがとうございました!

9件の返信を表示中 - 1 - 9件目 (全9件中)
  • トピック「ウィジェットでechoが出力されません。。」には新たに返信することはできません。