wordpress模板开发

文档主页:http://codex.wordpress.org/Templates

开发文档:http://codex.wordpress.org/Theme_Development 【重要】

版本兼容问题:http://codex.wordpress.org/Migrating_Plugins_and_Themes

页面导航,wp怎样查找该运行哪个脚本?http://codex.wordpress.org/Template_Hierarchy

安全输出:http://codex.wordpress.org/Theme_Development#Untrusted_Data

 

官方默认的模板是最好的例子。

样式描述是在 style.css 开头的注释中

 

页面(Page)

是通过admin面板中页面菜单来添加的,其url为 站点url/页面别名 组成。模板是page-页面别名

例如新建页面别名为testpage,那么会找page-testpage.php作为模板。

 

自定义文章类型:

http://codex.wordpress.org/Post_Types

是需要通过代码注册新类型:

add_action( 'init', 'create_post_type' );
function create_post_type() {
	register_post_type( 'acme_product',
		array(
			'labels' => array(
				'name' => __( 'Products' ),
				'singular_name' => __( 'Product' )
			),
		'public' => true,
		'has_archive' => true,
		)
	);
}

这样会在admin面板中添加个Product菜单,创建的新文章url为 站点url/archives/类型名/文章title 组成。(具体链接地址还和你的链接设置相关)

例如上面代码Product类型新建文章名为testpost,则会找single-acme_product.php作为模板,url应该是站点url/archives/acme_product/testpost

注意,当刚刚添加新类型时,会发现刚发布的此类型文章无法访问,可在固定链接设置中点一下提交按钮刷新wordpress设置,这样就可以看到新发布的类型文章了。

register_post_type 函数有许多参数,像上面的public如果为false,那么不仅普通网友无法看到此类型的文章,并且admin面板里也没这个菜单。不知道这样的设置有什么作用!

Continue reading wordpress模板开发

Extjs 性能降低的可能原因

见天终于找出一个问题,我们的应用要打开一个Ext.Window窗口,然后可以关闭它再打开。问题是,第一次打开很好,速度不错,再以后打开就非常慢,有时甚至达到5秒以上的延迟。由于系统比较复杂,开始一直找的是网络问题,服务端调用问题,后来发现不是这些原因,而是Extjs绘制很慢。

逐个排除,发现是多了这么一句话 renderTo: document.body,

这样导致在调用show之前就绘制了一次,然后show又绘制了一次。后来发信这个问题别人也遇到过了。

http://blog.csdn.net/tianxiaode/article/details/6525486

另外一个问题是,有个Ext.window里面有个很大的dom元素,我们发现使用hide(),show()方法显示比较卡,有时甚至几秒钟。我们的解决方法是,要隐藏时将这个window位置设置到用户看不到的地方,要显示时再把它移回来。这样明显速度快多了。发现Extjs本身就是使用这种方式来显示隐藏对话框的。看来这确实是个问题。

现在看来,Extjs使用还真得小心,你说C容易内存泄露,Extjs也会。如果不注意尾巴的话,你打开dom树,就会发现一堆垃圾在那没回收,到后来就是越来越慢。

 

--如果给我一个美工,我将丢弃Extjs。

Continue reading Extjs 性能降低的可能原因

background-attachment:fixed 问题

今天发现background-attachment:fixed原来不是这么简单:

见:http://reference.sitepoint.com/css/background-attachment

The value fixed stops the background-image from scrolling with its containing block. Note that although the fixed background-image may be applied to elements throughout the document, its background-position is always placed in relation to the viewport. This means the background-image is only visible when its background-position coincides with the content, padding, or border area of the element to which it is applied. Thus, a fixed background-image doesn’t move with elements that have a scrollbar—see overflow—because it’s placed in relation to the viewport.

我真是晕,fixed的情况下,不管background-attachment:fixed设置到哪个元素,其background-position是依据body来定位的。

使用background-attachment:scroll则是相对本元素定位。

测试FF,IE8,Chrome都是这样。

 

可依据这个例子来看:

><html> <head> <style type="text/css"> .hi { height:200px; width:200px; border:1px solid blue; background-image:url('eg_bg_03.gif'); background-repeat:no-repeat; background-attachment:fixed; background-position:left top; padding: 0px; }

