Xiaopei's DokuWiki

These are the good times in your life,
so put on a smile and it'll be alright

User Tools

Site Tools


it:wordpress

WordPress

使用 php -S php 5.4 buildin 服务器

router.php
<?php
 
$root = $_SERVER['DOCUMENT_ROOT'];
chdir($root);
$path = '/'.ltrim(parse_url($_SERVER['REQUEST_URI'])['path'],'/');
set_include_path(get_include_path().':'.__DIR__);
if(file_exists($root.$path))
{
if(is_dir($root.$path) && substr($path,strlen($path) - 1, 1) !== '/')
$path = rtrim($path,'/').'/index.php';
if(strpos($path,'.php') === false) return false;
else {
chdir(dirname($root.$path));
require_once $root.$path;
}
}else include_once 'index.php';

可将此文件放到 WP 目录下,再 $ php -S localhost:9393 -t /path/to/wordpress router.php 运行

Run Wordpress Locally Using PHP's Built-In Web Server

develop

开发 theme / plugin 时, 应使用以下 plugins

  1. Debug Bar 查看 DB Query 及更多 debug 信息
  2. Debug Queries 只能查 DB Query, 样式不错
  3. ProssPress 的一些 plugin review:
    1. Theme-Check, 激活后, 可在 appearance 中找到 theme check 的功能

开发 theme

下图描述了访问某地址时会用到哪个模板文件:

WordPress template hierarchy

如果要新做一个 theme, 可考虑使用 framework, 如 Automattic/_s

开发 widget

wordpress(至少在 3.5 中)支持 2 种注册 widget 的方法:

  1. register_widget(), 适合管理员有自定义需要的 widget, 如“显示任意文本”, 文档: Widgets API « WordPress Codex
  2. wp_register_sidebar_widget(), 适合无自定义需要的 widget, 如“站点搜索”, 文档: Function Reference/wp register sidebar widget « WordPress Codex

自定义 page

模板中可通过自定义 page template 的方法自定义 page

  1. 在模板中新建 php 文件, 只要文件最前有 Template Name 的注释, 该文件就会被当做一个 page template(post 没有 template, post 的类型是 format)
    whatever_page.php
    <?php
    /*
    Template Name: Whatever
    */
    ?>
  2. 新建 page(设置 page template)
  3. 将 page 加到 menu 中

tips

Network 网络/多站点

将独立域名指向 network 中的一个子站点

用这个插件: WordPress › WordPress MU Domain Mapping « WordPress Plugins

  1. 修改好 domain 的 DNS 设置
  2. 修改好 domain 在 web 服务器的 VM 设置
  3. 按 管理网络 » 设置 » Domain Mapping 的说明, 修改服务器中 wp 的文件
  4. 在 管理网络 » 设置 » Domain Mapping 中输入服务器 IP
  5. 在站点的 工具 » Domain Mapping 中设置 domain
  6. 若需取消 mapping, 在 管理网络 » 设置 » Domains 中删除记录即可

隐藏 root 站点

在 root 站点使用以下 plugin:

my-redirect.php
<?php
/**
 * @package My_Redirect
 * @version 0.1
 */
/*
Plugin Name: My Redirect
Plugin URI: http://wordpress.stackexchange.com/questions/52298/hide-root-site-in-multisite-install
*/
add_action('template_redirect', 'wpse52298_redirect');
/*
 * Redirects all requests to the front end to another site
 *
 *
 * @uses wp_redirect
 */
function wpse52298_redirect()
{
    // change this
    $to = 'http://www.example.com/';
 
    wp_redirect(esc_url($to));
    exit();
}

domain mapping - Hide root site in Multisite install - WordPress Answers

WordPress 数据库维护时常用到 12 个 SQL 语句

WordPress 数据库维护时常用到 12 个 SQL 语句

  • 直接在数据库中修改密码
    UPDATE 'wp_users' SET 'user_pass' = MD5('PASSWORD') WHERE 'user_login' ='admin' LIMIT 1;
  • 将日志从一个作者转移到另外一个
    UPDATE wp_posts SET post_author=NEW_AUTHOR_ID WHERE post_author=OLD_AUTHOR_ID;
  • 批量删除垃圾留言
    DELETE FROM wp_comments WHERE comment_approved = '0';
  • 获取所有留言者的邮件地址
    SELECT DISTINCT comment_author_email FROM wp_comments;
  • 关闭旧日志留言功能
    # 关闭留言:
    UPDATE wp_posts SET comment_status = 'closed' WHERE post_date < '2009-01-01' AND post_status = 'publish';
     
    # 关闭Trackback:
    UPDATE wp_posts SET ping_status="closed" WHERE post_date < '2009-01-01' AND post_status = 'publish';
  • 删除所有 url 含有特定字符串的留言
    DELETE FROM wp_comments WHERE comment_author_url LIKE "%viagra%" ;
  • 查找和替换数据
    # 替换日志内容中字符串:
    UPDATE wp_posts SET post_content = REPLACE( post_content, 'string_to_find', 'string_to_replace' ) ;
     
    # 将某个留言者地址替换下:
    UPDATE wp_comments SET comment_author_url = REPLACE( comment_author_url, 'http://oldurl.com', 'http://newurl.com' );
     
    # 留言者邮箱:
    UPDATE wp_comments SET comment_author_email = REPLACE( comment_author_email, 'old-email@address.com', 'new-email@address.com' );
     
    # 还有一个 WordPress 插件 SEARCH & REPLACE 还提供一个后台让你更加容易进行批量替换。
  • 一次把所有插件都停了
    UPDATE wp_options SET option_value = '' WHERE option_name = 'active_plugins';
  • 删除数据库中日志修订记录和其相关的 post_meta 数据
    DELETE a,b,c FROM wp_posts a WHERE a.post_type = 'revision' LEFT JOIN wp_term_relationships b ON (a.ID = b.object_id) LEFT JOIN wp_postmeta c ON (a.ID = c.post_id);
    # 当然你还可以:彻底屏蔽日志修订功能。
  • 查找没用的标签
    SELECT * FROM wp_terms wt INNER JOIN wp_term_taxonomy wtt ON wt.term_id=wtt.term_id WHERE wtt.taxonomy='post_tag' AND wtt.count=0;
  • 删除所有标签
    DELETE a,b,c
    FROM
    	DATABASE.prefix_terms AS a
    	LEFT JOIN DATABASE.prefix_term_taxonomy AS c ON a.term_id = c.term_id
    	LEFT JOIN DATABASE.prefix_term_relationships AS b ON b.term_taxonomy_id = c.term_taxonomy_id
    WHERE (
    	c.taxonomy = 'post_tag' AND
    	c.count = 0
    	);
    # 注:上面 SQL 除了删除标签,还删除了所有标签和标签和日志关联的关系。
  • 列出没用的 post meta
    SELECT * FROM wp_postmeta pm LEFT JOIN wp_posts wp ON wp.ID = pm.post_id WHERE wp.ID IS NULL;

