サポート » 使い方全般 » Ajaxローディングで取得する記事一覧から特定のカテゴリを除外したい

  • Ajaxローディングで取得する記事一覧から特定のカテゴリを除外したいと考えています。

    【WordPress ページングはやめてAjaxローディングにする】
    こちらの記事を参考に、Ajaxローディングにすることはできたのですが、ここから特定のカテゴリを除外することができずに悩んでいます。

    「php WHERE post_type post_status category 除外」等のキーワードでヒットした記事を参考に、上記記事に掲載されているmore-disp.phpを

    <?php
    
    require_once("../../../wp-config.php");
    
    $now_post_num = $_POST['now_post_num'];
    $get_post_num = $_POST['get_post_num'];
    $cat_string = 'カテゴリID';
    
    $sql = "SELECT
            $wpdb->posts.ID,
            $wpdb->posts.post_title,
            $wpdb->posts.post_excerpt
        FROM
            $wpdb->posts
        WHERE
    		$wpdb->posts.post_type = 'post'
    		AND $wpdb->posts.post_status = 'publish'
    		AND $wpdb->posts.taxonomy = 'category'
    		AND $wpdb->posts.term_id IN ($cat_string)
        ORDER BY
            $wpdb->posts.post_date DESC
        LIMIT $now_post_num, $get_post_num";
    
    $results = $wpdb->get_results($sql);
    
    $html = "";
    
    foreach ($results as $result) {
        $html .= '<article>';
        $html .= '<h2><a href="'.get_permalink($result->ID).'">'.apply_filters('the_title', $result->post_title).'</a></h2>';
        $html .= '<div class="excerpt">'.apply_filters('the_excerpt', $result->post_excerpt).'</div>';
        $html .= '</article>';
    }
    echo $html;
    
    ?>

    と書き換えたのですが、クリックしても記事を読み込まなくなってしまいました。
    恐れ入りますが、アドバイスをいただけないでしょうか。

    よろしくお願いいたします。

