質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.94%

Wordpress ACF カスタム投稿タイプの親子関係の設定

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 418

score 0

前提・実現したいこと

PHPの知識がなく、説明がうまくできてなかったらすみません。

ACFproを利用して、カスタム投稿タイプで作成した組合一覧(archive-union.php)から、詳細ページ(single-member.php)へリンクしたいです。
通常はarchive-〇〇.php、single-〇〇.phpの〇〇は同じ名前が入るかと思いますが、
一覧と詳細でそれぞれ異なるカスタム投稿タイプの情報を取得したいため、
カスタム投稿タイプはunion(組合)とmember(会員)の2種類あり、unionが親でmemberが子になる関係です。
一覧にはunionの内容となり、詳細にはmemberの内容ということで、memberとunionが混ざってしまうのですが、これを統一して組合の持つ会員へのリンクは可能なのでしょうか。
現状は、リンクを取得できていません。

archive-union.phpとsingle-union.phpも用意しており、組合名を読み込む関係上、

■カスタムフィールドの登録内容
カスタムフィールドのフィールドグループ
組合(archive-union.php)
├フィールド名:union_info
├フィールドタイプ:Group
├サブフィールド
│ └ 組合名:union_name(テキスト)
│ └ 組合住所:union_address(テキスト)
│ └ 組合TEL:union_tel(テキスト)
│ └ 組合HP:union_hp(テキスト)
│ └ 会員情報:member_info_list(繰り返しフィールド)
│  └会員名:member_name(テキスト)
│  └会員住所:member_address(テキスト)
│  └会員TEL:member_address(テキスト)

会員(single-member.php)
上記繰り返しフィールドの3件の情報を含む、
担当者名やその他多くの項目

該当のソースコード

カスタム投稿タイプの定義 functions.php

//組合(カテゴリ)
function register_union_custom_post() {
    register_post_type(
        'union', array(
            'label' => '組合',
            'description' => '',
            'public' => true,
            'show_ui' => true,
            'show_in_menu' => true,
            'menu_position' => 5,
            'capability_type' => 'post',
            'hierarchical' => true,
            'rewrite' => true,
            'query_var' => true,
            'has_archive' => true,
            'exclude_from_search' => true,
            'supports' => array('title','comments','author'),
            'taxonomies' => array('union_cat'),
            'labels' => array(
                'name' => '組合',
                'singular_name' => '組合',
                'menu_name' => '組合',
                'add_new' => '新規追加',
                'add_new_item' => '組合の新規追加',
                'edit' => '編集',
                'edit_item' => '組合の編集',
                'new_item' => '新しい組合',
                'view' => '表示',
                'view_item' => '組合の組合',
                'search_items' => '組合の検索',
                'not_found' => '見つかりません',
                'not_found_in_trash' => 'ゴミ箱にはありません。',
                'parent' => '親',
            )
        )
    );
    register_taxonomy(
        'union_cat',
        'union',
        array(
            'hierarchical' => true,
            'label' => '組合のカテゴリ',
            'supports'  => array('title', 'editor', 'thumbnail','page-attributes'),
            'show_ui' => true,
            'query_var' => true,
            'rewrite' => true,
            'singular_label' => '組合のカテゴリ'
        )
    );
}
add_action('init', 'register_union_custom_post');
//会員(カテゴリ)
function register_member_custom_post() {
    register_post_type(
        'member', array(
            'label' => '会員',
            'description' => '',
            'public' => true,
            'show_ui' => true,
            'show_in_menu' => true,
            'menu_position' => 4,
            'capability_type' => 'post',
            'hierarchical' => true,
            'rewrite' => true,
            'query_var' => true,
            'has_archive' => true,
            'exclude_from_search' => true,
            'supports' => array('title','comments','author'),
            'taxonomies' => array('member_cat'),
            'labels' => array(
                'name' => '会員',
                'singular_name' => '会員',
                'menu_name' => '会員',
                "all_items" => "すべての会員",
                'add_new' => '新規追加',
                'add_new_item' => '会員の新規追加',
                'edit' => '編集',
                'edit_item' => '会員の編集',
                'new_item' => '新しい会員',
                'view' => '表示',
                'view_item' => '会員の会員',
                'search_items' => '会員の検索',
                'not_found' => '見つかりません',
                'not_found_in_trash' => 'ゴミ箱にはありません。',
                'parent' => '親(会員)',
            )
        )
    );
    register_taxonomy(
        'member_cat',
        'member',
        array(
            'hierarchical' => true,
            'label' => '会員のカテゴリ',
            'supports'  => array('title', 'editor', 'thumbnail','page-attributes'),
            'show_ui' => true,
            'query_var' => true,
            'rewrite' => true,
            'singular_label' => '会員のカテゴリ'
        )
    );


}
add_action('init', 'register_member_custom_post');

archive-union.php

<?php
$post_type = 'union';
$taxonomy_name = 'union_cat';

$args = array(
  'orderby' => 'name',
  'hierarchical' => false
);

$taxonomys = get_terms( $taxonomy_name, $args);