Continue reading background-attachment:fixed 问题

Photoshop转ico插件

这段时间补了一下PS的课,稍微熟悉了点,但还是很多地方不熟,用七拼八凑的知识做了个本站的logo:

logok

还凑合吧。

这里说一下PS转ico的插件,PS不知为什么不支持存储为ico,所以还得下个插件来保存:

http://www.telegraphics.com.au/svn/icoformat/trunk/dist/README.html

安装方法上面有,不过这里没找到下载地址,还是到

http://www.hiliuyun.cn/wp-content/uploads/2010/01/PhotoShop-ico-lpugin.zip

这里下载的。

 

参见:

http://www.hiliuyun.cn/2010/01/photoshop-png%E6%A0%BC%E5%BC%8F%E8%BD%ACico%E6%8F%92%E4%BB%B6.html

Continue reading Photoshop转ico插件

XPath namespace的情况

今天使用Dom4j取节点,试了半天都没取到,真是很纳闷,用了这么久的函数今天突然不行了?仔细一看,原来xml节点带名空间。

下面引用自: http://www.cnblogs.com/PunkChen/archive/2008/04/02/1134304.html

xml代码example:
<report  xmlns="http://www.eclipse.org/birt/2005/design" version="3.2.15" id="1">
    <list-property name="cssStyleSheets">
        <structure>
            <property name="fileName">D: eport.css</property>
        </structure>
    </list-property>
</report>
第一个方案.设置你的xpath的命名空间setNamespaceURIs

public class TransferXML {
    public static void main(String[] args) throws Exception{
        Map map = new HashMap();
        map.put("design","http://www.eclipse.org/birt/2005/design");
        SAXReader saxReader = new SAXReader();
        File file = new File("D:\test.xml");
        Document document = saxReader.read(file);
        XPath x = document.createXPath("//design:list-property");
        x.setNamespaceURIs(map);
        List nodelist = x.selectNodes(document);
        System.out.println(nodelist.size());
    }
}
第二个解决方案:设置你的DocumentFactory()的命名空间 setXPathNamespaceURIs
public class TransferXML {
    public static void main(String[] args) throws Exception{
        Map map = new HashMap();
        map.put("design","http://www.eclipse.org/birt/2005/design");
        SAXReader saxReader = new SAXReader();
        File file = new File("D:\test.xml");
        saxReader.getDocumentFactory().setXPathNamespaceURIs(map);
        Document document = saxReader.read(file);
        List tmp = document.selectNodes("//design:list-property");
        System.out.println(tmp.size());
    }
}
第三种方法:本人用的,最笨也是最通用的方法,就是不使用开发环境给你提供的一系列对象,而是用XPath语法中自带的local-name() 和 namespace-uri() 指定你要使用的节点名和命名空间。
当你遇到使用xslt来样式化xml时,就知道这个笨方法的好处了:
public class TransferXML {
    public static void main(String[] args) throws Exception
        SAXReader saxReader = new SAXReader();
        File file = new File("D:\test.xml");
        Document document = saxReader.read(file);
        List tmp = document.selectNodes("//*[local-name()='report' and namespace-uri()='http://www.eclipse.org/birt/2005/design']/* [local-name()='list-property']");
        System.out.println(tmp.size());
    }
}

我觉得第三种最方便,虽然有点繁琐,往往那个名空间是多余的东西,我们处理的数据不需要关心它,所以使用低三种方法时,可以将and namespace-uri()='http://www.eclipse.org/birt/2005/design 这个条件不要,那么不管它是什么名空间,只要是要选取得节点名就被包含了。

 

不得不吐槽:为什么不用json呢?

 

参见:

http://www.cnblogs.com/PunkChen/archive/2008/04/02/1134304.html

Continue reading XPath namespace的情况

再谈p3p与第三方cookie

之前的文章 http://kazge.com/archives/91.html 初略了解了一下p3p,这次重温一下。

P3P是w3c 开发的协议 Platform for Privacy Preferences Project (P3P)。

主要用途是:

允许第三方cookie使用,这样的场景例如:

