我不想向 Facebook、Twitter 访客展示广告

I don't want to display ads to Facebook, Twitter Visitors

我现在在 facebook 上使用此代码。 “https”已激活且 wordpress 站点。

<?php

    $ref = $_SERVER['HTTP_REFERER'];
    if (strpos($ref, 'facebook.com') != false) {

?>

DON'T SHOW ADS

<?php } else { ?>

SHOW ADS

<?php }   ?>

此代码适用于 facebook。我想添加 twitter,但是当我添加 twitter 时它根本不起作用。我试过了。

if (strpos($ref, 'facebook.com', 'twitter.com', 't.co') != false) {

不是那样的。如果 else 查询或“false”是否正确?我怎样才能以最简单的方式做到这一点?如果访问者来自 Facebook、Twitter,我不想展示广告。谢谢

strpos()不检查多个“针”来寻找。您可以将它们存储在数组中 并逐个遍历每一个:

<?php
    
    $ref = $_SERVER['HTTP_REFERER'];

    $sitesWithAdsHidden = [
        'facebook.com',
        'twitter.com',
        't.co',
    ];
    
    $isHiddenSite = false;
    foreach ($sitesWithAdsHidden as $site) {
        if (strpos($ref, $site) !== false) {
            $isHiddenSite = true;
            break;
        }
    }

    if ($isHiddenSite) {

?>

DON'T SHOW ADS

<?php } else { ?>

SHOW ADS

<?php }   ?>

请注意,我还将 strpos 比较更改为 !==,因为如果位置实际上是 0(字符串).

首先,直接来自Wikipedia

"The referrer field is an optional part of the HTTP request sent by the web browser to the web server."

因此,您应该经常检查请求中是否存在Http Referer。您可以使用 !empty()isset() 来实现此目的,但是,为了将来的可维护性,您还可以使用 array_diffarray_keys.

然后您也可以实现这一点,而不必使用 preg_match.

遍历数组
if(!array_diff(['HTTP_REFERER'], array_keys($_SERVER)))
    if(preg_match('/facebook|twitter/', $_SERVER['HTTP_REFERER']))
        // todo: disable adverts

您也可以使用 null cascading operator 将其缩减为一行。如果您没有进一步检查 $_SERVER 全局变量,请执行此操作。

if(preg_match('/facebook|twitter/', $_SERVER['HTTP_REFERER'] ?? ''))
        // todo: disable adverts