サポート » 使い方全般 » サイドバーにアクセスランキングを表示したい

  • 解決済 mae-tel

    (@mae-tel)


    お世話になります。

    プラグイン wp most popular(人気記事)を使用しています。

    サイドバーに下記のコードを記述しているのですが、HelloWorld!(通常の投稿)が表示されてしまいます。
    現在、通常の投稿は使用しておりません。
    カスタム投稿タイプを指定しているのですが、取得できていないようです。
    同じページで他にquery_postsやget_postsを使っていますが、それが関係したりしているのでしょうか…?
    ちなみにget_postsを使うと、希望通りに取得できたのですが、他のループが崩れてしまったので
    new WP_Queryで記述してみたところ、他のループは崩れなくなりましたが、うまく取得できません。

    <?php
          $args = wmp_get_popular( array( 'limit' => 5, 'post_type' => 'photo', 'range' => 'all_time' ) );
          $rankpost = new WP_Query( $args );
          while ( $rankpost->have_posts() ) : $rankpost->the_post(); ?>
    
     <ul>
      <li><a href="<?php the_permalink(); ?>"><img src="<?php the_field('mainphoto'); ?>" alt=""/></a><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a>
      </li>
     </ul>
    <?php endwhile; wp_reset_postdata(); ?>

    初歩的なことなのかもしれませんが、どのようにすればよいかわからずにいます。
    よろしくお願いいたします。

