• 解決済 gien

    (@gien)


    初投稿です。
    まだ初心者なので基本的な勘違いや無知があるかもしれませんがご容赦ください。

    トップページで表示している新着記事を、カテゴリごとに絞り込めるようにしたいのですが、タイトルのとおり、ajaxで使う関数をadd_actionの未ログイン時用が機能しません。

    もちろん関数自体はログイン時と同じものですし、そちらは問題なく動いています。
    ログイン関連のプラグインもいくつか使っていますが、全てのプラグインを無効化しても変化はありませんでした。

    何かおかしな点、改善点があれば教えて頂ければと思います。

    以下 コードです。
    header.php(ajax部分のみ)

    $.ajax({
    	type: 'POST',
    	url: ajaxurl,
    	data: data,
    	dataType: "JSON",
    	success: function( response ){
    		//var posts = JSON.parse( response );
    		var posts = response;
    		var phref;
    		if(posts.length == 0){
    			select_inner += '<section class="info_child">';
    			select_inner += '<h4>ないよ</h4>';
    			select_inner += '<section class="info_child">';
    			blog_main.innerHTML = select_inner;
    		}else{
    			if(response == 0){
    				select_inner += '<section class="info_child">';
    				select_inner += '<h4>ないって</h4>';
    				select_inner += '<section class="info_child">';
    				blog_main.innerHTML = select_inner;
    			}else{
    				for(var i = 0;i < posts.length;i++){
    					select_inner += '<section class="info_child" id="info_child">';
    					select_inner += posts[i]['thumbnail'];
    
    					select_inner += '<div class="info-text"><p>';
    					select_inner += posts[i]['time'];
    					select_inner += '</p></div>';
    
    					select_inner += '<h4 name="info_child_title">';
    					select_inner += '<a href="" target="blank">';
    					select_inner += posts[i]['post_title'];
    					select_inner += '</a>';
    					select_inner += '</h4>';
    
    					select_inner += '<div class="excerpt_text" name="excerpt_text">';
    					select_inner += posts[i]['post_content'];
    					select_inner += '</div>';
    					select_inner += '</section>';
    				}
    				console.log(select_inner);
    				blog_main.innerHTML = select_inner;
    				for(var i = 0;i < posts.length;i++){
    					var phref = posts[i]['permalink'];
    					phref.replace('http://localhost/wordpress/','');
    					document.getElementsByName('info_child_title')[i].firstChild.href = phref;
    					document.getElementsByName('excerpt_text')[i].lastChild.href = phref;
    					console.log(document.getElementsByName('excerpt_text')[i].lastChild.href);
    				}
    			}
    		}
    		document.getElementById('info_child_after_a').href = home_url+'category/'+cat;
    		document.getElementById('info_child_after_a').innerHTML = cat_name+'へ';
    		posts = null;
    	}
    });

    functions.php

    add_action( 'wp_ajax_nopriv_my_ajax_get_posts', 'my_ajax_get_posts' );
    add_action( 'wp_ajax_my_ajax_get_posts', 'my_ajax_get_posts' );
    function my_ajax_get_posts(){
    	$cat = $_POST['category'];
    	$cat_id = get_category_by_slug($cat);
    	$cat_id = $cat_id->cat_ID;
    	$returnObj = array();
    	$args = array(
    		'post_type' => 'post',
    		'numberposts' => 5,
    		'category' => $cat_id,
    	);
    	$posts = get_posts( $args );
    	foreach( $posts as $key => $post ) {
    		$content = preg_replace("|(<img[^>]+>)|si","",$post->post_content);
    		$content = mb_substr( strip_tags($content), 0, 60 );
    		if(mb_strlen($content) >= 60){
    			$content .= '<a href="' . get_permalink() . '">' . __('…(もっと見る)') . '</a>';
    		}
    		$returnObj[$key] = array(
    			'post_title' => $post->post_title,
    			'permalink' => get_permalink( $post->ID ),
    			'thumbnail' => get_the_post_thumbnail( $post->ID ),
    			'time' => get_post_time('Y.n.j', false, $post->ID ),
    			'post_content' => $content,
    		);
    	}
    	echo json_encode( $returnObj );
    	exit();
    }

5件の返信を表示中 - 1 - 5件目 (全5件中)
  • こんにちわ、gienさん。

    少々古い記事ですが、以下の記事が参考になると思います。ご自身のコードと比べてみてください。

    いまさらだけどWordPressでAjaxのやり方
    http://takahashifumiki.com/web/programing/1978/
    ※古い記事な為、非推奨関数などある可能性があります。

    トピック投稿者 gien

    (@gien)

    KUCKLUさん、ご返答ありがとうございます。

    ご提示いただいたサイト、早速目を通させて頂きます。

    最初に書き忘れていたので追加ですが、コードは以下のサイトを参考に作りました。

    http://hijiriworld.com/web/wordpress-ajax/

    トピック投稿者 gien

    (@gien)

    解決?しました。。

    wp_ajax_noprivの場合のみadmin-ajax.phpから先で302のステータスエラーが出ていました。
    色々調べながら辿ってはみましたが、遅々として進まず時間切れでした;

    ので、wordpressを介さず普通にphpとjavascriptで作ってみました。

    解決とはいかないのですが、一応対処が出来ました。

    ご返答いただきましたKUCKLUさん、ありがとうございました。

    もう、手遅れですかね…

    もちろん関数自体はログイン時と同じものです…

    フロントエンドでは、is_admin() は true になりますが、グローバル変数 ajaxurl は定義されていません。ドキュメント的には、

    url: admin_url('admin-ajax.php')

    のように自分で直書きするか、wp_localize_script() を使うかしてくれ、ってことになってます。

    AJAX in Plugins

    の Ajax on the Viewer-Facing Side あたりをご参考に。

    WordPress の Ajax 関連ドキュメントは、基本的に Plugin 作者向けなので、一般のユーザがそれで学習できるようにはなってません。関数によっては、何を言いたいのかわからないような英文になっていたりして、ちょっと使いにくいです。AJAX in Plugins も、どりあえずこれだけわかれば、使うのはできるよね、というくらいのノリになってます。日本語訳は、かなり古いもののようで、もはや翻訳にはなってません。そのうち、時間ができたら、日本語版の Codex を書きたいとは思っているのですが、貧乏暇なしで…

    gien さんが参考にしたページには書いてないですけど、check_ajax_referer() とか使えるので、WordPress を通したほうが安全だと思います。

    トピック投稿者 gien

    (@gien)

    kjmtshさん、ご返答ありがとうございます。

    「admin-ajax.php」は、コードの中にはありませんが、無理やりjavascriptの変数で定義してました。この関数はcodexで見はしたんですが、使い方勘違いしてました。。。ありがとうございます。

    またajaxの部分はいすれ改修することになりそうなので、色々勉強する指針が出来ました。

    一応これにて解決済みを付けさせて頂きます。
    ご返答いただきましたKUCKLUさん、kjmtshさん、ありがとうございました。

5件の返信を表示中 - 1 - 5件目 (全5件中)
  • トピック「ajaxで未ログイン時の「wp_ajax_nopriv~」が動かない」には新たに返信することはできません。