一个站点A.com包含了一个iframe,这个iframe指向了另外一个域的站点B.com。

那么B想要设置cookie并有时需要获得它,这就是第三方cookie。

注意,这里B能设置的cookie的domain 值还是b.com,但是相对于整个页面来说访问的是A.com所以叫做第三方cookie,B.com仍然是不能操作A.com的cookie的,否则就乱套了。 这个其实也不存在什么跨域的意思。

要让B.com能操作它的第三方cookie,B.com的页面需要使用P3P header来让浏览器来允许它这样做。

什么情况会发生这种应用场景:

1:第三方访问统计分析网站。

2:A 站点集成其他站点应用。

 

参见:

http://kazge.com/archives/91.html

Continue reading 再谈p3p与第三方cookie

IE 回车 提交表单问题

现在当我写一个form时,总是提心吊胆的,因为最近我几次遇到回车导致表单提交的情况,当然,这任然是在“神奇的IE”里面出现的奇迹。

这里所说的问题都是说在文本框里回车导致的,你在别的地方回车当然没这个问题。

网上有人总结了:

http://www.cnblogs.com/cxd4321/archive/2012/05/07/2486926.html

 

我们有时候希望回车键敲在文本框(input element)里来提交表单(form),但有时候又不希望如此。比如搜索行为,希望输入完关键词之后直接按回车键立即提交表单,而有些复杂表单,可能要避免回车键误操作在未完成表单填写的时候就触发了表单提交。

要控制这些行为,不需要借助JS,浏览器已经帮我们做了这些处理,这里总结几条规则:

1、如果表单里有一个type=”submit”的按钮,回车键生效。

2、如果表单里只有一个type=”text”的input,不管按钮是什么type,回车键生效。

3、如果按钮不是用input,而是用button,并且没有加type,IE下默认为type=button,FX默认为type=submit。

4、其他表单元素如textarea、select不影响,radio checkbox不影响触发规则,但本身在FX下会响应回车键,在IE下不响应。

5、type=”image”的input,效果等同于type=”submit”,不知道为什么会设计这样一种type,不推荐使用,应该用CSS添加背景图合适些。

实际应用的时候,要让表单响应回车键很容易,保证表单里有个type=”submit”的按钮就行。而当只有一个文本框又不希望响应回车键怎么办呢?我的方法有点别扭,就是再写一个无意义的文本框,隐藏起来。根据第3条规则,我们在用button的时候,尽量显式声明type以使浏览器表现一致。

我再补充type=”image”的BT情况,当用户会车时,竟然会触发这种标签的onclick事件---这就是奇迹,它就在那里!

 

然后再联系一下IE form提交的另外的问题http://kazge.com/archives/356.html , 这就是我为什么提心吊胆的原因了。

Continue reading IE 回车 提交表单问题

oracle11g XE 使用经历

我这次使用oracle 11g XE(express edition)算是浅尝辄止,我的机器几年前装过8,9i都不是很卡,几年过去,都到11g了,安装到很顺利,但是一开服务,我的机子就做不了事了,开个网页都卡的不行。

还试用了sql developer 3,不需要oracle客户端(TNS连接方式), sql编辑按空格有提示。

导入客户的sql脚本,结果n多表空间要建,真是麻烦。

用惯了mysql现在不习惯oracle这个笨家伙了,我的mysql服务一直开机启动,根本没什么影响。

 

另外在oracle官网上下载都需要注册oracle用户,且速度奇慢。

Continue reading oracle11g XE 使用经历

askterisk笔记【二】

第二十章 AMI

Asterisk Manager Interface主要提供AST系统监控以及管理功能,它可以要求AST做一些事情,例如发起一个新呼叫。

需要的配置:

manager.conf

;
; 打开AMI并本地访问
[general]
enabled = yes
webenabled = yes
bindaddr = 127.0.0.1
;
; 创建用户hello,密码world
;
[hello]
secret=world

上面的配置打开了http访问,这个需要配置http.conf(注意这个不是apache的httpd.conf)但是我安装的ASteriskNow并没有这个http.conf配置文件,也没打开http访问,常见的还是使用tcp访问,默认端口是5038。

如果没发现这个文件http.conf,可以自己加一个:

