大家都知道,在WordPress的主题里面要获取主题所在目录很简单,一个函数搞定:get_bloginfo('template_directory')。但是,在 js 文件里面就不是那么简单了(真正懂 js 的除外)。
我们经常用的 willin 出品的 ajax 评论提交就用到了这个,需要定位 ajax 提交 url 目标:comments-ajax.php 文件,而这个文件是在所用主题目录里面。willin 用的是 js 方法,大概是先获取 comments-ajax.js 文件的 url,然后替换“comments-ajax.js”为“comments-ajax.php”。代码如下:(截取自 willin 的 ajax 评论提交文件)
var i = 0, got = -1, len = document.getElementsByTagName('script').length; while ( i <= len && got == -1){ var js_url = document.getElementsByTagName('script')[i].src, got = js_url.indexOf('/comments-ajax.js'); i++ ; } var ajax_php_url = js_url.replace('/comments-ajax.js','/comments-ajax.php');
代码中 ajax_php_url 变量就是了。
前段时间我也稍微玩了下 jQuery 的 Ajax 请求,所以对 Ajax 请求中的 GET 请求了解了点,想想也可以通过 GET 请求获取 WordPress 的 get_bloginfo('template_directory') 函数的值。
我在本地测试了一下,OK了,也用到自己折腾的 Ajax 评论提交里面,具体效率方面我就不知道了,我对 js 一知半解。下面是方法:
0. 前提:加载 jQuery 库
1. 在主题的 functions.php 里面添加如下函数代码:显示 get_bloginfo('template_directory') 的值
function theme_file_url(){ if( isset($_GET['action'])&& $_GET['action'] == 'theme_file_url' ){ nocache_headers(); //(FIX for IE) echo get_bloginfo('template_directory'); die(); } } add_action('init', 'theme_file_url');
2. jQuery 代码:用 GET 请求功能获取 theme_file_url() 的数据(data)
var ajax_php_url = ''; $.get('./?action=theme_file_url',function(data){ajax_php_url = data+'/comments-ajax.php';});
就这样,ajax_php_url 的值就是 http://你所用的主题目录/comments-ajax.php
至于哪种方法比较好我不知道,反正多个方法,而且这个 get 是异步传输的,所以参数会有延迟,不适合打开页面就要使用的变量。
2011.1.13 Update:在评论里通过跟几位朋友讨论后得出,这个方法稍微有点蛋疼,不够直接,不过这篇所说方法其实可作为异步加载内容用。js 高手 Qiqiboy 也给出了 2 个常用的方法,我在下一篇说一下和贴一下。
- 本文标题:使用jQuery的GET请求功能获取WP主题目录地址
- 本文链接:https://zww.me/archives/25375
- 发布时间:2011年01月12日 10:18
- 版权声明:除非注明,文章均为 zwwooooo 原创,转载请以链接形式标明本文地址!
有沙发就要先坐起~
我看willin的代码,感觉是用JavaScript来检测页面加载的标签中有没comments-ajax.js,获取到后正则加载php文件~
@林木木
貌似是
http://www.w3school.com.cn/js/jsref_indexOf.asp 看这,应该就是这个~
@林木木
js没去了解过,实在不懂,不过这个indexOf貌似很有用。
我就是随便看看
有两种比较好的方法,第一种是直接在页面中输出页面地址
这样siteurl变量可以在页面中直接引用
第二种是检测head中的style.css文件来获取目录,每个wp博客都有style.css而不一定有comments-ajax.js
function baseurl(){
var url,
finds=document.getElementsByTagName('link');
for(var i=0;i0){ url=finds[i].href.substring(0,finds[i].href.indexOf('style.css')+10);
break;
}
}
return url;
}
@QiQiBoY
你好久木有更新了……
@QiQiBoY
第一种不方便
第二种是和用while的一样,貌似你敲错了,难怪我测试不过。。。我懒,一开始没看直接cp。。。
@QiQiBoY
第一种效率高,我就用这个
@zwwooooo
第一种也很方便的,我是用php文件输出那段js的,放在function里面,通用性也很好
@winy
的确你这样方便,哈
@zwwooooo
我支持不用ajax实现,通过url可以算出来。
Ajax设计用来处理动态的数据~
@alswl
嗯嗯,好久不见,工作还可以吧
@zwwooooo
忙里偷闲,苦中作乐
@alswl
生活如此,慢慢体会
前排...
获取了这个有什么用
@软件盒子
你要用时就有用了。
这属于技术文,大大们讨论吧,不适合我们小白看
@有点蓝
这个。。。其实我也不太懂
@zwwooooo
Z大 你太诚实了吧
@有点蓝
是不太懂,我没怎么接触js,只简单玩玩jQuery
@zwwooooo
咦~~~据我“猜测”,jQuery不应该是js+Query吗,会JQ就会js了吧?
@有点蓝
不对,jQ虽然是js库,但试用上简单多了。会原生js的用jQ很简单很容易入手,会jQ的不一定会原生js。
@zwwooooo
原来jQ就是js库啊,我还真蒙对了…
可不可以这样理解:js就是一棵果树,jQ就是树上的果子。我们调用JQ就是吃果子,果子是树上长的,调用的其实还是js,只不过是果树的精华——果子,js里的“库”——jQ?
@有点蓝
。。。你竟然还要比喻。。。哈哈哈
@zwwooooo
莫非是“小白一思考,大师就发笑”么……
@有点蓝
不是,我的意思是你竟然用了一大段来比喻
@zwwooooo
好吧,我承认我词不达意,又啰嗦了
@有点蓝
这。。。其实很形象
QiQiBoY 说的第一种方法完破
@mice
第一种不适合js文件
@zwwooooo
我觉得挺好啊,js文件里面直接获取就好了..
你那个也是改了funtion
这个只需要在模版里面加一行而已 -.-比那个简单多了
@mice
你的意思是在主题模板加一行?然后另外调用的js引用?呵呵,应该是不行的,即时行同样不方便,最方便的还是willin的(即qiqiboy说的第二种)。
@zwwooooo
就这个嘛..
你可以在然后你就可以在js里直接调用siteurl变量..你说哪个方便点?
这个貌似叫全局变量..貌似是这么说的
@mice
是全局变量,还是js文件里面方便。
Warning: Undefined array key 1 in /www/wwwroot/zww/zww.me/wordpress/wp-content/plugins/wp-useragent/wp-useragent-detect-webbrowser-version.php on line 32
@zwwooooo
箩卜白菜各有所爱
@mice
这个倒是。。。
不太懂js,所以没考虑过这方面。了解一下,以后一定会用上~
@奚少
需用时就有用了
这 完全不懂啊。。。
@一世年华
这。。。要稍微接触下
额,我也是看不懂,等你写杂文来着。
@Firm
我很少写杂文吧
我根本看不懂,
@爱惜
这个。。。了解jQuery一下都知道点了
不错的构思....不过.!!貌似太复制了吧!!!!
@混乱博客
哈哈,的确有点婉转
这篇文章比较吸引我的是两边的广告
@囧啊囧
因为红色吗?还是因为“宅”
@zwwooooo
因为是我关注的广告啊!准备换空间了,^_^
@囧啊囧
哈,原来如此,小张的很不错
没对自己的网站开过刀。
@韩国
稳定就不需要了
=.= 自己用的话,就直接写死 算了、、
@Kars
嗯嗯,但有时分开会比较容易移植
用这个是不是说我的主题就支持AJAX评论了呢,我烦呢,每提交一次评论就会刷新一下页面。
@第六空间
不是,你要你的主题支持ajax评论提交直接用willin的方法
@zwwooooo
用willin的方法失败,我的主题有点麻烦。
@第六空间
那就是评论结构自定义程度太高了,要自己针对主题修改js。
@zwwooooo
要不我把我的主题发给你?你给看看?
@第六空间
最近忙,没时间啊,付费的一堆,忙完再看看吧
这样也行,记下了。
@zigbee
玩玩而已,不是最好的解决方法
没想到竟然给了你这样的灵感.php里的echo这样就不是echo到页面上,而是echo到函数里了吧?
我觉得你的方法不错哦,所谓异步,也就是全部页面加载完成之后吧,就是说,如果页面加载顺利就没影响,如果有死链之类的就无法调用,是吧?
@lifishake
函数里面的echo是这个函数的输出内容。
这个方法用来做异步加载好,用来取值的确不太适合。