以下文章归类于 ‘技术类’

相信这个功能是很多主题的一道坎,我看到很多大型门户网站都没有支持这个功能。为什么呢?因为麻烦。最传统的做法是把主题中的各个div的宽度用百分比规定,然后他会自动填满整个屏幕。但这样做你会遇到很多麻烦,比如需要自动设置宽度的元素过多,多到我们甚至无法对每一个自动宽度的元素进行设计。此外动态变化的宽度对主题美化是个灾难,毕竟现在的网页美化还是靠图片和html5实现。图片是无法自适应动态宽度的。最后,为什么大型门户网站不支持这种功能呢?据我观察,大型门户网站网页格局大都采用区块化设计。一个页面中有N个区块,每个区块中显示不同的内容。这一点和本主题的设计方式很像。如果要自适应浏览器宽度,那么是改变每个区块的宽度呢?还是改变一行中显示区块的数量呢?出于美学的考量,通常会选择后者,因为区块尺寸的变化会造成整个网页变的很难看。但实现每一行的区块数量随着浏览器尺寸变化,就会涉及到网页结构的动态调整,这很麻烦。

为什么说麻烦呢。就拿本主题为例,wordpress主题采用php编写。php作为服务器端的语言是无法获取本地浏览器宽度的。所以在获取本地浏览器宽度这种活通常都用JS完成,因为JS实在本地运行的语言。好了,按照这个逻辑的发展就是,我们能否在本地通过JS获取浏览器尺寸然后发送给服务器让服务器通过PHP做出调整呢?也许能,也许不能,我不知道,因为我不会。

在网上我们能找到php获取JS变量的最简单的方式通常如下

<script type=text/javascript>document.write(XXX)</script> 

这样做看似能行,但结果通常不是我想要的。这里我假设XXX的值是1。

<?php 
$a = " <script type=text/javascript>document.write(XXX)</script> " 
?> 

这样得到的$a会是什么?echo出来的话会显示1,但用var_dump你会发现是一个长字节数的string格式的1。为什么?因为$a本质上是被赋值了上面代买中双引号中的字符串。所以$a的字节长度是上面js代码的长度,格式是string。只不过在输出的时候js运行了,给了结果1。这意味着$a无法作为php变量参与计算,因为参与运算时$a会被当成一段文本,是string而且不能被转化为int或者bool。哪怕在使用php格式转换时,$a也是作为储存着js代码的文本,而那一串代码是无法转换成任何int或者bool的。所以这么做的结果是只我想要的1只能通过$a显示出来,不能干其他事情。

那该怎么办?实际上上述这种最简单的方法是没辙的。要想真正做到变量的传递只能增加过程。GET方法、session方法、ajax方法、cookie方法选择适合的就行。我没有一一尝试,这次主题更新采用的是cookie方法。

逻辑很简单,网页加载的时候获取浏览器宽度等控制参数,然后查找本地储存的cookie。如果没有,把控制参数储存进cookie然后自动刷新网页,此时cookie中已经了刷新前存储的控制参数,通过php直接调取改变网页结构。如果本地已经存储了cookie,则与获取的控制参数进行对比,不同的话就存储新的参数并自动刷新。如果相同就什么都不做。

这样做的结果是我想要的,本主题在窄屏的情况下,会显示两列日志。而在浏览器宽度尺寸超过某个值后,会显示三列日志。

左半红印发表于2019.06.27th

原版wordpress在进入后台或者直接进入编辑页面时会载入非常缓慢,用chrome的开发者工具看network很容易发现是googleapis的jQuery-ui.css加载超时导致问题。国内对google的支持并不好,这点大家都知道。所以解决方案也很明确,就是替代出问题的

ajax.googleapis.com/ajax/libs/jqueryui/1.11.4
/themes/smoothness/jquery-ui.css

其中的1.11.4是版本号,以后可能会变。然后问题来了,翻遍wordpress都找不到上面那个地址。推测那个地址并不是直接饮用而是通过变量组成的,所以无法直接找到。不过在网上有另一个方案,修改wp-includes/functions.php。详细方法: https://www.cnblogs.com/ningmeng666/p/7324924.html