[general]
enabled=yes
bindaddr=0.0.0.0
bindport=8088
prefix=gui                          ;这个前缀用于http请求的url前缀
enablestatic=yes

这样的话请求AMI应该是:

http://localhost:8088/gui/rawman?action=login&username=hello&secret=world

然后重新加载:CLI>core reload

如果登陆不成功,还要看manager.conf中deny设置是否禁止了你的ip访问。

协议:

主要有两种协议:

Manager events 只从AST到AMI客户端的单项事件

Manager actions AMI客户端请求AMI会得到返回Action Response。

对于http连接,事件需要通过poll来获取。

下面是开源AMI客户端库。

Adhearsion Ruby http://adhearsion.com/
StarPy Python http://starpy.sourceforge.net/
Asterisk-Java Java http://asterisk-java.org/

介绍几个有用的AMI应用:

Asterisk GUI这个包含在AsteriskNow中 ,参见http://www.asterisk.org/asterisknow/developers/gui-guide

 

第二十一章 AGI

内置的dialplan写法可能有很多不便之处(如果你熟知一门编程语言的话),使用AGI则可以使用其他编程语言来控制呼叫流程,但是这么做还是离不开native dialplan的参与。

例如

exten => 500,1,AGI(hello-world.sh)

这里就调用了shell脚本的AGI

打开AGI调试:

*CLI> agi set debug on

AGI变种

Process-Based AGI:

最简单的AGI,调用方式AGI(command[,arg1[,arg2[,...]]]) command可以使绝对路径,相对路径,arg1…是AGI需要传入的参数。

执行AGI时,与AST交互的方式是通过stdin 和 stdout来进行的。

有点:简单

缺点:太简单,高并发时建议使用FastAGI

EAGI (Enhanced AGI)

相对于AGI,除了stdin和stdout外还可以获得单向只读语音流(app_jack提供获得AST之外音频流的功能)。

*CLI> core show application EAGI

优点:简单

缺点:性能消耗比Process-Based AGI高

DeadAGI

这个已被废弃,不要使用。

FastAGI—AGI over TCP

使用tcp连接,不再是每个call一个进程,提高效率。

