WordPress For SAE 移植全攻略

66

天津11选5走势图分析 www.lixcgb.com.cn 你跟朽木一樣把博客搭建在SAE上嗎?
你還在用應用商店陳舊的WordPress版本嗎?

wordpress

那么這篇文章你要好好讀一下了。

你不需要懂什么技術,只要按照我寫的一步步操作就可以了。

第一步 配置文件

SAE是沒有寫權限的,所以wp-config.php是我們要提前準備好的。

1
2
3
4
5
6
7
8
9
10
11
/** WordPress數據庫的名稱 */
define('DB_NAME', SAE_MYSQL_DB);
 
/** MySQL數據庫用戶名 */
define('DB_USER', SAE_MYSQL_USER);
 
/** MySQL數據庫密碼 */
define('DB_PASSWORD', SAE_MYSQL_PASS);
 
/** MySQL主機名 */
define('DB_HOST', SAE_MYSQL_HOST_M.':'.SAE_MYSQL_PORT);

在根目錄新建一個config.yaml,內容如下

handle:
  - rewrite:if (!is_file() && !is_dir() && path ~ "^/(.*)") goto "index.php/$1"

第二步 附件/圖片無法上傳修正

SAE沒有寫權限,但是它為我們提供了一個Storage來上傳附件,先到SAE的后臺新建一個Domain,我的是blog

打開wp-include/funciton.php文件,找到$baseurl = $url;這句代碼,在它后面添加$basedir = $dir = 'saestor://blog/blog-uploads';

這里的blog-uploads是朽木博客的附件文件夾,WordPress默認的是wp-content/uploads,這里可以根據自己喜好來填寫,但是必須要和WordPress后臺的默認上傳路徑保持一致?;剮枰膠筇ㄐ薷奈募耐暾?URL 地址為你的Storage最終地址,例如我的 //xiumu-blog.stor.sinaapp.com/blog-uploads

第三步 禁用WordPress自動更新

既然SAE沒有提供修改代碼的權限,那么更新對新手用戶來說顯得太“奢侈”了,而且這個功能會無端的消耗掉你的豆豆,特別是3.7以后新增的自動更新功能

編輯wp-include/update.php,移到底部,你會發現一大串的add_action(....);,把它們全部刪除然后再尾部添加

 add_action( 'load-update-core.php', 'wp_version_check' );
 add_action( 'load-update-core.php', 'wp_update_themes' );
 add_action( 'load-update-core.php', 'wp_update_plugins' );

這樣只有你手動去點擊 儀表盤->更新的時候,才會檢測更新。

第四步 屏蔽WordPress權限檢查

這好像是3.5才新加入的代碼,用來判斷上傳文件的執行權限來提高安全性,SAE根本無需考慮代碼安全性,它們的存在卻會讓系統報錯。

1
2
3
4
		// Set correct file permissions
		$stat = stat( dirname( $new_file ));
		$perms = $stat['mode'] & 0000666;
		@ chmod( $new_file, $perms );

找到上面這段代碼,消滅它們,分別在wp-admin/include/file.php,wp-include/class-wp-image-editor-gd.php,wp-includes\class-wp-image-editor-imagick.php這幾個文件中 ,其他肯定還有,但是目前沒有發現他們對系統有什么影響,只要找到這3處,刪除代碼即可。

第五步 修正WordPress自帶縮略圖裁剪

在WordPress后臺設置了圖片尺寸后,如果上傳的圖片大于這個尺寸,就會自動裁剪,而在SAE上卻不會,翻來覆去的找了下原因,終于讓我找到了。

罪魁禍首在imagepng imagejpeg不能用Wrappers

所以我們要修改縮略圖的輸出方式,打開wp-include/class-wp-image-editor.php找到如下一句代碼

$result = call_user_func_array( $function, $arguments );

修改為

1
2
3
4
5
6
7
		//$result = call_user_func_array( $function, $arguments );
		$arguments_temp = $arguments;
		$arguments_temp[1] = SAE_TMP_PATH.'image_temp.dat';
		$result = call_user_func_array( $function, $arguments_temp );
		if ($result) {
			file_put_contents($arguments[1],file_get_contents(SAE_TMP_PATH.'image_temp.dat'));
		}

到這里,WordPress For SAE 的移植已經基本結束了。

進階