但我用起来存在问题,我先引用方法中的代码

function hc_cdn_callback($buffer) {returnstr_replace('ajax.googleapis.com/ajax/libs/jqueryui
/1.8.21/themes/smoothness/jquery-ui.css','cdn.bootcss.com/jqueryui/1.12.1/jquery-ui.min.css', $buffer); } 
function hc_buffer_start() { ob_start("hc_cdn_callback"); } 
function izt_buffer_end() { ob_end_flush(); } 
add_action('init', 'hc_buffer_start'); 
add_action('shutdown', 'hc_buffer_end'); 

用起来直接报错,找不到 hc_buffer_end 函数。多明显啊,上面定义的叫 izt_buffer_end 。我不知道作者是故意的还是怎么,这么明显的问题就直接放出来了。不过作者接介绍方法结尾的地方说上面代码可能需要修改,后面我发现需要修改的不止一个函数名。izt_buffer_end 和 hc_buffer_end 修改哪个都行,函数名要一致。然后会继续报notice。

PHP Notice:  ob_end_flush(): failed to delete and flush buffer. No buffer to delete or flush in 

如果你能够修改php.ini,我建议你直接关了notice提示。如果不能,目前来说我能做到的唯一方式是,把 add_action(‘shutdown’, ‘hc_buffer_end’); 删了或者注释掉。

最后谈一下遗留问题。首先上述方法的大概逻辑是,既然找不到那个要修改的直接网址,就等php运行后在网址生成时,在php缓存中拦截并修改它,然后输出。ob_start是开启缓存进行修改,ob_end_flush冲出修改的缓存内容并关闭。我奇怪的是,就算我把ob_end_flush删了,上述方法也是有效的(不知道是不是大家都是这样的)。也就是说,其实并不需要ob_end_flush来冲出缓存。所以上面的方法其实可以缩减一下。

 function hc_cdn_callback($buffer) {
     return str_replace('ajax.googleapis.com/ajax/libs/jqueryui/1.8.21/themes/smoothness/jquery-ui.css', 'cdn.bootcss.com/jqueryui/1.12.1/jquery-ui.min.css', $buffer);//主要是修改这行 
} 
function hc_buffer_start() { ob_start("hc_cdn_callback"); } 
add_action('init', 'hc_buffer_start'); 
弑神发表于2019.06.6th

我不是很专业,这种情况大都发生在纯文本的部分。

具体的解释请参考
https://developer.mozilla.org/en-US/docs/Web/CSS/clear

clear属性只是在block元素是起作用,如果你把clear:both用在一个inline-block或inline元素上,clear:both是不会起任何作用的。

网上大都给了一个增加class的方法,还是比较麻烦。我找到一个99%完美的方法:

要clear的文本前面加个

<br clear=”all”/>

解决!

弑神发表于2019.05.4th

在wordpress的说明文档中,提醒用户时刻保持wordpress的最新版本。所以在大批量的更新后,随手升级了5.0。然后问题来了……

首先问题在PHP版本上,之前使用的5.x版本被wordpress放弃,升级到7.3版本。虽然暂时不升级可能也没啥问题,最多就是报报错而已。但为了以后方便,该升级还是升级好了。

问题是怎么升级啊!在目前的虚拟空间环境下,要升级操作系统的唯一办法是……找客服。好在客服给力,给我升级了,然后问题又有了。

pagebar是我常用的一个wordpress插件,简单小巧好用。不过这个插件已经很久没有更新了。不更新不是问题,问题是现在的pagebar插件不支持PHP7.x。见鬼了,只能自己改。

来自后面一段时间的更新,关于pagebar插件,我最终还是放弃了,换用了现在仍然在更新的插件。所以下面的信息不再适用,仅做存档。

报错信息是:

Deprecated: Methods with the same name as their class will not be constructors in a future version of PHP; PagebarOptions has a deprecated constructor in \wp-content\plugins\pagebar\pagebar_options.php on line 5

Deprecated级的报错不是致命的,但总是显示也不好看不是,而且现在不改以后早晚要改。首先是报错原因:

PHP OOP使用和类名相同的方法名作为构造方法,是 PHP4 的写法,PHP 5中同时支持__construct和类同名方法,但__construct方法具有优先性。

PHP 7开始使用和类名相同的方法名作为构造方法会报E_DEPRECATED级别的错误,提示在未来版本中会彻底抛弃类同名方法作为构造函数。但程序仍然会正常执行。

纠正方法也很简单:

<?php
        class a{
                function a(){
                }
        }
?>

更改成

<?php
        class a{
                function __construct(){
                }
        }
?>

找到报错的对应位置,按照上面的方式更改就行了。

升个级真TM麻烦。

好吧,更新,问题还有几个

Warning: A non-numeric value encountered

Parameter must be an array or an object that implements Countable

这些都是PHP升级后语法规则变得更加严格导致以前可以兼容的错误现在都以warning的形式报出来了。这些问题的修复需要根据实际情况,还需要一点php功底。这里就不赘述了。

左半红印发表于2019.05.4th

网上看到很多方法,有效的不多,当有可能是触发该问题的原因不同。但无论如何优先尝试下面这个方法:

开启internet选项,右键网络->internet选项,当然也可以打开“运行”输入 inetcpl.cpl (“WINDOWS”+“R”键,输入 inetcpl.cpl亦可)

点开高级往下拉,勾上”使用TLS 1.2″选项,或者点还原高级设置,确定退出即可

windows默认应该是已经勾选上的,没有勾选有可能是某些PC优化软件造成的。

另外,啥是TLS1.2呢?

我查了一下,发现是其前身是SSL。所以这玩意应该是一个保密协议。

网景公司开发了原始的SSL协议,SSL 1.0因为本身存在着严重的安全问题,所以从未被公开发布。只有SSL 2.0和SSL 3.0是被公开发布和使用的。后来为了对SSL进行标准化,推出了TLS,TLS 1.0就对应着SSL 3.0。TLS后来又有了1.1版本和1.2版本

左半红印发表于2019.05.4th

不记得从什么时候开始,玩这款游戏每过一会就会卡一下。非常神奇。通过检测任务管理器,可以发现显卡3D性能会在某个时候有一个低谷,低谷到0。同时,CPU占用会涨到100然后瞬间回落。这两个现象是同时发生,说明游戏在某个时候会大量占用CPU,然后瞬间又降低到正常水平。这导致了游戏每过一阵就发生卡顿。那么到底是为什么呢?

参照网上的方法禁用了一些游戏内容,没啥效果。然后贴吧某个帖子里找到了一个方法,试验后竟然有效!神奇!

具体操作方法是调用msconfig,引导,引导高级选项,处理个数调到最大,打钩,确定,重启。

5月6日update:对于win10系统有可能需要将游戏兼容性调整为win7或者win8,以防止无法运行。

那么回过头,这个引到高级选项里的处理器个数到底是什么呢?下面引用一下微软官方论坛的答复:

Alex_Shen回复时间 2011/11/18
Microsoft技术支持

你好,

如果不勾选“最大处理器数”,那么就会根据您的硬件默认识别出是多线程的,比如我们是4线程的CPU,那系统就会自动识别出,在运算时也会调用4个线程,而如果勾选了,并设置为1,那么系统就指会调用一个线程。

如果没有特殊需求,建议不要对其进行设置,如果您需要最大化地利用您的硬件,那么也没有必要进行设置。

如您希望获取更快速响应的一对一服务,可以通过以下联系方式获取详情:
微软官方商城:http://t.cn/RLCaC8X
联系电话: 8008203800拨1拨2; 4008822059

呵呵,这个答复的基本意思就是,系统自己会检测并使用的,用户不用管。但为什么天刀这么设置后就能解决问题呢?猜测是天刀对多处理器核心的优化并不好,无法自动检测并有效调用。必须强制让系统调用多核心后才能,有效使用。垃圾游戏。

左半红印发表于2018.04.7th