• 解決済 mikujin

    (@mikujin)


    お世話になります。
    固定ページ全件のスラッグを取得し、さらに親ページがある場合は、親ページのスラッグも取得したいのですが、思い通りにいかず相談させて頂きます。
    以下のコードで何度も試していますが、意図した通りに出力出来ません。

    <?php
    $page_list = get_posts( 'numberposts=-1&order=ASC&post_type=page' ); // ページ情報の取得
    $parent_id = $post->post_parent; // 親ページのIDを取得
    $parent_slug = get_post($parent_id)->post_name; // 親ページのスラッグを取得
    global $post;
    global $parent_slug;
    foreach ( $page_list as $post) {
    if ( is_page() && $post->post_parent ):
    echo '親あり'. $parent_slug .'-' .$post->post_name;
    else:
    echo '親なし'. $post->post_name;
    endif;
    ;}
    ?>

    【出力したい結果】
    親あり oyaslug-postname
    親なし postname



    ご教示頂ければ幸いです。
    どうぞ宜しくお願いいたしますm(_ _)m

8件の返信を表示中 - 1 - 8件目 (全8件中)
  • @mikujin さん

    こんにちは。
    ちょっと作ってみたのですが、こんな感じでしょうか?

    function pageParentBranch()
    {
    	$page_list = get_posts( 'numberposts=-1&order=ASC&post_type=page' ); // ページ情報の取得
    	foreach($page_list as $postObj){
    		if($postObj->post_parent === 0){
    			echo '親なし'. $postObj->post_name."\n";
    		}else{
    			echo '親あり'. $postObj->post_name."\n";
    		}
    	}
    }
    

    手元の環境では親あり/なしで出力出来ていると思います。

    トピック投稿者 mikujin

    (@mikujin)

    childsview 様、ご回答ありがとうございます。
    早速functions.phpに頂いたコードをペーストしてみたのですが、出力結果がすべて「親なし postname」の一覧になってしまいます。
    実際に親なしのものも親ありのものも同じ結果です。
    固定ページから親の設定なども再度確認しまししたが、親ありのページもあります。
    どの部分かの分岐ができていないのでしょうか・・・
    引き続きお力をお貸し頂ければ幸いです。
    宜しくお願いいたします(:_;)

    @mikujin さん

    こんにちは。
    改めて確認しましたが、手元の環境では正常に動作しているようです。
    原因追及のために、都度var_dump();で出力すると分かるかもしれませんのでお試しください。

    トピック投稿者 mikujin

    (@mikujin)

    childsview 様、ご回答ありがとうございます。
    ご回答頂いてからも何度試していますが、解決に至っておりません。
    $parent_slugというコードを認識しないようです。
    また、アドバイス頂いたvar_dump();で出力したところ、NULLと表示されます。

    現在表示しているページの直上の親スラッグではなく、全ページの各親スラッグの表示ができないです。
    試しに別のPHPファイルにて出力すると、直情の親スラッグが親ありスラッグの全件に適応されました。
    なのでループ内外の処理の問題なのかとも思い、get post()などを試したのですが、やはりできず・・・
    お力貸して頂けると幸いです(:_;)
    宜しくお願いいたします。

    @mikujin さん

    こんにちは。
    $parent_slug というコードはご提案したコードに含まれていません。

    また最初の内容では2階層程度の想定だったと思いますので、
    3階層以上の場合は、get_ancestorsなどの関数を利用する形になるかと思います。
    https://developer.wordpress.org/reference/functions/get_ancestors/

    トピック投稿者 mikujin

    (@mikujin)

    childsview 様、ご回答ありがとうございます。
    以下のコードで再度試してみましたが、やはり親のスラッグを表示してくれません。
    2階層の想定で親スラッグと子スラッグのみ取得したいです。

    <?php
    	$page_list = get_posts( 'numberposts=-1&order=ASC&post_type=page' ); // ページ情報の取得
    	foreach($page_list as $postObj){
    		if($postObj->post_parent === 0){
    			echo '親なし'. $postObj->post_name."\n";
    		}else{
    			echo '親あり'. $postObj->post_name."\n";
    		}
    ;}
    ?>

    childsview 様の環境では上記で親スラッグが取得できているのでしょうか?
    何が違うのかわかりません・・・
    ご回答頂けましたら幸いです。
    宜しくお願いいたします。

    こんばんは。

    function oyaslug(){
    	$page_list = get_posts( 'numberposts=-1&order=ASC&post_type=page' );
    	foreach ( $page_list as $post){
    		$parent_id = $post->post_parent;
    		$parent_slug = get_post( $parent_id )->post_name;
    		if ( is_page() && $post->post_parent ):
    			echo '親あり '. urldecode( $parent_slug ) .'-' .urldecode( $post->post_name ). "<br>";
    		else:
    			echo '親なし '. urldecode( $post->post_name ). "<br>";
    		endif;
    	}
    }
    
    add_shortcode( 'oyaslug' , 'oyaslug' );

    出力したいところで[oyaslug]

    これで出力されますでしょうか?

    トピック投稿者 mikujin

    (@mikujin)

    arborvitae666様、ご回答ありがとうございます。
    頂いたショートコードでの出力はできませんでしたが、教えて頂いたコードをベースに再度コードを見直し、下記のコードでようやく実装ができました!

    <?php
    $page_list = get_posts( 'numberposts=-1&order=ASC&post_type=post' ); // ページ情報の取得
    foreach ( $page_list as $post){
    $parent_id = $post->post_parent;
    $parent_slug = get_post( $parent_id )->post_name;
    if ( is_page() && $post->post_parent ){
    echo 'echo '親あり '. urldecode( $parent_slug ) .'-' .urldecode( $post->post_name )."\n";
    }else{
    echo 'echo '親なし '. urldecode( $post->post_name ) ."\n";
    }
    ;}
    echo "\n";
    ?>

    childsview様、arborvitae666様、お忙しい中、お力を貸して頂き本当にありがとうございます。
    これからも勉強頑張ります!

    • この返信は1年、 11ヶ月前にmikujinが編集しました。
8件の返信を表示中 - 1 - 8件目 (全8件中)
  • トピック「条件分岐をしてページスラッグを取得する方法」には新たに返信することはできません。