開啟SAE的MemoCache緩存 新建wp-content/object-cache.php文件,內容如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
<?php
/*
Plugin Name: Memcached
Description: Memcached backend for the WP Object Cache.
Version: 2.0.1
Plugin URI: //wordpress.org/extend/plugins/memcached/
Author: Ryan Boren, Denis de Bernardy, Matt Martz
 
Install this file to wp-content/object-cache.php
*/
 
function wp_cache_add($key, $data, $flag = '', $expire = 0) {
	global $wp_object_cache;
 
	return $wp_object_cache->add($key, $data, $flag, $expire);
}
 
function wp_cache_incr($key, $n = 1, $flag = '') {
	global $wp_object_cache;
 
	return $wp_object_cache->incr($key, $n, $flag);
}
 
function wp_cache_decr($key, $n = 1, $flag = '') {
	global $wp_object_cache;
 
	return $wp_object_cache->decr($key, $n, $flag);
}
 
function wp_cache_close() {
	global $wp_object_cache;
 
	return $wp_object_cache->close();
}
 
function wp_cache_delete($id, $flag = '') {
	global $wp_object_cache;
 
	return $wp_object_cache->delete($id, $flag);
}
 
function wp_cache_flush() {
	global $wp_object_cache;
 
	return $wp_object_cache->flush();
}
 
function wp_cache_get($id, $flag = '') {
	global $wp_object_cache;
 
	return $wp_object_cache->get($id, $flag);
}
 
function wp_cache_init() {
	global $wp_object_cache;
 
	$wp_object_cache = new WP_Object_Cache();
}
 
function wp_cache_replace($key, $data, $flag = '', $expire = 0) {
	global $wp_object_cache;
 
	return $wp_object_cache->replace($key, $data, $flag, $expire);
}
 
function wp_cache_set($key, $data, $flag = '', $expire = 0) {
	global $wp_object_cache;
 
	if ( defined('WP_INSTALLING') == false )
		return $wp_object_cache->set($key, $data, $flag, $expire);
	else
		return $wp_object_cache->delete($key, $flag);
}
 
function wp_cache_add_global_groups( $groups ) {
	global $wp_object_cache;
 
	$wp_object_cache->add_global_groups($groups);
}
 
function wp_cache_add_non_persistent_groups( $groups ) {
	global $wp_object_cache;
 
	$wp_object_cache->add_non_persistent_groups($groups);
}
 
class WP_Object_Cache {
	var $global_groups = array ('users', 'userlogins', 'usermeta', 'site-options', 'site-lookup', 'blog-lookup', 'blog-details', 'rss');
 
	var $no_mc_groups = array( 'comment', 'counts' );
 
	var $autoload_groups = array ('options');
 
	var $cache = array();
	var $mc = array();
	var $stats = array();
	var $group_ops = array();
 
	var $cache_enabled = true;
	var $default_expiration = 0;
 
	function add($id, $data, $group = 'default', $expire = 0) {
		$key = $this->key($id, $group);
 
		if ( in_array($group, $this->no_mc_groups) ) {
			$this->cache[$key] = $data;
			return true;
		} elseif ( isset($this->cache[$key]) && $this->cache[$key] !== false ) {
			return false;
		}
 
		$mc =& $this->get_mc($group);
		$expire = ($expire == 0) ? $this->default_expiration : $expire;
		$result = $mc->add($key, $data, false, $expire);
 
		if ( false !== $result ) {
			@ ++$this->stats['add'];
			$this->group_ops[$group][] = "add $id";
			$this->cache[$key] = $data;
		}
 
		return $result;
	}
 
	function add_global_groups($groups) {
		if ( ! is_array($groups) )
			$groups = (array) $groups;
 
		$this->global_groups = array_merge($this->global_groups, $groups);
		$this->global_groups = array_unique($this->global_groups);
	}
 
	function add_non_persistent_groups($groups) {
		if ( ! is_array($groups) )
			$groups = (array) $groups;
 
		$this->no_mc_groups = array_merge($this->no_mc_groups, $groups);
		$this->no_mc_groups = array_unique($this->no_mc_groups);
	}
 
	function incr($id, $n, $group) {
		$key = $this->key($id, $group);
		$mc =& $this->get_mc($group);
 
		return $mc->increment($key, $n);
	}
 
