2011年01月12日 73条评论

使用jQuery的GET请求功能获取WP主题目录地址

大家都知道,在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 个常用的方法,我在下一篇说一下和贴一下。

zww
or
oooo

“使用jQuery的GET请求功能获取WP主题目录地址”有73条评论

  1. Choikit says:

    有沙发就要先坐起~

  2. 林木木 says:

    我看willin的代码,感觉是用JavaScript来检测页面加载的标签中有没comments-ajax.js,获取到后正则加载php文件~

    1. zwwooooo says:

      @林木木
      js没去了解过,实在不懂,不过这个indexOf貌似很有用。

  3. 我就是随便看看

  4. QiQiBoY says:

    有两种比较好的方法,第一种是直接在页面中输出页面地址

    <script>var siteurl=<?php bloginfo('template_directory') ?></script>

    这样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;
    }

    1. 有点蓝 says:

      @QiQiBoY
      你好久木有更新了……

    2. zwwooooo says:

      @QiQiBoY
      第一种不方便
      第二种是和用while的一样,貌似你敲错了,难怪我测试不过。。。我懒,一开始没看直接cp。。。

    3. winy says:

      @QiQiBoY
      第一种效率高,我就用这个

    4. winy says:

      @zwwooooo
      第一种也很方便的,我是用php文件输出那段js的,放在function里面,通用性也很好

    5. zwwooooo says:

      @winy
      的确你这样方便,哈

    6. alswl says:

      @zwwooooo
      我支持不用ajax实现,通过url可以算出来。
      Ajax设计用来处理动态的数据~

    7. zwwooooo says:

      @alswl
      嗯嗯,好久不见,工作还可以吧

    8. alswl says:

      @zwwooooo
      忙里偷闲,苦中作乐

    9. zwwooooo says:

      @alswl
      生活如此,慢慢体会

  5. MOPVHS says:

    前排...

  6. 获取了这个有什么用

    1. zwwooooo says:

      @软件盒子
      你要用时就有用了。

  7. 有点蓝 says:

    这属于技术文,大大们讨论吧,不适合我们小白看 :cry:

    1. zwwooooo says:

      @有点蓝
      这个。。。其实我也不太懂

    2. 有点蓝 says:

      @zwwooooo
      Z大 你太诚实了吧 :mrgreen:

    3. zwwooooo says:

      @有点蓝
      是不太懂,我没怎么接触js,只简单玩玩jQuery

    4. 有点蓝 says:

      @zwwooooo
      咦~~~据我“猜测”,jQuery不应该是js+Query吗,会JQ就会js了吧? :mrgreen:

    5. zwwooooo says:

      @有点蓝
      不对,jQ虽然是js库,但试用上简单多了。会原生js的用jQ很简单很容易入手,会jQ的不一定会原生js。

    6. 有点蓝 says:

      @zwwooooo
      原来jQ就是js库啊,我还真蒙对了…
      可不可以这样理解:js就是一棵果树,jQ就是树上的果子。我们调用JQ就是吃果子,果子是树上长的,调用的其实还是js,只不过是果树的精华——果子,js里的“库”——jQ?

    7. zwwooooo says:

      @有点蓝
      。。。你竟然还要比喻。。。哈哈哈

    8. 有点蓝 says:

      @zwwooooo
      莫非是“小白一思考,大师就发笑”么……

    9. zwwooooo says:

      @有点蓝
      不是,我的意思是你竟然用了一大段来比喻

    10. 有点蓝 says:

      @zwwooooo
      好吧,我承认我词不达意,又啰嗦了 :oops:

    11. zwwooooo says:

      @有点蓝
      这。。。其实很形象

  8. mice says:

    QiQiBoY 说的第一种方法完破 :mrgreen:

    1. zwwooooo says:

      @mice
      第一种不适合js文件

    2. mice says:

      @zwwooooo
      我觉得挺好啊,js文件里面直接获取就好了..
      你那个也是改了funtion
      这个只需要在模版里面加一行而已 -.-比那个简单多了

    3. zwwooooo says:

      @mice
      你的意思是在主题模板加一行?然后另外调用的js引用?呵呵,应该是不行的,即时行同样不方便,最方便的还是willin的(即qiqiboy说的第二种)。

    4. mice says:

      @zwwooooo

      <script>var siteurl=<?php bloginfo('template_directory') ?></script>

      就这个嘛..
      你可以在然后你就可以在js里直接调用siteurl变量..你说哪个方便点?
      这个貌似叫全局变量..貌似是这么说的 :grin:

    5. zwwooooo says:

      @mice
      是全局变量,还是js文件里面方便。

    6. mice says:

      @zwwooooo
      :mrgreen: 箩卜白菜各有所爱

    7. zwwooooo says:

      @mice
      这个倒是。。。

  9. 奚少 says:

    不太懂js,所以没考虑过这方面。了解一下,以后一定会用上~

    1. zwwooooo says:

      @奚少
      需用时就有用了

  10. 这 完全不懂啊。。。

    1. zwwooooo says:

      @一世年华
      这。。。要稍微接触下

  11. Firm says:

    额,我也是看不懂,等你写杂文来着。

    1. zwwooooo says:

      @Firm
      我很少写杂文吧

  12. 爱惜 says:

    我根本看不懂, :cry:

    1. zwwooooo says:

      @爱惜
      这个。。。了解jQuery一下都知道点了

  13. 不错的构思....不过.!!貌似太复制了吧!!!!

    1. zwwooooo says:

      @混乱博客
      哈哈,的确有点婉转

  14. 1囧啊囧 says:

    这篇文章比较吸引我的是两边的广告 :mrgreen:

    1. zwwooooo says:

      @囧啊囧
      因为红色吗?还是因为“宅” :mrgreen:

    2. 囧啊囧 says:

      @zwwooooo
      因为是我关注的广告啊!准备换空间了,^_^

    3. zwwooooo says:

      @囧啊囧
      哈,原来如此,小张的很不错

  15. 韩国 says:

    没对自己的网站开过刀。

    1. zwwooooo says:

      @韩国
      稳定就不需要了

  16. Kars says:

    =.= 自己用的话,就直接写死 算了、、

    1. zwwooooo says:

      @Kars
      嗯嗯,但有时分开会比较容易移植

  17. 用这个是不是说我的主题就支持AJAX评论了呢,我烦呢,每提交一次评论就会刷新一下页面。

    1. zwwooooo says:

      @第六空间
      不是,你要你的主题支持ajax评论提交直接用willin的方法

    2. @zwwooooo
      用willin的方法失败,我的主题有点麻烦。

    3. zwwooooo says:

      @第六空间
      那就是评论结构自定义程度太高了,要自己针对主题修改js。

    4. @zwwooooo
      要不我把我的主题发给你?你给看看?

    5. zwwooooo says:

      @第六空间
      最近忙,没时间啊,付费的一堆,忙完再看看吧

  18. zigbee says:

    这样也行,记下了。

    1. zwwooooo says:

      @zigbee
      玩玩而已,不是最好的解决方法

  19. lifishake says:

    没想到竟然给了你这样的灵感.php里的echo这样就不是echo到页面上,而是echo到函数里了吧?
    我觉得你的方法不错哦,所谓异步,也就是全部页面加载完成之后吧,就是说,如果页面加载顺利就没影响,如果有死链之类的就无法调用,是吧?

    1. zwwooooo says:

      @lifishake
      函数里面的echo是这个函数的输出内容。
      这个方法用来做异步加载好,用来取值的确不太适合。

发表评论

昵称 *

网址

B em del U Link Code Quote