14件の返信を表示中 - 1 - 14件目 (全14件中)
  • 使った事ないんですけど、気になったので

    $rankpost = wmp_get_popular( array( ‘limit’ => 5, ‘post_type’ => ‘photo’, ‘range’ => ‘all_time’ ) );

    で前の$rankpostの行はコメントアウトしてみてください。
    wmp_get_popularがオブジェクト返すなら上手く行くと思うんですけど、
    これで上手く行かないですか?

    トピック投稿者 mae-tel

    (@mae-tel)

    mikadukiman様、ご教授ありがとうございます!
    とても助かります。

    コードの上の部分のみ記載します、こういうことでしょうか?

    <?php
      $rankpost = wmp_get_popular( array( 'limit' => 5, 'post_type'=> 'photo', 'range' => 'all_time' ) );
       $rankpost = new WP_Query( $args );
          while ( $rankpost->have_posts() ) : $rankpost->the_post();
    ?>

    コード記述、試させていただきましたが人気記事部分のみ何も表示されませんでした。

    下記も試しましたが、他の表示部分が真っ白になったりして上手くいきませんでした…

    <?php
       $rankpost = wmp_get_popular( array( 'limit'=>5, 'post_type'=> 'photo', 'range' => 'all_time' ) );
    while ($rankpost->have_posts() ) : $rankpost->the_post();
    ?>

    きちんとサブループしているはずなのに、表示されないのはなぜなのでしょうか…

    たぶんカスタム投稿タイプの名前が違うんだと思います。

    register_post_type('ここの名前',$args);

    ここの名前はphotoであっていますか?

    モデレーター gatespace

    (@gatespace)

    プラグインの説明に書いてあるとおりにしてもダメなんですか?
    (ループの書き方が違うようですが)

    https://wordpress.org/plugins/wp-most-popular/other_notes/

    <?php
    echo '<ul>';
    $posts = wmp_get_popular( array( 'limit' => 10, 'post_type' => 'post', 'range' => 'all_time' ) );
    global $post;
    if ( count( $posts ) > 0 ): foreach ( $posts as $post ):
        setup_postdata( $post );
        ?>
        <li><a href="<?php the_permalink() ?>" title="<?php echo esc_attr(get_the_title() ? get_the_title() : get_the_ID()); ?>"><?php if ( get_the_title() ) the_title(); else the_ID(); ?></a></li>
        <?php
    endforeach; endif;
    echo '</ul>';
    ?>
    トピック投稿者 mae-tel

    (@mae-tel)

    mikadukiman様、ありがとうございます。

    カスタム投稿タイプは実際にはphotoではありませんが、
    記述の際は修正いたしました。

    ほかに原因があるのかもしれません…困りました…。。

    トピック投稿者 mae-tel

    (@mae-tel)

    gatespace様、ご教授ありがとうございます。

    最初は、ご掲示いただいているコードと同じやり方で記述しました。
    もちろん、人気記事はきちんと5件、上から順番に表示されました。

    ですが、他のループが崩れてしまったのです。
    めちゃくちゃ状態になってしまい、混乱したため
    new WP_Queryを使ったらどうなんだろうみたいな安易な考えで今に至っております。

    ということは人気記事コード自体にはやはり問題はなくて、
    他で使用しているループに問題があるということでしょうか…?

    このプラグインは

    $table = $wpdb->prefix . "most_popular";

    この名前でテーブルを作ります。
    このテーブルに入るのは、
    テーブルID、投稿ID、最終更新日、1日のアクセス数、
    1週間のアクセス数、30日のアクセス数が入ります。

    ここの投稿IDにカスタム投稿の投稿IDを入れて、
    アクセス数適当に入れてカスタム投稿タイプを指定した結果、
    出力したので、今はそのテーブルにデータが無いから表示されないだけだと思います。

    > 最初は、ご掲示いただいているコードと同じやり方で記述しました。
    > もちろん、人気記事はきちんと5件、上から順番に表示されました。
    >
    > ですが、他のループが崩れてしまったのです。
    > めちゃくちゃ状態になってしまい

    公式サイトの方法できちんとランキングが表示されるのであれば、やはりその方法が正しいのではないでしょうか。
    他のループが崩れてしまうのは $post が上書きされた後に復帰されていないからだと思います。最後に wp_reset_postdata() を入れるとどうでしょうか?

    <?php
    echo '<ul>';
    $posts = wmp_get_popular( array( 'limit' => 10, 'post_type' => 'post', 'range' => 'all_time' ) );
    global $post;
    if ( count( $posts ) > 0 ): foreach ( $posts as $post ):
        setup_postdata( $post );
        ?>
        <li><a href="<?php the_permalink() ?>" title="<?php echo esc_attr(get_the_title() ? get_the_title() : get_the_ID()); ?>"><?php if ( get_the_title() ) the_title(); else the_ID(); ?></a></li>
        <?php
    endforeach; endif;
    echo '</ul>';
    wp_reset_postdata();
    ?>
    トピック投稿者 mae-tel

    (@mae-tel)

    mikadukiman様 ありがとうございます。

    現在、サイトは試作中ではありますが、カスタム投稿タイプに10件ほどの
    テスト投稿を入れております。
    gatespace様が提示してくださったコードと同じことをしたときは
    きちんとアクセス数に応じたであろう記事群が取得&表示できましたので
    コードや記事取得状況については問題はないかと思うのですが…
    未熟なため柔軟な考えができず、申し訳ありません…。

    ちなみにテスト投稿を入れてから2カ月は経過しております…。。。

    トピック投稿者 mae-tel

    (@mae-tel)

    Takashi Kitajima様、ご教授ありがとうございます。

    上記では、コードの上部分しか書いておりませんが
    実際はsidebar.phpにこのように記述しています。

    <?php $posts = wmp_get_popular( array( 'limit' => 5, 'post_type' => 'photo', 'range' => 'all_time' ) );
    	global $post;
    	if ( count( $posts ) > 0 ): foreach ( $posts as $post ): setup_postdata( $post ); ?>
    <ul>
    <li><a href="<?php the_permalink(); ?>"><img src="<?php the_field('mainphoto'); ?>" alt=""/></a><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>
    <?php endforeach; endif; wp_reset_postdata(); ?>
    <?php unset( $post );?>
    </ul>

    これでランキングは問題なく表示されます。
    ただ、他のループが崩れます。

    なんとなくですが、崩れてしまうループが入っているテンプレートの全体の記述に問題があるのかもしれません。
    かなり長いですが見ていただくとありがたいです。

    <?php get_header(); ?>
    <?php get_template_part('top'); ?>
    
     <?php if(have_posts()):while(have_posts()):the_post(); ?>
     <?php endwhile;endif; ?>
    
    <div id="pankuzu">
     <a href="<?php echo home_url(); ?>/">HOME</a>
        >
     <?php the_title(); ?>
    </div>
    
    <?php get_sidebar(); ?>
    
    <div id="0">
     <?php if(have_posts()):while(have_posts()):the_post(); ?>
     <?php endwhile;endif; ?>
    
    //ここから下が崩れる
      <h2><?php the_title(); ?></h2>
    
    <div id="1">
     <?php
     $posttype  = 'photo';
     $taxonomy  = 'hoge';
     $types     = get_the_terms( $post->ID, $taxonomy, 'hide_empty=0&parent=2' );
     $typenames = array();
     foreach( $types as $type ){
        array_push( $typenames, $type->slug );
     }
     ?>
     <?php
     $args = array(
            'showposts' => '1',
            'orderby'   => 'rand',
            'post_type' => $posttype,
            'tax_query' => array(
                                array(
                                        'taxonomy' => $taxonomy,
                                        'terms'    => $typenames,
                                        'field'    => 'slug',
                                        'operator' => 'IN'
                                    ),
                                'relation' => 'AND'
                            ),
        );
     unset( $posttype );
     unset( $taxonomy );
     unset( $types );
     unset( $typenames );
     unset( $type );
     ?>
    
     <?php
     query_posts($args);
     if ( have_posts() ) : while ( have_posts() ) : the_post();?>
     <a href="<?php echo get_permalink($post->ID); ?>">
     <img src="<?php the_field( 'mainphoto', $post->ID ); ?>" alt="" /></p>
     <?php the_title(); ?>
     </a>
     <?php endwhile; else: ?>
     <img src="<?php bloginfo('stylesheet_directory');?>/images/noimage.jpg" alt="" /></p>
     <?php endif; ?>
     <?php
     wp_reset_query();
     unset( $args );
     ?>
    </div>
    
     <?php if(have_posts()):while(have_posts()):the_post(); ?>
     <?php endwhile;endif; ?>
     <?php echo do_shortcode('[cft format=1]'); ?>
       <h4><?php the_title(); ?></h4>
    
     <?php
     $term = array_shift(get_the_terms($post->ID, 'hoge'));
     ?>
     <?php $tax_posts = get_posts('post_type=other&taxonomy=hoge&exclude='.get_the_ID().'&term='.esc_html($term->slug)); if($tax_posts): ?>
    
    <div id="2">
     <?php foreach($tax_posts as $tax_post): ?>
     <?php if ($post->ID != $tax_post->ID): ?>
     <?php endif; ?>
    <div class="3">
      <a href="<?php echo get_permalink($tax_post->ID); ?>">
      <img src="<?php the_field( 'mainphoto', $post->ID ); ?>" alt="" />
      <?php echo esc_html($tax_post->post_title); ?>
      </a>
    </div>
      <?php endforeach; ?>
      <?php endif; ?>
    </div>
    //ここまで崩れる
    
    //ここから下は無事です
    <div class="4">
     <?php
     $titlelabels = wp_list_categories('echo=0&title_li=&hide_empty=0&taxonomy=hoge&post_type=other&depth=2&hierarchical=0&exclude=45,105,116,117,118,119,120,121,122,123') ; ?>
    
     <?php
     $arg = array(
            'showposts' => '9',
            'orderby'   => 'rand',
            'parent'    => '0',
            'taxonomy'  =>'hoge',
            'post_type' => 'other'
        );
     ?>
    
     <?php
     query_posts($arg);
     if ( have_posts() ) : while ( have_posts() ) : the_post();?>
     <a href="<?php echo get_permalink($post->ID); ?>">
     <?php the_title(); ?>
     </a>
     <?php endwhile; ?>
     <?php endif; ?>
     <?php
     wp_reset_query();
     unset( $arg );
     ?>
    </div>
    
    <?php get_template_part('bottomArea'); ?>
    
    <?php get_footer(); ?>
    //テンプレート終了

    スマートではないし汚いですが…
    sidebar.phpに記載しているランキングのコードを消すと、
    これらのループはきちんと動きます。。

    the_title() がループの外にあっても「きちんと動いている」ということなので、固定ページでしょうかね? 突っ込みどころ満載ですが、時間がないので、ひとつだけ。

    とりあえず、WP Most Popular のコードが sidebar.php にあるとして、get_sidebar() を下のあたりに移動したらどうなりますか?

    <?php get_template_part('bottomArea'); ?>
    <?php get_sidebar(); ?>
    <?php get_footer(); ?>
    トピック投稿者 mae-tel

    (@mae-tel)

    kjmtsh様、ご教授ありがとうございます!

    突っ込みどころ満載ですみません・・・

    テンプレートは、single-○○.phpというのを使用しているところのみ崩れています。
    固定ページテンプレートではありません。

    しかし、おっしゃるとおりの位置に移動させてみたところ、(もちろんレイアウトは崩れましたが)
    ランキングのほうも他のループも綺麗に取得&表示できました!

    これは…位置の問題ということですか…?

    位置の問題というよりも、これは、wmp_get_popular() 関数の仕様がそうなっている、としか言えないような気がします。実は、WP Most Popular を使ったことがなかったので、リポジトリを覗いてみたのですが、wmp_get_popular() 関数内部では、$wpdb クラスのメソッドを使ってデータを取得していました。WP_Query や get_posts() と違って、この場合はテンプレート関数が使えないので、それが使えるようにするために、半ば強引に global $post オブジェクトを持ってきて、setup_postdata() するのですね。

    このとき、global $wp_query オブジェクトは触っていませんので、wp_reset_postdata() すると、$wp_query オブジェクトの方がリセットされてしまいます。だから作者の使用例では使っていないのですが、Widget では、しっかり wp_reset_postdata() しているので、作者の方もよくわかっていないのかもしれません。また、書き換わった $post オブジェクトは、もとに戻っていません。wmp_get_popular() を実行した後に、これらを参照するコードは全滅です。

    それぞれの関数の定義が思い浮かべられない状態では、何が何だかさっぱりわからない説明になっているような気がしますが、大体、こんなことになっているわけです。だから、メインクエリが終わってから、$post を使い終わってから実行する場所に移動したというわけなのです。個人的には、プラグインの設計ミスだと思っています。

    さて、

    レイアウトは崩れましたが

    <?php get_sidebar(); ?>
    <?php get_template_part('bottomArea'); ?>
    <?php get_footer(); ?>

    この順番だと、なんとかなりますか? だめなら、スタイルシートを頑張って書くか、どうしても最初の位置に get_sidebar() を置きたいということなら、wp_reset_postdata() せずに、

    <?php
    global $post;
    $post_orig = $post;
    $posts = wmp_get_popular($arguments);
    if (count($posts) > 0) {
        foreach ($posts as $post) {
            setup_postdata($post);
            ...
        }
    }
    $post = $post_orig;
    ?>

    みたいな感じでどうでしょう? 運が良ければ、動作するかもです。

    トピック投稿者 mae-tel

    (@mae-tel)

    kjmtsh様、お返事大変遅くなり申し訳ありません。

    <?php get_sidebar(); ?>
    <?php get_template_part('bottomArea'); ?>
    <?php get_footer(); ?>

    この位置で正常に動作したため、
    CSSでのレイアウト調整でなんとか解決することができました!

    未熟のため、おっしゃるとおり難しい事はさっぱり…ですが
    wmp_get_popular()はもちろん今回のような事を想定して作られたわけではないし
    私のコードが仕様と反していたということでしょうか…。

    何はともあれ、get_sidebarの位置を下部にし、CSSでレイアウト調整するだけで
    解決いたしました。

    ご教授いただいたmikadukiman様 gatespace様 Takashi Kitajima様、kjmtsh様、
    未熟な問題に付き合っていただき、有難うございました。

    この調子だとまた質問させていただくことがあるかもしれません…その時は
    またご迷惑をおかけしますがよろしくお願いいたします。

14件の返信を表示中 - 1 - 14件目 (全14件中)
  • トピック「サイドバーにアクセスランキングを表示したい」には新たに返信することはできません。