	function decr($id, $n, $group) {
		$key = $this->key($id, $group);
		$mc =& $this->get_mc($group);
 
		return $mc->decrement($key, $n);
	}
 
	function close() {
 
		foreach ( $this->mc as $bucket => $mc )
			$mc->close();
	}
 
	function delete($id, $group = 'default') {
		$key = $this->key($id, $group);
 
		if ( in_array($group, $this->no_mc_groups) ) {
			unset($this->cache[$key]);
			return true;
		}
 
		$mc =& $this->get_mc($group);
 
		$result = $mc->delete($key);
 
		@ ++$this->stats['delete'];
		$this->group_ops[$group][] = "delete $id";
 
		if ( false !== $result )
			unset($this->cache[$key]);
 
		return $result; 
	}
 
	function flush() {
		// Don't flush if multi-blog.
		if ( function_exists('is_site_admin') || defined('CUSTOM_USER_TABLE') && defined('CUSTOM_USER_META_TABLE') )
			return true;
 
		$ret = true;
		foreach ( array_keys($this->mc) as $group )
			$ret &= $this->mc[$group]->flush();
		return $ret;
	}
 
	function get($id, $group = 'default') {
		$key = $this->key($id, $group);
		$mc =& $this->get_mc($group);
 
		if ( isset($this->cache[$key]) )
			$value = $this->cache[$key];
		else if ( in_array($group, $this->no_mc_groups) )
			$value = false;
		else
			$value = $mc->get($key);
 
		@ ++$this->stats['get'];
		$this->group_ops[$group][] = "get $id";
 
		if ( NULL === $value )
			$value = false;
 
		$this->cache[$key] = $value;
 
		if ( 'checkthedatabaseplease' == $value )
			$value = false;
 
		return $value;
	}
 
	function get_multi( $groups ) {
		/*
		format: $get['group-name'] = array( 'key1', 'key2' );
		*/
		$return = array();
		foreach ( $groups as $group => $ids ) {
			$mc =& $this->get_mc($group);
			foreach ( $ids as $id ) {
				$key = $this->key($id, $group);
				if ( isset($this->cache[$key]) ) {
					$return[$key] = $this->cache[$key];
					continue;
				} else if ( in_array($group, $this->no_mc_groups) ) {
					$return[$key] = false;
					continue;
				} else {
					$return[$key] = $mc->get($key);
				}
			}
			if ( $to_get ) {
				$vals = $mc->get_multi( $to_get );
				$return = array_merge( $return, $vals );
			}
		}
		@ ++$this->stats['get_multi'];
		$this->group_ops[$group][] = "get_multi $id";
		$this->cache = array_merge( $this->cache, $return );
		return $return;
	}
 
	function key($key, $group) {	
		if ( empty($group) )
			$group = 'default';
 
		if ( false !== array_search($group, $this->global_groups) )
			$prefix = $this->global_prefix;
		else
			$prefix = $this->blog_prefix;
 
		return preg_replace('/\s+/', '', "$prefix$group:$key");
	}
 
	function replace($id, $data, $group = 'default', $expire = 0) {
		$key = $this->key($id, $group);
		$expire = ($expire == 0) ? $this->default_expiration : $expire;
		$mc =& $this->get_mc($group);
		$result = $mc->replace($key, $data, false, $expire);
		if ( false !== $result )
			$this->cache[$key] = $data;
		return $result;
	}
 
	function set($id, $data, $group = 'default', $expire = 0) {
		$key = $this->key($id, $group);
		if ( isset($this->cache[$key]) && ('checkthedatabaseplease' == $this->cache[$key]) )
			return false;
		$this->cache[$key] = $data;
 
		if ( in_array($group, $this->no_mc_groups) )
			return true;
 
		$expire = ($expire == 0) ? $this->default_expiration : $expire;
		$mc =& $this->get_mc($group);
		$result = $mc->set($key, $data, false, $expire);
 
		return $result;
	}
 
	function colorize_debug_line($line) {
		$colors = array(
			'get' => 'green',
			'set' => 'purple',
			'add' => 'blue',
			'delete' => 'red');
 
		$cmd = substr($line, 0, strpos($line, ' '));
 
		$cmd2 = "<span style='color:{$colors[$cmd]}'>$cmd</span>";
 
		return $cmd2 . substr($line, strlen($cmd)) . "\n";
	}
 