exten => 1234,1,AGI(agi://192.168.1.199:4573,arg1,arg2,arg3)

FASTAGI支持srvrecord

exten => 1234,1,AGI(hagi://shifteight.org)

优点:效率较好

缺点:实现FASTAGI Server比较复杂

Async AGI—AMI-Controlled AGI

异步AGI,可以使AMI调用AGI。

exten => 1234,1,AGI(async:agi)

这种方式的流程是,当执行上面一句时,会等待,然后,在AMI客户端中向·这个通道发命令,以这样的方式来执行。

对于要执行AGI的影虎需要在manager.conf中指明权限

[hello]
secret = world
read = agi    ;有读权限
write = agi  ;有写权限

优点:AMI可使用AGI

缺点:最复杂的一种用法

会话过程

调用AGI或EAGI后,会话建立,自定义参数(如agi_arg_0)和固有参数(如agi_request)会传入:

对于Async AGI,开始时AMI会发送事件Manage Events,例如:

Event: AsyncAGI
Privilege: agi,all
SubEvent: Start
Channel: SIP/0000FFFF0001-00000000
Env: agi_request%3A%20async%0Aagi_channel%3A%20SIP%2F0000FFFF0001-00000000%0A \
agi_language%3A%20en%0Aagi_type%3A%20SIP%0Aagi_uniqueid%3A%201285219743.0%0A \
agi_version%3A%201.8.0-beta5%0Aagi_callerid%3A%2012565551111%0A \
agi_calleridname%3A%20Julie%20Bryant%0Aagi_callingpres%3A%200%0A \
agi_callingani2%3A%200%0Aagi_callington%3A%200%0Aagi_callingtns%3A%200%0A \
agi_dnid%3A%20111%0Aagi_rdnis%3A%20unknown%0Aagi_context%3A%20LocalSets%0A \
agi_extension%3A%20111%0Aagi_priority%3A%201%0Aagi_enhanced%3A%200.0%0A \
agi_accountcode%3A%20%0Aagi_threadid%3A%20-1339524208%0A%0A

一旦会话开始,AGI就可以发送命令和获得回应,命令的执行是序列化的,一个执行完毕才会执行下一个。

AGI会话的终止

各种AGI的行为不一样:

Process-based AGI/FastAGI:

会话挂断会通知AGI程序来做后续处理。(1.4之前是直接中断,不会通知)

Process-based AGI 会发SIGHUP 信号

FASTAGI会发HANGUP信号。

可以通过这样来禁止发送SIGHUP /HANGUP信号:

;
; Don't send SIGHUP to an AGI process
; or the "HANGUP" string to a FastAGI server.
;
exten => 500,1,Set(AGISIGHUP=no)
same => n,AGI(my-agi-application)

如果禁用,则相当于DeadAGI模式,会话其实结束了,但仍可以执行。不过只能执行不需要交互的命令,具体看每个命令的文档说明。

对于Async AGI,如果会话中断,会发中断提示,如果想要主动中断会话,AMI客户端需要发送ASYNCAGI BREAK命令。

AGI各种开发语言库:

Adhearsion Ruby http://adhearsion.com/
StarPy Python http://starpy.sourceforge.net/
Asterisk-Java Java http://asterisk-java.org/
Asterisk-perl Perl http://asterisk.gnuinter.net/
PHPAGI PHP  http://phpagi.sourceforge.net/

第二十五章 web 接口

这一章介绍了有名的相关项目:

坐席管理

http://www.asternic.org/ Flash Operator Panel 免费

http://www.fop2.com/  Flash Operator Panel2 15个以上收费

http://www.cdr-stats.org/ Call Detail Records 分析统计工具

http://www.asterisk2billing.org/ 计费系统 A2Billi ng

 

第十八章 外部服务

使用XMPP

需要res_jabber模块,默认是没有安装的,如果要支持gtalk的话,需要chan_gtalk,chan_jingle(这两个依赖res_jabber)

centos上需要iksemel:

yum install iksemel-devel openssl-devel

现在假设res_jabber安装好了,需要配置 jabber.conf

[general]
debug=no
autoprune=no
autoregister=yes
auth_policy=accept
[asterisk]
type=client
serverhost=talk.google.com                   ;这里连到了gtalk
[email protected]    ;xmpp用户名
secret=<super_secret_password>     ;xmpp密码
port=5222
usetls=yes
usesasl=yes
status=available
statusmessage="Ohai from Asterisk"

 

dialplan:

exten => 106,1,Verbose(2,Example using the Local channel) ;一开始就呼叫dialplan
same => n,Dial(Local/[email protected]${CONTEXT}/n&Local/[email protected]${CONTEXT}/n)
exten => jabber,1,Verbose(2,Send an XMPP message and expect a response) ;接到呼叫发送xmpp消息
; *** This line should not have any line breaks
same => n,JabberSend(asterisk,[email protected],Incoming call from
${CALLERID(all)}. Press 2 to send to voicemail.) ;消息不能换行
same => n,Set(JabberResponse=${JABBER_RECEIVE(asterisk,[email protected],6)})
same => n,GotoIf($["${JabberResponse}" = "2"]?voicemail,1)
same => n,Hangup()
exten => dial,1,Verbose(2,Calling our desk)
same => n,Dial(SIP/0000FFFF0002,15)
same => n,Goto(voicemail,1)
exten => voicemail,1,Verbose(2,VoiceMail)
same => n,Answer()
; *** This line should not have any line breaks
same => n,Set(VoiceMailStatus=${IF($[${ISNULL(${DIALSTATUS})}
| "${DIALSTATUS}" = "BUSY"]?b:u)})
same => n,Playback(silence/1)
same => n,VoiceMail([email protected],${VoiceMailStatus})
same => n,Hangup()

这个例子是通过发送xmpp消息来让xmpp用户来选择。

与skype整合

可以通过skype发、接消息,呼叫好友

LDAP整合

 

TextToSpeech

Festival 和 Cepstral 引擎

 

暂看到这里……

Continue reading askterisk笔记【二】

Pagination


Total views.

© 2013 - 2020. All rights reserved.

Powered by Hydejack v6.6.1