【问题标题】:PHP with Screen Width condition具有屏幕宽度条件的 PHP
【发布时间】:2013-12-31 10:25:48
【问题描述】:

如果屏幕宽度小于 480 像素(移动设备,响应式),我会尝试限制我在 Wordpress 上的帖子。

但是我遇到了问题,因为我发现您不能使用 PHP 来检测屏幕宽度,这是我需要的,因为我正在使用 PHP 来调整帖子编号。我希望得到类似的东西:

<?php /* Start the Loop */ ?>
<?php if media-screen < 480px {
    query_posts('posts_per_page=5'); } ?>
<?php while (have_posts()) : the_post(); ?>

有什么建议吗?你能以某种方式将 css/javascript 布尔值传递给 php 脚本吗?

编辑:我不希望将访问者重定向到移动网站,因为这不符合我的要求。

【问题讨论】:

  • 您可以使用 AJAX 来实现。不使用 PHP 或 CSS。
  • 在 PHP 中进行宽度检测不是一个好主意。更好的方法是使用媒体查询 developer.mozilla.org/en-US/docs/Web/Guide/CSS/Media_queries 或 JS stackoverflow.com/questions/5484578/…
  • @putvande 当然可以用 CSS 来完成。根据 DOM 的结构,一些元素可以通过基于某些响应条件设置 display: none; 来简单地隐藏。
  • 服务器不关心(也不应该关心)最终用户/客户端的视口。还有其他更合适的技术和编程语言可以更好地使您的 UI 响应式(JavaScript、CSS、HTML5 等)使用这些技术和编程语言。
  • 问题是我不能使用 javascript/css 来切换帖子。

标签: php wordpress responsive-design


【解决方案1】:

我不喜欢这个解决方案,但您可以简单地添加一个元素,其中包含您希望在移动设备上显示的帖子数量,该元素默认隐藏,仅在满足媒体查询条件时显示。

想象一下包含您的移动帖子的以下 html

<div class="is-mobile">
    <div class="im-a-post">some content</div>
    <div class="im-a-post">some content</div>
    <div class="im-a-post">some content</div>
    <div class="im-a-post">some content</div>
    <div class="im-a-post">some content</div>
</div>
<div class="is-default>
    <div class="im-a-post">some content</div>
    <div class="im-a-post">some content</div>
    <div class="im-a-post">some content</div>
    <div class="im-a-post">some content</div>
    <div class="im-a-post">some content</div>
    <div class="im-a-post">some content</div>
    <div class="im-a-post">some content</div>
    <div class="im-a-post">some content</div>
    <div class="im-a-post">some content</div>
    <div class="im-a-post">some content</div>
</div>

通过一个简单的媒体查询,您可以切换包装元素的可见性:

.is-mobile {
    display: none;
}
@media (max-width: 480px) {
    .is-default {
        display: none;
    }
    .is-mobile {
        display: block;
    }
}

更复杂(恕我直言更好)的方法是通过 javascript/php 甚至 CSS3 :nth-child() 选择器注释您想要隐藏的元素(通过添加一个类)。想象一下下面的 javascript 循环

// assuming jQuery
$(".posts").each(function(idx, ele) {
    if (idx >= 5) {
        $(ele).addClass("hidden-mobile");
    }
});

使用这个 CSS

@media (max-width: 480px) {
    .hidden-mobile {
        display: none;
    }
}

这些将隐藏除视口匹配的设备上的前五个帖子之外的所有帖子。但是你必须正确考虑分页。

【讨论】:

  • 老实说认为会有更好的方法。我认为这就是为什么您只需重定向所有移动用户。现在必须这样做,谢谢-
  • 你现在不再重定向了,RWD ftw! ;-) 它基本上是解决方案中概述的方法,只是更复杂。一个可以例如创建一个虚拟分页来切换块中移动隐藏元素的可见性。或者,至少如果您以“移动优先”的术语思考,现在要好得多,您只会在 DOM 中拥有移动帖子,然后如果它不是移动设备,则异步加载其他帖子。
【解决方案2】:

我认为您可能会从使用 51Degrees PHP 解决方案中受益。它本质上是一个设备检测器,它使用用户代理字符串来将设备与数据库文件中的设备进行匹配。它以Wordpress plugin 的形式提供,并且可以通过管理面板进行配置。

您可以使用此插件设置规则,为具有所需屏幕尺寸的设备提供不同的主题。您可以使用许多不同的组合设置任意数量的规则。借助基本设备信息,您可以选择 50 多种设备属性:

通过这种方式,您可以提供一个不同的主题,该主题将在移动设备上显示更少的帖子,而无需进行任何编码(您可以提供一个完全不同的主题或复制您当前的主题,但将帖子数量更改为 5)。如果您不想将插件添加到您的 Wordpress,您可以通过从 sourceforge 下载检测器并将以下代码行添加到您的主题来添加相同的功能:

<?php
//Add device detector to project.
require_once 'path/to/core/51Degrees.php';
require_once 'path/to/core/51Degrees_usage.php';

//Use information about device.
if ($_51d['ScreenPixelsWidth'] == 400)
{
     query_posts('posts_per_page=5');
}
?>

希望这会有所帮助。

【讨论】:

    【解决方案3】:

    将此功能用于移动条件

    function 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
            || strpos($_SERVER['HTTP_USER_AGENT'], 'Opera Mobi') !== false ) {
                $is_mobile = true;
        } else {
            $is_mobile = false;
        }
        return $is_mobile;
    }
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-28
    • 2013-03-25
    • 2014-09-21
    • 2014-04-21
    • 2017-06-06
    • 2018-05-30
    • 1970-01-01
    • 2012-11-01
    相关资源
    最近更新 更多