if(!is_wp_error($taxonomys) && count($taxonomys)):
        foreach($taxonomys as $taxonomy):
        $url = get_term_link($taxonomy->slug, $taxonomy_name);
        $tax_posts = get_posts( array(
            'post_type' => $post_type,
            'posts_per_page' => 5,
            'tax_query' => array(
                array(
                    'taxonomy' => $taxonomy_name,
                    'terms' => array( $taxonomy->slug ),
                    'field' => 'slug',
                    'include_children' => true,
                    'operator' => 'IN'
                    )
                )
            ));
            if( $tax_posts ) {

?>
<h3 id="<?php echo $taxonomy->slug ?>"><?php echo $taxonomy->name; ?></h3>

<?php foreach($tax_posts as $tax_post): ?>
<?php 
  $group = get_field('union_info',$tax_post->ID); 
  if($group){
?>
        <div class="unBox">
                <h4 class="bluBdrBg_ttl"><?php echo $group['union_name']; ?></h4>
                <div class="flex">
                    <p><?php echo $group['union_address']; ?><br />
                    <?php echo $group['union_tel']; ?></p>
                    <p><a href="<?php echo $group['union_hp']; ?>" target="_blank" rel="noopener noreferrer">HP</a></p>
                </div>
                    <?php 
      $repeater = $group['member_info_list'];

      $r = '0';
      $r_count = count($repeater); 

      while($r_count > $r){

        $repeater_content = $repeater[$r];
           if(get_field('member_info_list')):
    ?>
        <dl>
            <dt><a href="<?php echo get_permalink($tax_post->ID); ?>"><?php echo $repeater_content['member_name']; ?></a></dt>
            <dd><?php echo $repeater_content['member_address']; ?></dd>
            <dd><a href="tel:<?php echo $repeater_content['member_tel']; ?>"><?php echo $repeater_content['member_tel']; ?></a></dd>
        </dl>
    <?php else:  ?>
    <p>現在、会員は登録されていません</p>
    <?php endif;  ?>

    <?php $r++;
    } ?>
    </div>

<?php } ?>

<?php endforeach; wp_reset_postdata(); ?>

<?php if ($r == 0): ?>
    <p>現在、会員は登録されていません</p>
<?php endif; ?>

<?php } endforeach; endif; ?>


single-member.php

<?php the_title(); ?>
<?php the_field('XXXX') ?>
・
・
・


※XXXXには担当者名などarchive-union.phpに含まれない情報が入ります。

試したこと

これで会員のカスタム投稿画面にunionという枠が追加されましたが、パーマリンクがunion/member/となるわけでもなく、ページが表示されることもありませんでした。
//親子関係

add_action('admin_menu', function() {
    remove_meta_box('pageparentdiv', 'member', 'normal');
});
add_action('add_meta_boxes', function() {
    add_meta_box('member-parent', 'union', 'member_attributes_meta_box', 'member', 'side', 'default');
});

function member_attributes_meta_box($post) {
    $post_type_object = get_post_type_object($post->post_type);
    if ( $post_type_object->hierarchical ) {
        $pages = wp_dropdown_pages(array('post_type' => 'union', 'selected' => $post->post_parent, 'name' => 'parent_id', 'show_option_none' => __('(no parent)'), 'sort_column'=> 'menu_order, post_title', 'echo' => 0));
        if ( ! empty($pages) ) {
            echo $pages;
        } 
    } 
}

親子関係を持たせたいのでpage-〇〇.phpでも試してみましたが、タクソノミーを使って親子関係ができるならarchiveとsingleで作成したいです。
よろしくお願いいたします。
```

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

0

質問の内容に自信がないのですが投稿タイプunionとmemberがあるとして
unionとmemberに親子関係を持たせたような形にしたいのでしょうか?
(unionにmemberの投稿ID群を持たせるだけならACFの投稿オブジェクト、ページリンク、関連あたりを使うことになると思います)

example.com/union が組合一覧
example.com/union/{UnionName} が組合詳細
example.com/member/{memberName}が会員詳細になります。

書き方からすると
組合名UnionNameに対して会員のmemberNameの情報を取得したい場合
example.com/union/{UnionName}/{memberName}
のアドレスで取得したいということでしょうか?
その場合二つのアプローチを考えました。

一つはパーマリンク構造を変更して
example.com/union/{UnionName}/{memberName}にアクセスした際に
example.com/member/{memberName} にアクセスしたことにするパターンです。
Custom Permalinks等のプラグインで対応できるかもしれません。

もう一つはsingle-union.phpにmemberデータがある場合代わりに読み込む処理を追加することです。
URLが多少希望と変わりますが
example.com/union/{UnionName}/?member={memberName}
として$_GETでmemberが取得できた場合はそのデータ(もしくはsingle-member毎)読み込む形になります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/08/20 11:20

    gogoweb_ikedaさんありがとうございます。返信が遅くなりすみません。
    繰り返しフィールドのところで、if(get_field('member_info_list',memberのID)):となるのでしょうか?
    繰り返しフィールドによって追加されるmember_info_listの詳細に当たる会員(single-member.php)のページでそれぞれのリンクに紐づけた詳細を取得する必要があるのですが、memberのIDというのはif(get_field('member_info_list',$post_id)):ではなかったので、調べておりましたが解決できませんでした。

    キャンセル

  • 2020/08/20 11:41

    関連のフィールドが$group['member_info_Relation']だとした場合
    foreach($group['member_info_Relation'] as member_info)を実行した場合
    member_info["ID"]に会員の投稿IDが入っているはずなので
    get_field("member_name",$member_info["ID"])で会員のmember_name取得できます。

    キャンセル

  • 2020/08/20 12:48

    ありがとうございます。
    foreachの入れ子になってるせいなのか、エラーが出てしまいました。
    $repeaterの書き方を外して入れるのでしょうか?

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.94%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る