IPad von wp_is_mobile ausschließen

9

Ich habe ein sehr nerviges Problem. Ich habe meine Website mit Medienabfragen und is_mobile erstellt (ich denke, is_mobile wäre dasselbe wie kleinere Bildschirme. Wie dumm von mir.), Aber nach einigen Tests hat das iPad es anscheinend irgendwie vermasselt (okay, eigentlich habe ich es getan).

Alle meine Probleme könnten leicht gelöst werden, wenn ich ein iPad von der Funktion wp_is_mobile ausschließen könnte. Wie schreibe ich diese Funktion um?

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;
}

Wie würde ich das ändern?

Bram Vanroy
quelle

Antworten:

13

Die Antwort von tf brachte mich zum Nachdenken. Eigentlich kann ich die Kernfunktion verwenden und nach Belieben anpassen, aber einfach alles in eine neue Funktion einfügen. Also los geht's:

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;
}
Bram Vanroy
quelle
Es ist immer gut, eigene Lösungen zu finden , also +1 dafür. Ich habe jedoch auch meine Antwort aktualisiert. Ich hatte dort einen dummen Tippfehler : Ich habe nachgesehen, ===während ich !==stattdessen hätte nachsehen sollen - keine Ahnung, wie das passiert ist, aber jetzt habe ich das behoben. Die obige Antwort sollte also auch funktionieren - was ich absolut nicht sage, damit Sie sie akzeptieren! Es ist nur so, dass unsere Antworten / Funktionen im Wesentlichen dasselbe tun - also wollte ich nur herausfinden (und beheben), was falsch war.
Anfang
@tf Darum ging es in meinem Kommentar! Aber ich werde meine eigene Antwort akzeptieren, weil ich weiß, dass diese funktioniert und ich Ihren Code nicht getestet habe. Ich möchte nicht, dass jemand dies liest und Ihre Antwort verwendet, wenn ich es nicht getestet habe. Ich fühle mich irgendwie für diesen Thread verantwortlich. Ich hoffe, Sie verstehen. Vielen Dank für die Mühe!
Bram Vanroy
Habt ihr es tatsächlich geschafft, es live auf einem iPad zu testen? Ich versuche es gerade ohne Erfolg, iPad Air, vor Ort.
Kevin
@kevin hat dies auf einem iPAD 3 getestet, was funktioniert hat.
Bram Vanroy
4

Sie können auch die regelmäßig aktualisierte PHP-Klasse von Mobile Detect verwenden , um eine benutzerdefinierte Funktion zum Erkennen von Mobiltelefonen ohne Tablets (also iPads) zu erstellen. Zum Zeitpunkt des Schreibens dieser Antwort war das Github-Repo zuletzt aktualisiert worden, um die Erkennung neuer Samsung-Tablets vor 3 Monaten einzuschließen.

Angenommen, Sie platzieren die erforderliche Datei in einem Verzeichnis, das /includes/in Ihrem Thema aufgerufen wird , und können diesen Code zu Ihrer functions.php hinzufügen

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;
  }

}

Verwenden Sie dann die Funktion md_is_mobile()als Ersatz für wp_is_mobile().

Astrotim
quelle
Ist diese Lösung nicht von der Installation eines Plugins abhängig, das die Mobile Detect-Klasse enthält?
Brad Dalton
Die Klassenabhängigkeit von Mobile Detect wird in der ersten Zeile des obigen Codeblocks behandelt. Es ist kein zusätzliches Plugin erforderlich. Ich sollte beachten, dass es WordPress-Plugins gibt, die auf dieser Klasse basieren, wie z. B. WP Mobile Detect , aber diese wurden seit fast 2 Jahren nicht mehr aktualisiert. Ich persönlich bevorzuge es, die PHP-Klasse direkt zu verwenden, die offenbar aktiv entwickelt wurde.
Astrotim
Es ist eine faire Antwort, aber Sie müssen die Datei Mobile_Detect.php installieren, die ich als Plugin bezeichne.
Brad Dalton
Das ist gerecht genug!
Astrotim
2

Ich weiß, dass dies alt ist, aber ich wollte es mit der richtigen WordPress-Methode zur Implementierung der vorherigen Lösungen aktualisieren. Ab Version 4.9.0 sollten sie das Ergebnis von wp_is_mobile () filtern, anstatt eine andere Funktion zu implementieren. Somit:

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' );

Was jedoch wirklich hätte getan werden sollen, war, in die Kugel zu beißen und das Thema neu zu schreiben, damit es auf Tablets richtig funktioniert. Es gab / gibt mehr Tablet-Hersteller als Apple.

Brian Layman
quelle
1

Ich habe Ihre Funktion ein wenig umgeschrieben (und meiner Meinung nach optimiert):

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;
}

// BEARBEITEN:

Okay, noch einmal ...

Schreiben Sie eine neue Funktion, die intern die Kernfunktion verwendet, und erweitern Sie sie:

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

Jetzt können Sie Ihre neue my_wp_is_mobileFunktion überall verwenden.

tfrommen
quelle
Also kann ich dies einfach in meine Datei functions.php einfügen und es wird automatisch die Kernfunktion überschrieben?
Bram Vanroy
Hoppla, sorry, mein schlechtes - ich habe das nie benutzt (und wusste daher nicht, dass es der WP-Kern ist). Da die Funktion nicht steckbar ist, können Sie sie nicht einfach in Ihre functions.phpDatei einfügen. Ich werde meine Antwort in einer Minute aktualisieren ...
Uhr
Das scheint nicht zu funktionieren. Aber sollte der Benutzeragent für das iPad nicht true zurückgeben?
Bram Vanroy
Hm? Ich habe es so verstanden, als wollten Sie iPads davon ausschließen, als mobile Geräte behandelt zu werden - wie sie es von wp_is_mobile...? Also, was funktioniert nicht (wie Sie es gerne tun würden)?
Beginn
Leider habe ich selbst kein iPad, daher muss ich mich auf Informationen verlassen, die ich von Freunden bekomme. Derzeit habe ich jedoch ein Design, das eine Seitenleiste lädt, wenn ein Benutzeragent "! Is_mobile" (nicht mobil) ist. Dies ist jedoch für das iPad nicht erforderlich, da seine Auflösung groß genug ist. Meine Freunde sagen mir, dass if(!my_wp_is_mobile() )die Seitenleiste , obwohl ich sie verwendet habe, immer noch nicht angezeigt wird. Daraus ziehe ich ab, dass die Funktion nicht funktioniert.
Bram Vanroy