サポート » 使い方全般 » Ktai Styleでキャリア別に記事を公開、非公開にさせたい

  • 解決済 aikuru

    (@ma-honda)


    お世話になっております。
    Ktai Styleでモバイルサイトを作成しているのですが
    カスタムフィールドでキャリアフラグのフィールドを作成し
    そのフラグを読み取って、キャリアによって
    各記事を公開、非公開にさせたいです。

    【追加したカスタムフィールド名】
    docomo , au , softobank
    【入力するフラグ】
    1 or 0
    …1のフラグが入っている時、記事を公開に、0は非公開になっていてほしいです。

    例えば、Aという記事があったとして、各フィールドに

    docomo:0
    au:1
    softbank:1

    と値が入っていた場合
    ドコモでAの記事にアクセスした場合、その記事は非公開で表示されず
    その他キャリアでアクセスした場合は公開されている
    という感じです。
    検索やTOPページなどでの記事一覧表示でも
    同様になっていることが望ましいです。

    検索したのですが、なかなか出てこず…
    すみませんが、どうぞ宜しくお願い致します。

7件の返信を表示中 - 1 - 7件目 (全7件中)
  • モデレーター Daisuke Takahashi

    (@extendwings)

    キャリア各社が使用するIPアドレスの帯域を公表しているので、それを使えば判定できるかと思います。
    Wi-Fiなどを介して接続された場合は判定できませんが。

    トピック投稿者 aikuru

    (@ma-honda)

    >Daisuke Takahashiさん
    コメントありがとうございます。
    すみません、書き忘れましたがKtai Style で使える
    is_ktai() を使用して実装できないかと考えています。
    IPアドレスの帯域を使うよりは簡単かなと思ったのですが、いかがでしょうか…

    is_ktaiでいいと思います。(プラグインが古くなっているのは気になりますが……)

    とりあえずヒントだけ:
    pre_get_posts meta_query

    トピック投稿者 aikuru

    (@ma-honda)

    >Hinaloeさん
    コメントありがとうございます。
    ヒントありがとうございます!少し見えてきました。
    ↓だと記事のページはフラグを読み取って各キャリアで公開、非公開になりました。
    長いのでもうちょっとまとまる気もしますが…
    また、ちゃんとした記述になっているのかちょっと不安です。

    function single_carrier_flag($query) {
        switch (is_ktai()) {
            case 'DoCoMo' :
            if ( is_admin() || ! $query->is_main_query() )
               return;
    
            if ( $query->is_single() ) {
               $query->set( 'posts_per_page', -1 );
               $query->set( 'orderby', 'meta_value' );
               $query->set( 'meta_key', 'docomo' );
               $query->set( 'order', 'ASC' );
               $query->set('meta_query',
                                        array(
                                            array(
                                            'key' => 'docomo',
                                            'value' => 1,
                                            'compare' => '=',
                                            'type' => 'NUMERIC'
                   )
                 )
              );
            }
            break;
    
            case 'KDDI' :
            if ( is_admin() || ! $query->is_main_query() )
               return;
    
            if ( $query->is_single() ) {
               $query->set( 'posts_per_page', -1 );
               $query->set( 'orderby', 'meta_value' );
               $query->set( 'meta_key', 'au' );
               $query->set( 'order', 'ASC' );
               $query->set('meta_query',
                                        array(
                                            array(
                                            'key' => 'au',
                                            'value' => 1,
                                            'compare' => '=',
                                            'type' => 'NUMERIC'
                   )
                 )
              );
            }
            break;
    
            case 'Softbank' :
            if ( is_admin() || ! $query->is_main_query() )
               return;
    
            if ( $query->is_single() ) {
               $query->set( 'posts_per_page', -1 );
               $query->set( 'orderby', 'meta_value' );
               $query->set( 'meta_key', 'softbank' );
               $query->set( 'order', 'ASC' );
               $query->set('meta_query',
                                        array(
                                            array(
                                            'key' => 'softbank',
                                            'value' => 1,
                                            'compare' => '=',
                                            'type' => 'NUMERIC'
                   )
                 )
              );
            }
            break;
    
       }
    }
    add_action( 'pre_get_posts', 'single_carrier_flag' );

    ただ、同様にTOPページの記事一覧にも適応させようとしたのですが
    どうすればいいのかわかりません。
    if ( $query->is_single() )
    この部分のis_single をis_homeやis_front_pageに変えてみたりしたのですが
    そういう問題ではないのでしょうか?

    この記述は冗長かつ不充分な気はしますがひとまず置いておいて……

    ! $query->is_main_query()があるのでメインクエリ以外ではこのフィルタは効いてないですね。(その記事一覧がどういう実装なのか知りませんが。)
    またis_single使ってるので(アーカイブ等の)記事一覧は非表示出来てませんよね。 

    (ところで https://ja.forums.wordpress.org/topic/148383?replies=3 は重複トピックですか?)

    トピック投稿者 aikuru

    (@ma-honda)

    >Hinaloeさん
    そちらのトピックは
    カスタムフィールドに入れた”日付”を読み取って
    表示、非表示を適応させたいという内容です。
    まとめて投稿してもよかったかと思うのですが別で立ててしまいました。
    最終的にはキャリアフラグを読み取り
    かつ、日付も読み取って記事を表示、非表示に出来ればと考えています。

    また、アドバイスありがとうございます。
    もう少し直してみます。

    トピック投稿者 aikuru

    (@ma-honda)

    なんとか解決できたので一応記しておきます!
    間違ってそうなところや
    もうちょっと短く出来そうな箇所がある気もしますが。。。
    ちなみにauはkddiにしてあります。
    皆様アドバイスありがとうございました。

    function single_carrier_flag($query) {
        if ( ! $query->is_page() ) {
    
            switch (is_ktai()) {
                case 'DoCoMo' :
    
                    $currnet_date = date(Ymd);
    
                    $query->set( 'posts_per_page', -1 );
                    $query->set( 'orderby', 'date' );
                    $query->set( 'meta_key', 'docomo' );
                    $query->set( 'order', 'DESC' );
                    $query->set('meta_query',
                                            array(
                                                array(
                                                    'key' => 'docomo',
                                                    'value' => 1,
                                                    'compare' => '=',
                                                    'type' => 'CHAR'
                                            )
                                );
    
                break;
    
                case 'KDDI' :
                    $query->set( 'posts_per_page', -1 );
                    $query->set( 'orderby', 'date' );
                    $query->set( 'meta_key', 'kddi' );
                    $query->set( 'order', 'DESC' );
                    $query->set('meta_query',
                                            array(
                                                array(
                                                    'key' => 'kddi',
                                                    'value' => 1,
                                                    'compare' => '=',
                                                    'type' => 'CHAR'
                                                )
                                            )
                      );
    
                break;
    
                case 'SoftBank' :
                    $query->set( 'posts_per_page', -1 );
                    $query->set( 'orderby', 'date' );
                    $query->set( 'meta_key', 'softbank' );
                    $query->set( 'order', 'DESC' );
                    $query->set('meta_query',
                                            array(
                                                array(
                                                    'key' => 'softbank',
                                                    'value' => 1,
                                                    'compare' => '=',
                                                    'type' => 'CHAR'
                                                )
                                            )
                      );
    
                break;
            }
        }
    }
    add_action( 'pre_get_posts', 'single_carrier_flag' );
7件の返信を表示中 - 1 - 7件目 (全7件中)
  • トピック「Ktai Styleでキャリア別に記事を公開、非公開にさせたい」には新たに返信することはできません。