以特定分辨率运行快捷代码

时间:2013-08-03 作者:Don\'t Wake Me Up

我在这里迂回地问了一个问题:Loading shortcode with ajax 但我想,如果不把我困惑、天真的解决问题加入其中,或许有必要问一个基本问题,即我正在尝试做什么。

我要运行此:

<?php echo do_shortcode(\'[metaslider id="8302"]\'); ?>
但仅当窗口大小大于(例如)800px时。

任何想法都将不胜感激!

3 个回复
SO网友:gmazzap

好的,让我们澄清一下概念。您不想为移动设备下载内容,而想依赖屏幕分辨率。您知道php(wordpress)在服务器上运行,屏幕分辨率完全是客户端的事情。

因此,流程为:

用户向您的站点发送请求,在客户端加载您的站点页面,一些js在客户端上运行,识别解决方案,并在某些情况下运行ajax向服务器发送请求并加载短代码,这里出了什么问题?简单:屏幕分辨率不足以了解客户端设备。E、 g.此时此刻,我正在从一台显示器为26英寸的台式电脑上写作,但浏览器窗口的大小不是全尺寸,可能低于800像素。对我来说,下面的流程不会加载短代码。这是你想要的吗?我不这么认为。

也许你可以依靠window.resize js事件,所以当我将窗口大小更改为800 px以上时,请加载短代码,否则请删除短代码。在这种情况下,当客户端调整窗口大小的方式超过了突破分辨率时,会向服务器发送ajax请求:

jQuery().ready( function($) {

function load_shortcode() {
   if ( $(window).innerWidth() > 800 ) {
      if ( $(\'#slider .slider-content\').length && ! $(\'#slider\').is(\':visible\') ) {
        // slider was loaded but is hidden, show it
        $(\'#slider\').show();
      } else {
        // slider never loaded, load it
        $.ajax({
          url: myscriptvars.ajaxurl,
          data: { action: \'load_slider_shortcode\' }
        }).done(function(output){
          if (output) $(\'#slider\').html(output);
        });
      }
    } else {
       // slider is there but window was resized in less than 800px: hide it
       if ( $(\'#slider .slider-content\').length) $(\'#slider\').hide();
    }
}

$(window).resize(function() {
   load_shortcode();
});

load_shortcode();

});
这就是你想要的吗?也许吧,但还有另一个解决方案(我认为是更好的解决方案)。

Wordpress作为函数wp_is_mobile 它可以识别移动设备,但即使设备是一个10英寸高分辨率屏幕的平板电脑,它也会返回true。这并不理想,但有一个脚本可以帮助您。它是Mobile Detect.

使用方法:下载并放入文件夹。对于semplicity,我假设它在你的主题根中。在您的页面中,必须显示快捷码,请输入以下内容:

@include_once( trailingslashit(TEMPLATEPATH) . \'Mobile_Detect.php\' );
$detect = new Mobile_Detect;
$ismobile = ( $detect->isMobile() && ! $detect->isTablet() ); // true only for phones
if ( $mobile ) echo do_shortcode(\'[metaslider id="8302"]\');
仅此而已。不需要ajax,不需要依赖窗口。调整大小和phone never download your shortcode, PC and tablets download it always.

如果要避免平板电脑下载滑块,请删除其中的第二个条件if 陈述

为了改进解决方案,您还可以通过css媒体查询在低分辨率上隐藏滑块,这样具有已调整大小窗口的台式机和平板电脑(如现在的我的)就不会查看滑块。

当然,这并不完美,但目前我认为这件事还没有完美的解决方案,在我看来,最后一个方案是最好的。

SO网友:kingkool68

前端需要一些JavaScript来测量用户的屏幕大小。然后,您可以设置一个cookie,该cookie随每个请求发送该信息。

伪代码:在页面加载时,获取窗口大小并将该值存储在cookie中。

您可以在PHP代码中使用这些信息来决定是否运行某些代码。

if( $_COOKIE[\'screen-size\'] > 800 ) {
  //Whatever!
}
CSS技巧是一篇很好的文章,介绍了如何使这种技术发挥作用->http://css-tricks.com/make-client-side-data-available-server-side/

如果使用WP Super Cache或W3 Total Cache之类的缓存,这将不起作用,因为这些插件会缓存模板的输出,因此服务器对每个请求的处理都会减少。如果请求中的某些动态条件发生变化,则需要通过PHP运行的逻辑将不会执行。

SO网友:KnightHawk

Alternate Method

作者Metaslider 建议使用WP Mobile Detect. 这里是一个代码示例,我使用它来实现与我认为您正在寻找的类似的结果。需要WP Mobile Detect插件。

<?php if(shortcode_exists(\'metaslider\') && function_exists(wpmd_is_notphone) && wpmd_is_notphone()):
            echo(do_shortcode(\'[metaslider id=8302]\'));
endif; ?>
我仍然使用@media 根据屏幕宽度查询隐藏滑块,我知道这不是100%兼容的。但是,一个好的回退方法可能是在滑块未加载的情况下包含单个图像。这样,设计流程中总会有需要的内容。

Initial Method

此方法不适用于Metaslider 作为作者的插件从未打算shortcode 致电viaAJAX. 您将获得一些可显示的内容,但没有任何功能。可以包括JS 文件并执行适当的命令来开始滑块,但是上面的替代方法会容易得多。然而,这种方法仍然适用于其他/类似的需求。

我感觉到你的痛苦。我想做同样的事情。我喜欢使用metaslider 我经常使用CSS @media 对于屏幕宽度检测,而不是实际的设备检测,因为我不关心特定的设备,我关心的是屏幕宽度和内容的布局。我想将滑块隐藏在特定宽度以下,而不考虑设备,因为它符合设计布局的流程。

说明如下:;当一切都说了又做了的时候,程序会是这样的

加载不带滑块的页面AJAX 检查是否加载了滑块(通过并添加了类名或您自己的首选方法),并检查屏幕宽度以查看是否需要滑块。(@gmazzap\'s load_shortcode() 功能可能是您在此处查找的功能)如果需要,请加载滑块AJAX 通过检查内容是否已加载(通过步骤2)并突然结束,可以快速接听来电CSS @media 如果屏幕宽度更改,查询可能会隐藏已加载的滑块。试图“卸载”任何东西,只是为了以后可能不得不再次“重新加载”它,这是没有用的我发现了一些代码,允许您在选定的时间段内调用函数一次。这与AJAX 调用以限制在用户调整大小期间调用函数的次数。这样,理想情况下,每次调整大小时只调用一次函数。而不是在用户更改窗口以满足其需求时调用每一帧。(这可能需要很多次,用户完成后,您只需要一次)

var event_call_function_once = (function ()
{
var timers = {};
return function (callback, ms, uniqueId)
{
    if (!ms)
    {
        ms = 2000;
    }
    if (!uniqueId)
    {
        uniqueId = "Don\'t call this twice without a uniqueId";
    }
    if (timers[uniqueId])
    {
        clearTimeout (timers[uniqueId]);
    }
    timers[uniqueId] = setTimeout(callback, ms);
};
})();
我在堆栈溢出上找到了这段代码,HERE, 并根据我自己的意愿对其进行了轻微修改。

从这里,您将要添加loaded 容器的类名,或以其他方式检测滑块shortcode 已通过加载AJAX. 这样可以避免多次尝试加载内容。(我再次相信@gmazzap\'s 函数可以为您执行此操作。)

您仍然希望使用CSS @media 查询以根据屏幕宽度隐藏滑块,以便用户在桌面上更改屏幕宽度时(如前所述)保持布局有序。在我看来我认为@gmazzap\'s 函数在这里有点过火,使用jQuery@media 查询将正常工作。

注:@gmazzap\'s 函数看起来很好,但是他没有显示AJAX 呼叫您需要构建它以满足您的需要。

你的WordPress一面AJAX 打电话可以很简单:(举个例子,我还没有测试过。你的里程数会有所不同。)

//WP AJAX action function
function load_slider_shortcode() 
{               
    echo(do_shortcode(\'[metaslider id=8302]\')); 
    die();
}
希望这对您或找到此页面的其他人有所帮助。我知道我会根据需要自己使用它。

结束

相关推荐

在PHP中更改_POST_THMBILITH的PUT

我是PHP的新手。我已经把wordpress弄糟了,但并没有真正弄糟它背后的代码。我正在努力加快wordpress网站的加载速度,但我遇到了一些问题。PHP使用the_post_thumbnail 加载一些帖子图片的HTML代码。我有这个代码来延迟加载图像,这样页面可以先加载,然后再加载图像:jQuery(window).load(function() { jQuery(\'img[source]\').prepend(function(){ var source = jQuery