wp_is_mobileからiPadを除外する


9

私は非常に迷惑な問題を経験しています。私はメディアクエリとis_mobile(is_mobileは小さな画面と同じだと思います。なんてばかげていると思います)を使って自分のWebサイトを構築しましたが、いくつかのテストを行った後、iPadのようにねじ込んでしまったようです(実際、私はそうしました)。

iPadをwp_is_mobile関数から除外できれば、すべての問題を簡単に解決できます。その関数を書き換えるにはどうすればよいですか?

function wp_is_mobile() {
    static $is_mobile;

    if ( isset($is_mobile) )
        return $is_mobile;

    if ( empty($_SERVER['HTTP_USER_AGENT']) ) {
        $is_mobile = false;
    } elseif ( strpos($_SERVER['HTTP_USER_AGENT'], 'Mobile') !== false // many mobile devices (all iPhone, iPad, etc.)
        || strpos($_SERVER['HTTP_USER_AGENT'], 'Android') !== false
        || strpos($_SERVER['HTTP_USER_AGENT'], 'Silk/') !== false
        || strpos($_SERVER['HTTP_USER_AGENT'], 'Kindle') !== false
        || strpos($_SERVER['HTTP_USER_AGENT'], 'BlackBerry') !== false
        || strpos($_SERVER['HTTP_USER_AGENT'], 'Opera Mini') !== false ) {
            $is_mobile = true;
    } else {
        $is_mobile = false;
    }

    return $is_mobile;
}

これをどのように変更しますか?

回答:


13

tfの答えは私に考えさせました。実際、コア関数を使用して好きなように調整できますが、すべてを新しい関数に入れます。だからここに行く:

function my_wp_is_mobile() {
    static $is_mobile;

    if ( isset($is_mobile) )
        return $is_mobile;

    if ( empty($_SERVER['HTTP_USER_AGENT']) ) {
        $is_mobile = false;
    } elseif (
        strpos($_SERVER['HTTP_USER_AGENT'], 'Android') !== false
        || strpos($_SERVER['HTTP_USER_AGENT'], 'Silk/') !== false
        || strpos($_SERVER['HTTP_USER_AGENT'], 'Kindle') !== false
        || strpos($_SERVER['HTTP_USER_AGENT'], 'BlackBerry') !== false
        || strpos($_SERVER['HTTP_USER_AGENT'], 'Opera Mini') !== false ) {
            $is_mobile = true;
    } elseif (strpos($_SERVER['HTTP_USER_AGENT'], 'Mobile') !== false && strpos($_SERVER['HTTP_USER_AGENT'], 'iPad') == false) {
            $is_mobile = true;
    } elseif (strpos($_SERVER['HTTP_USER_AGENT'], 'iPad') !== false) {
        $is_mobile = false;
    } else {
        $is_mobile = false;
    }

    return $is_mobile;
}

独自の解決策を見つけることは常に良いことなので、+ 1してください。ただし、回答も更新しました。私はそこに愚かなタイプミスがありました:私===!==代わりにチェックすべきだったのをチェックしました-それがどのように起こったかはわかりませんが、今は修正しました。だから、上記の答えもうまくいくはずです-私はあなたにそれを受け入れさせることは絶対に言っていません!それは、本質的に、私たちの答え/機能が同じことをしているだけです-それで私はただ何が悪いのかを見つけて修正したかっただけです。
tfrommen 2013

@tfそれが私のコメントについての話です!しかし、私はこれが機能することを知っており、あなたのコードをテストしていないので、私は自分の答えを受け入れます。私がテストしていなければ、誰もこれを読んであなたの答えを使ってほしくない。私はこのスレッドに何らかの責任があると感じています。御理解いただけることを願います。努力をありがとう!
Bram Vanroy、2013

あなたたちは実際にそれをiPadでライブでテストすることに成功しましたか?私は今、成功せずにローカルでipad airを試しています。
ケビン2014年

@kevinはiPAD 3でこれをテストしました。
Bram Vanroy、2014年

4

また、定期的に更新されるMobile Detect PHPクラスを使用して、タブレット(したがってiPad)を除くモバイルを検出するためのカスタム関数を作成することもできます。この回答を書いている時点で、Githubリポジトリは最近更新されており、3か月前の新しいSamsungタブレットの検出が含まれています。

必要なファイルを/includes/テーマで呼び出されたディレクトリに配置すると想定すると、このコードをfunctions.phpに追加できます。

require_once(get_template_directory() . '/includes/Mobile_Detect.php');