apache

## A defined Virtual host

NameVirtualHost *:80

<VirtualHost *:80>
VirtualDocumentRoot /usr/share/wordpress/
ServerName blog.example.com
ErrorLog /var/log/apache2/wp-error.log
TransferLog /var/log/apache2/wp-access.log
</VirtualHost>

## Without using Virtual host, hosted off /blog

Alias /blog /usr/share/wordpress
<Directory /usr/share/wordpress>
  Options FollowSymLinks
  AllowOverride Limit Options FileInfo
  DirectoryIndex index.php
</Directory>

# Tips

If permalinks or rewrite is not working you might need:

<Directory />
   Options FollowSymLinks
   AllowOverride All
</Directory>

If NameVirtualHost *:80 is not working, you probably need to replace the * with
the actual IP or hostname of your server.

child theme

style.css
/*
Theme Name:     Twenty Eleven Child
Theme URI:      http://example.com/
Description:    Child theme for the Twenty Eleven theme 
Author:         Your name here
Author URI:     http://example.com/about/
Template:       twentyeleven
Version:        0.1.0
*/
 
 
@import url("../twentyeleven/style.css");

Coding Standards

plugins

多说

qtranslate

Posted on %A %B %e%q, %Y , 至少到 2.5.32 仍存在的一个 bug 1), 解决方法如下:

wp-content/plugins/qtranslate/qtranslate_utils.php
@@ -148,7 +148,10 @@ function qtrans_convertDateFormatToStrftimeFormat($format) {
-       $date_parameters[] = '#%#';                     $strftime_parameters[] = '%%';
+       $date_parameters[] = '#%#';                     $strftime_parameters[] = '%';

custom fields plugins

contact form 7

  • 可生成联系表单, 访客填写后会发邮件
  • 若系统无 sendmail, 可使用插件 Configure SMTP 发信, 虽然 smtp 的插件不少, 但至少这个是和 contact form 7 兼容的.

tips

常见问题

自动更新

Automatic Update « Updating WordPress « WordPress Codex

自动更新需要注意 WP 的所有文件都得 owned and writeble by httpd user

themes

my favorites

更换站点地址

Changing The Site URL « WordPress Codex

  • 方法 1: 在 wp-config.php 中硬编码
    define('WP_HOME','http://example.com');
    define('WP_SITEURL','http://example.com');
  • 方法 2: 直接修改数据库
    mysql> update wp_options set option_value="http://example.com" where option_name like "siteurl" or option_name like "home";

修改后需注意 wp 目录中的 .htaccess, 有可能需要修改 RewriteBase 等配置.

WP 网络修改域名 changing WP network domain

Moving WordPress Multisite « Moving WordPress « WordPress Codex

  1. edit the .htaccess and wp-config.php
  2. manually edit(replace) the database
    1. wp_site
      UPDATE wp_site SET DOMAIN='new.example.com';
    2. wp_sitemeta
      UPDATE wp_sitemeta SET meta_value='new.example.com' WHERE meta_key='siteurl';
    3. wp_blogs
      UPDATE wp_blogs SET DOMAIN='new.example.com';
    4. wp_x_options
      UPDATE wp_x_options SET option_value=REPLACE(option_value, 'old.example.com', 'new.example.com') WHERE option_value LIKE '%old.example.com%';
      1. home
      2. siteurl
      3. fileupload_url

修改后出现 Error Establishing a Database Connection

Does the problem occur for /wp-admin/ as well?

Custom Post Type

slug

增加 post_type 后, 其下的某文章可按 URL 形如 http://example.com/product/%product_name% 访问到. 但尝试访问形如 http://example.com/product/ 的链接确只能得到 404. 若想要访问

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,
			'rewrite' => array('slug' => 'products')
		)
	);
}

列表显示

<ul class="submenu">
   <?
   // here it's the query for my custom post type - Movies
   $querycp = array( 'post_type'=>'Movies','posts_per_page' => -1 );
   query_posts($querycp);
   while (have_posts()) : the_post();
   // here we check what's the post custom taxonomy, if it is the language we need
   $terms = get_the_terms(get_the_ID(), 'movies_cat');
    foreach ( $terms as $term ) {
        $catref = $term->slug;
    }
   //
     if($catref=="english"):
     ?>
      <li><a href="<?=get_permalink()?>" title=""><?=get_the_title()?></a></li>
     <?
     endif;
   endwhile;
    ?>
</ul>
it/wordpress.txt · Last modified: 2014/10/30 17:17 by admin