10件の返信を表示中 - 1 - 10件目 (全10件中)
  • 今手元に何も無いのでココをこうする・・・。と具体的なことは言えませんが
    記事の情報は確かに
    FROM $wpdb->posts
    で取得できますがカテゴリはまた、別の場所に入っているので
    LEFT JOINなどでくっつけながらやっていく必要があります。

    別海として
    require(‘○○/wp-blog-header.php’);
    のようにすると自分でSQLクエリを組み立てなくても
    より楽なwordpressの各関数がそのまま使用できるようになるので
    get_postsなりで作っていったほうが楽かなとは思います。

    モデレーター gatespace

    (@gatespace)

    こういうやり方もありますよ。
    jQuery.autopagerをWordPressで利用して、ajaxで追加記事を読み込み、その後別のjsを動かす使い方
    http://nskw-style.com/2012/jquery/jquery-autopager-on-wp.html

    jQuery.autopagerを使えるようにある程度コードは書かないと行けないですが、
    SQL文はおろか、get_posts(あるいはquery_post)を使わなくても大丈夫なようです

    gatespaceさん補足ありがとうございます。
    こちらのほうが楽そうですね。

    tohakuさん。
    一点上記コードで

    $now_post_num = $_POST['now_post_num'];
    $get_post_num = $_POST['get_post_num'];

    の部分ですがもしそのまま使うのであれば
    最低限intvalでくくってやったほうがいいかと思います。

    jdbbさん
    gatespaceさん

    アドバイス本当にありがとうございます。

    知識不足でjdbbさんの教えてくださった情報が私では理解できないので、
    まずはgatespaceさんの教えてくださったページを拝見して試してみたいと思います。

    おそらくさらに疑問な点など出てくると思うので、またこちらで質問させていただきます。
    ありがとうございました。

    jdbbさん
    gatespaceさん

    間が空いてしまいましたが、ようやく「jQuery.autopagerをWordPressで利用して、ajaxで追加記事を読み込み、その後別のjsを動かす使い方」を参考に、追加の記事を読み込んで表示させることができるようになりました。

    しかし、ここから特定のカテゴリを除外する方法がわかりません。
    メインインデックスのテンプレート (index.php)のループに
    <?php query_posts(‘cat=-1’); ?>
    を加えてみたのですが、これだと最初の表示画面はカテゴリ1を除外した結果になるのですが、読み込みボタンを押すと最初と同じ記事が二重に読み込まれてしまいます。
    解決の方法について、アドバイスいただけないでしょうか?

    また、表示可能な記事がすべて表示されたら、読み込みボタンは非表示(またはすべて読み込み済みとわかるように変更)したいのです。
    こちらも解決策ありましたら、ぜひ教えていただけないでしょうか?

    よろしくお願いします。

    モデレーター gatespace

    (@gatespace)

    取り急ぎ簡単な方から

    表示可能な記事がすべて表示されたら、読み込みボタンは非表示(またはすべて読み込み済みとわかるように変更)したいのです。

    現在が何ページ目かはグローバル変数の $paged
    総ページ数もグローバル変数の $wp_querymax_num_pages で入っています。

    if ( $paged < $wp_query->max_num_pages ) {
     //  最終ページ以外
    }

    で条件分岐可能です。

    モデレーター gatespace

    (@gatespace)

    上の投稿の条件分岐は通常なら大丈夫ですが、
    jQuery.autopager でループしている外側では $paged の値が更新されないので、
    使えませんでした。

    検証してみたのですが、jQuery.autopager のイベントで
    current.page というオブジェクトに現在のページ番号が入るので、
    これと $wp_query->max_num_pages の値を比較して、
    最終ページであれば読み込みボタンは非表示にできました。

    前提条件として、
    functions.phpで読み込んでいた general.js(jQuery.autopager の設定部分)は
    index.php内に直接記述しますので、
    読み込まない(削除)しておいてください。

    必要な部分だけですが

    <?php
    	query_posts($query_string.'&cat=-1'); // クエリの改変
    	if ( have_posts() ) :
    ?>
    		<div class="entryList"><!-- autopagerで読み込むコンテンツ -->
    			<?php while ( have_posts() ) : the_post(); // ループスタート ?>
    				各投稿
    			<?php endwhile; ?>
    			<script type="text/javascript">
    			/* <![CDATA[ */
    				jQuery(function() {
    					$.autopager({
    						autoLoad: false,
    						content: '.entryList',
    						link: '.ajaxLoad a',
    						load: function(current, next) {
    							if( current.page >= <?php echo $wp_query->max_num_pages; ?> ){ $('.ajaxLoad').hide(); }
    						}
    					});
    					$('.ajaxLoad a').click(function() {
    						$.autopager('load');
    						return false;
    					});
    				});
    			/* ]]> */
    			</script>
    		</div><!-- // .entryList -->
    		<div class="ajaxLoad">
    			<?php next_posts_link('続きを見る'); ?>
    		</div>
    		<?php else : ?>
    			投稿がありません
    	<?php endif; ?>
    <?php wp_reset_query(); ?>

    ありがとうございます!週末にチャレンジしてみます。

    カテゴリ除外のほうも、自分なりにがんばってみるつもりですが、何分実力不足なのでお時間あるときにアドバイスいただけると嬉しいです。

    よろしくお願いします。

    gatespace様

    おかげさまで、特定のカテゴリを除外することと、すべての読み込みが完了したらボタンを非表示にすることが実現できました。
    本当にありがとうございます。

    ですが、まだ問題があって、困っています。
    最初にアクセスしたときは10件の記事を表示→もっと読むボタンでさらに10件づつ追加にしたいのですが、現在の状況ですと2つの問題があります。

    最初の表示された状態で10件表示は、表示各種設定の1ページに表示する最大投稿数で指定すれば問題なくできるのですが、もっと読むボタンを押すと残っているすべてが1度に読み込まれてしまいます。23件ある記事のうち、最初は10件、もっと読むボタンを押すと13件が読み込まれてしまうのです。
    これはjQuery.autopagerのオプションで指定できるのかと見てみたのですが、わからず。。。

    もうひとつは、最初に10件表示された状態でボタンを押しても反応せず、何度かクリックすると読み込むという現象が起きています。
    ※chrome,Fx,IE9で確認しました。

    わからないなりに検索して調べてみても、私の実力では雲をつかむようで途方にくれています。
    何から何まで頼りっぱなしで本当に心苦しいのですが、お心当たりがありましたらアドバイスをお願いいたします。。。

    モデレーター gatespace

    (@gatespace)

    私の方で
    WordPress:3.4.2
    テーマ:Twenty Eleven(の子テーマ)
    プラグイン:WP Multibyte Patch のみ
    で管理画面で設定した件数で読み込んでいくことを確認しています。

    管理画面以外で表示件数を変えるような処理をしていませんか?
    (WP Query、query_posts、get_postsなどのテンプレートタグやプラグインなど)

    いったん、すべてのプラグインを外し、テーマもjQuery.autopager部分だけを入れたものにして確認してみてください

10件の返信を表示中 - 1 - 10件目 (全10件中)
  • トピック「Ajaxローディングで取得する記事一覧から特定のカテゴリを除外したい」には新たに返信することはできません。