function md_is_mobile() {

  $detect = new Mobile_Detect;

  if( $detect->isMobile() && !$detect->isTablet() ){
    return true;
  } else {
    return false;
  }

}

次に、関数md_is_mobile()をの代わりとして使用しますwp_is_mobile()


このソリューションは、Mobile Detectクラスを含むプラグインのインストールに依存していませんか?
Brad Dalton、

Mobile Detectクラスの依存関係は、上記のコードブロックの最初の行で処理されます。追加のプラグインは必要ありません。このクラスに基づくWordPressプラグイン(WP Mobile Detectなど)は存在しますが、これはほぼ2年間更新されていないため、私は個人的に、活発に開発されているように見えるPHPクラスを直接使用することを好みます。
天文学者2015

その公正な答えは、私がプラグインと呼んでいるMobile_Detect.phpファイルをインストールする必要があります。
Brad Dalton、

それで十分です!
アストロティム

2

私はこれが古いことを知っていますが、以前のソリューションを実装する適切なWordPressの方法で更新したかったのです。バージョン4.9.0以降、別の関数を実装するのではなく、wp_is_mobile()の結果をフィルタリングする必要があります。したがって:

function myprefix_exclude_ipad( $is_mobile ) {
    if (strpos($_SERVER['HTTP_USER_AGENT'], 'iPad') !== false) {
        $is_mobile = false;
    }
    return $is_mobile ;
}
add_filter( 'wp_is_mobile', 'myprefix_exclude_ipad' );

しかし、本当にすべきだったのは、弾丸をかじり、タブレットで適切に機能するようにテーマを書き直すことでした。アップルよりタブレットメーカーが多い/多い。


1

私はあなたの関数を少し書き直しました(そして私の意見では最適化されています):

function wp_is_mobile() {
    static $is_mobile;

    if (isset($is_mobile))
        return $is_mobile;

    if (
        ! empty($_SERVER['HTTP_USER_AGENT'])

        // bail out, if iPad
        && false === strpos($_SERVER['HTTP_USER_AGENT'], 'iPad')

        // all the other mobile stuff
        && (
            false !== strpos($_SERVER['HTTP_USER_AGENT'], 'Mobile')
            || false !== strpos($_SERVER['HTTP_USER_AGENT'], 'Android')
            || false !== strpos($_SERVER['HTTP_USER_AGENT'], 'Silk/')
            || false !== strpos($_SERVER['HTTP_USER_AGENT'], 'Kindle')
            || false !== strpos($_SERVER['HTTP_USER_AGENT'], 'BlackBerry')
            || false !== strpos($_SERVER['HTTP_USER_AGENT'], 'Opera Mini')
        )
    ) $is_mobile = true;
    else $is_mobile = false;

    return $is_mobile;
}

//編集:

はい、もう一度...

内部でコア関数を使用する新しい関数を記述して拡張します。

function my_wp_is_mobile() {
    if (
        ! empty($_SERVER['HTTP_USER_AGENT'])

        // bail out, if iPad
        && false !== strpos($_SERVER['HTTP_USER_AGENT'], 'iPad')
    ) return false;
    return wp_is_mobile();
} // function my_wp_is_mobile

これで、新しいmy_wp_is_mobile関数をどこでも使用できます。


だから、私はこれをfunctions.phpファイル内に置くだけで、コア関数を自動的に上書きしますか?
Bram Vanroy、2013

おっと、申し訳ありませんが、私の悪い-私はこれを使用したことがありません(したがって、それがWPコアであることを知りませんでした)。関数はプラグイン可能ではないため、ファイルに単に入れることはできませんfunctions.php。私は
すぐに

これは機能していないようです。しかし、iPadのユーザーエージェントはtrueを返すべきではありませんか?
Bram Vanroy 2013

えっ?iPadをモバイルデバイスとして扱わないように除外したいように私は理解しましたwp_is_mobile... それで、(あなたがやりたいように)何がうまくいかないのですか?
tfrommen 2013

残念ながら私自身はiPadを持っていないので、友達から得た情報に頼らなければなりません。しかし現在、ユーザーエージェント "!is_mobile"(モバイルではない)の場合にサイドバーをロードするデザインがありますが、iPadの場合は解像度が十分に大きいため、これは必要ありません。if(!my_wp_is_mobile() )サイドバーを使用しても、まだ表示されないことを友達から教えられました。機能が機能しないことを控除します。
Bram Vanroy、2013
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.