	function stats() {
		echo "<p>\n";
		foreach ( $this->stats as $stat => $n ) {
			echo "<strong>$stat</strong> $n";
			echo "<br/>\n";
		}
		echo "</p>\n";
		echo "<h3>Memcached:</h3>";
		foreach ( $this->group_ops as $group => $ops ) {
			if ( !isset($_GET['debug_queries']) && 500 < count($ops) ) { 
				$ops = array_slice( $ops, 0, 500 ); 
				echo "<big>Too many to show! <a href='" . add_query_arg( 'debug_queries', 'true' ) . "'>Show them anyway</a>.</big>\n";
			} 
			echo "<h4>$group commands</h4>";
			echo "<code>\n";
			$lines = array();
			foreach ( $ops as $op ) {
				$lines[] = $this->colorize_debug_line($op); 
			}
			print_r($lines);
			echo "</code>\n";
		}
 
		if ( $this->debug )
			var_dump($this->memcache_debug);
	}
 
	function &get_mc($group) {
		if ( isset($this->mc[$group]) )
			return $this->mc[$group];
		return $this->mc['default'];
	}
 
	function failure_callback($host, $port) {
		//error_log("Connection failure for $host:$port\n", 3, '/tmp/memcached.txt');
	}
 
	function __construct() {
		self::WP_Object_Cache();
	}
 
	function WP_Object_Cache() {
		global $memcached_servers;
 
		if ( isset($memcached_servers) )
			$buckets = $memcached_servers;
		else
			$buckets = array('127.0.0.1');
 
		reset($buckets);
		if ( is_int(key($buckets)) )
			$buckets = array('default' => $buckets);
 
		foreach ( $buckets as $bucket => $servers) {
			$this->mc[$bucket] = memcache_init();
		}
 
		global $blog_id, $table_prefix;
		$this->global_prefix = ( is_multisite() || defined('CUSTOM_USER_TABLE') && defined('CUSTOM_USER_META_TABLE') ) ? '' : $table_prefix;
		$this->blog_prefix = ( is_multisite() ? $blog_id : $table_prefix ) . ':';
 
		$this->cache_hits =& $this->stats['get'];
		$this->cache_misses =& $this->stats['add'];
	}
}
?>

移植hyper-cache緩存插件 SAE的MC緩存是比較吃豆豆的,而相比較新浪自主研發的KVDB的價格卻少得可憐,所以我們可以把hyper-cache的緩存寫入到KVDB中去,KVDB中只有兩個屬性,有點類似于Array,既鍵名與鍵值,我們可以通過改寫SAE提供的SaeKVClient類來給數據加入一個時間戳,用來判斷緩存到期時間。

這個類是從官方論壇收集的,根據需要修改了一下,源碼如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
<?php
class MyKVClient extends SaeKVClient
{
    private $_inited = false;
    /*
 
    */
    public function init()
    {
        $_inited = true;
        return parent::init();
    }
    public function set($k, $v=null, $timeout = 0)
    {
        if([email protected]$_inited)
        {
            $this->init();
        }
        if(!empty($timeout))
        {
            $timeout = time()+$timeout;
        }
        $v = array('d'=>$v,'t'=>$timeout);
        return parent::set($k,$v);
    }
    public function get($k)
    {
        if([email protected]$_inited)
        {
            $this->init();
        }
        $v = parent::get($k);
        if($v['t']<time() && !empty($v['t']))
        {
            $this->delete($k);
            return false;
        }
        return $v['d'];
    }
    public function gett($k)
    {
        $v = parent::get($k);
        return $v['t'];
    }
    public function delete($k)
    {
        if([email protected]$_inited)
        {
            $this->init();
        }
        return parent::delete($k);
    }
    public function mget($ks)
    {
        if([email protected]$_inited)
        {
            $this->init();
        }
        $v = parent::mget($ks);
        if(!empty($v))
        {
            foreach($v as $key=>$val)
            {
                if($val['t']<time() && !empty($val['t']))
                {
                        unset($v[$key]);
                        $this->delete($key);
                }
                else
                {
                        $v[$key] = $val['d'];
                }
            }
        }
        return $v;
    }
    public function pkrget($k,$c=1,$start_key=NULL)
    {
        if([email protected]$_inited)
        {
            $this->init();
        }
        $v = parent::pkrget($k,$c,$start_key);
        if(!empty($v))
        {
            foreach($v as $key=>$val)
            {
                if($val['t']<time() && !empty($val['t']))
                {
                    unset($v[$key]);
                    $this->delete($key);
                }
                else
                {
                    $v[$key] = $val['d'];
                }
            }
        }
        return $v;
    }
    public function pkrdelete($k,$c=1)
    {
        if([email protected]$_inited)
        {
            $this->init();
        }
        $v = parent::pkrget($k,$c);
        if(!empty($v))
        {
            foreach($v as $key=>$val)
            {
                $this->delete($key);
            }
        }
        return;
    }
}

如果在非SAE環境中安裝hyper-cache,它會在wp-content目錄生成一個advanced-cache.php來保存配置,最好還是能在其他環境中配置好,然后再把這個文件上傳到SAE來,設置$hyper_cache_path為一個前綴,而不是路徑,例如$hyper_cache_path = 'hypercache_';,這樣我們可以通過pkrgetpkrdelete來操作hyper-cache的緩存。

options.php有個777的提示需要屏蔽,其他修改都在cache.php和plugin.php中,具體修改太過繁瑣就不一一貼出來了。

數據庫緩存插件 db-cache-reloaded-fix MYSQL也是資源大戶,能省則省,同 hyper-cache 一樣 db-cache-reloaded-fix 在非SAE環境中也會向wp-content中寫入配置文件,一個db-config.ini,一個db.php。

db.php中define( 'DBCR_CACHE_DIR', DBCR_PATH.'/cache' );也最好修改成前綴,用來識別,我的是define( 'DBCR_CACHE_DIR', 'db-cache-reloaded-fix' );

其他的修改都在db-functions.php里了。

好累,先到這里吧。

共 66 條評論

  1. 回復

    朽木大哥,HyperCache我已經試過可以在WP4.1+SAE上運行了,DB CACHE RELOADED FIX是不支持WP 4.X了對嗎?

  2. 回復

    還需要到后臺修改文件的完整 URL 地址為你的Storage最終地址,例如我的 //xiumu-blog.stor.sinaapp.com/blog-uploads,博主好,原諒小白前來問這個簡單的問題,這一句實在是沒看懂,還請博主多多指教下。

    • 回復

      沒什么印象了,你到后臺設置->多媒體->文件的完整URL地址 應該是指的這個吧

  3. 回復

    第二步 “修正了 附件/圖片無法上傳”
    按教程修改了這里后,我通過程序接口也能夠直接保存圖片到storage里了哈?

  4. 回復

    ?n peut vous dire ?ue ce n’est pas faux !!

  5. 回復

    唉,為什么我的照你文章里的改完后,上傳是可以了,就是圖片無法在文章中顯示,好像是被剪切了!

    • 回復

      你仔細對比下 看看問題是不是出在文中 “自帶縮略圖裁剪” 的部分,哦對了,當時寫這篇文章的時候用的是3.5.1

      • 回復

        朽木大大那你出過一個最新的版本的WordPress移植方法呀!好期待!望朽木早出!

  6. 回復

    我完全按照上面的都改好了代碼,上傳圖片也成功了,但就是不能顯示圖片!查看原圖倒是可以,好像就是不顯示被自動剪切過的圖片,這是怎么回事兒呀?

  7. 回復

    WordPress是個不錯的博客系統,但現在似乎博客不太用了。我現在專們使用Drupal,這是很好的一個CMF。

  8. 回復

    用的最新版本的WP,但是按照第五步“修正WordPress自帶縮略圖裁剪”那樣做的話就會導致無法生產縮略圖,不知為何。。

  9. 回復

    hyper-cache緩存插件,求啊,跪求啊,真心需要啊,沒認證沒錢,豆豆傷不起啊啊。求一份改好的啊,拜謝了啊

  10. 回復

    求博主分享下db-cache-reloaded-fix 和 hyper-cache 這兩個插件的SAE版把….萬謝!

  11. 回復

    有沒有更新,急需SAE靜態緩存插件~

  12. 回復

    寫這么多辛苦了!

  13. 回復

    hyper-cache緩存插件 啥時候能放出來呢~

  14. 回復

    也遇到upload問題,按這個攻略解決了 //tahoroom.sinaapp.com/archives/2671.html

  15. 回復

    繼續求db-cache-reloaded-fix 和 hyper-cache 這兩個插件的SAE版

  16. 回復

    按你這個修改了,但是還是上傳不了圖片,提示沒有目錄權限

  17. 回復

    $basedir = $dir = ‘saestor://blog/blog-uploads’;
    這個目錄 沒太明白???

  18. 回復

    朽木同學 把 db-cache-reloaded-fix 和 hyper-cache 這兩個插件的SAE版共享出來吧,哈,看你博客已經用上了。

    • 回復

      過兩天有時間了吧,這段太忙了,我在hyper-cache寫了很多其他東西,還得整理下.

  19. 回復

    為什么我按照你的第二步操作,升級wordpress后,上傳文件提示:
    無法建立目錄 uploads/2013/05。有沒有上級目錄的寫權限?saestor://wordpress/uploads/2013/05 ??!
    $uploads[‘path’] 沒有解析嗎

    • 回復

      是否在SAE的控制面板 建了名為 wordpress的 Storage Domain

      • 回復

        1、Storage Domain 有的“ wordpress public public 否 管理 修改屬性 刪除”;
        2、提示的路徑是:/data*/www/htdocs/***/f***y/*/wp-content/uploads/2013/05;
        3、functions.php 中我加的是:
        // for SAE
        $dir = ‘saestor://wordpress/uploads’;
        $url = ‘//’ . $_SERVER[‘HTTP_APPNAME’] . ‘-wordpress.stor.sinaapp.com/uploads’;
        4、錯誤提示:無法建立目錄 wp-content/uploads/2013/05。有沒有上級目錄的寫權限?

      • 回復

        路徑是不是有問題

      • 回復

        問題基本可以解決了,找到 wp_mkdir_p 方法,讓他通過寫權限檢測,直接return true,就不會提示錯誤了!

        • 回復

          恩,解決就好,不過很納悶,我移植的時候并沒有處理這個,沒發現你說的錯誤,現在這個博客就是在SAE,文章中記錄的已經是我所有的筆記了

        • 回復

          怎么解決好的?

        • 回復

          return true 怎么寫的

          • //ww2.sinaimg.cn/large/5e22416bgw1e9enleh7uuj20f605ijru.png

    • 回復

      嗯,確實是不能成功上傳,也是wordpress3.5.1的版本。

      • 回復

        樓上說的 wp_mkdir_p 可以試者屏蔽下

        • 回復

          怎么屏蔽該方法 ?沒有找到在那個文件下 請指教

          • 在wp-includes/functions.php文件中,找到wp_mkdir_p在方法體內第一句加,我是這么做的

        • 回復

          不會屏蔽 可以說具體些吧 也遇到“無法建立目錄 wp-content/uploads/2013/05。有沒有上級目錄 ”的問題了

          • .. 問題是,我沒有遇到這個問題. 不知道怎么下手啊.

          • 在wp-includes/functions.php文件中,找到wp_mkdir_p在方法體內第一句加,我是這么做的

  20. 回復

    后臺沒有找到修改圖片的地方呢?已經修改代碼了,就是不知道怎么把后臺也改好

  21. 回復

    db-cache-reloaded-fix 這個移植到SAE上具體要修改哪些呢?博主指教到底吧,額~

  22. 回復

    請教朽木,sae的版本切換功能很好,自己的vps可以實現嗎?

  23. 回復

    一直用的某免費空間,主機在國外,偶爾會down掉,有空研究一下遷到SAE上。

    • 回復

      如果有備案的話,SAE還是不錯的,但是沒有備案的話SAE國外中轉速度貌似不怎么地

      • 回復

        我一直在糾結用阿里云還是SAE

        • 回復

          他們兩個不一樣,SAE是云計算,阿里云某種程度上其實就是自帶CDN的VPS

          • 3Q,決定采用阿里云

  24. 回復

    朽木大哥你好,有點問題請求賜教!加我QQ386630909詳聊!

  25. 回復

    SAE的豆豆早就被我自然浪費光光了,so……

  26. 回復

    朽木大哥,說實話,沒太看懂…. 囧……話說那天我試著移至了一個到BAE上,對了,您頁面上方飄過云彩的效果很有意思啊

發表評論

您的郵箱不會公開,當您的評論有新的回復時,會通過您填寫的郵箱向您發送評論內容。 必填字段 *

為何看不到我發布的評論?

正在提交, 請稍候...