作者归档:MiMi

在WordPress中创建自定义的文章类型

例如我想创建一个Events类型,用来发布企业活动事件,其实异常简单,我们分三步来操作:

一、创建Events类型:
编辑functions.php 文件,插入以下代码:

add_action('init', 'register_events');

function register_events() {
register_post_type('events', array(
'labels' => array(
'name' => 'Events',
'singular_name' => 'Event',
'add_new' => 'Add Event',
'add_new_item' => '',
'edit_item' => 'Edit Event',
'new_item' => 'New Event',
'view_item' => 'See Event',
'search_items' => 'Search in Event',
'not_found' => 'No Event',
'not_found_in_trash' => 'No Event'
),
'public' => true,
'taxonomies' => array('category'),
'supports' => array('title','editor','excerpt','thumbnail')
));
}

二、定义Events类型的显示模板:
把single.php复制并命名为single-events.php,自定义HTML显示方式。

三、创建Events文章的列表页面:
1. 创建模板文件page-events.php,插入以下代码:

<?php
/***
Template Name: Events
*/
get_header(); ?>
<?php query_posts(array('post_type'=>'events')); ?>
<?php if ( have_posts() ) while ( have_posts() ) : the_post(); ?>
<?php endwhile; ?>
<?php get_footer(); ?>

2. 创建一个page页面,并选择模板为Event。

我的青春无处安放

我把爱情给了青春
却无处安放我的青春
于是我挥霍着
直到无力承担

我把青春给了自由
却无处放纵我的自由
于是我吝啬着
直到青春流走

肆虐或狂躁
都让我愤怒
挫折和自嘲
却让我清醒

要用双手撑开这天
再来一场滂沱暴雨
将我冲刷

迎接我的是
一个全新的世界
和彩虹下漫天的阳光

CSS Hack for IE

每次解决CSS兼容性问题都要问度娘,我那么懒,怎能行呢。

所以亲测了一些粗暴有效的CSS Hack,以后问自己就行了。

CSS Hack IE6 IE7 IE8 IE9 e.g.
_ × × × _color:red;
* × × *color:red;
× × color:red;
9 color:red9;

从wordpress分类列表的widget中移除某个分类的插件

WordPress的分类小工具会把所有的分类都显示出来,
有时候我们只想显示其中的几个分类,或者隐藏某个分类。
对于这种需求,可以使用wp_list_categories($args)这个模板标签来控制它。

例如只想显示ID为1、3、5的分类:
wp_list_categories('include=1,3,5');

不显示ID为2、4的分类且显示每个分类的日志数:
wp_list_categories('exclude=2,4&show_count=1');

详细说明请参考官方文档:
http://codex.wordpress.org/Template_Tags/wp_list_categories

由于某种原因,我不能直接在模板文件中使用wp_list_categories,
只好把它做成插件的形式使用,翻了下官方的API,
发现wp-includes/default-widgets.php中有个WP_Widget_Categories类是控制分类小工具输出的,
直接毫不犹豫的Copy出来修改wp_list_categories函数,按照插件机制,做成小插件。
以下是插件代码:(也可以从这里下载)

<?php
/*
* Plugin Name: Categories Widget Exclude ID
* Plugin URI: http://mimiz.cn
* Description: A simple plugin allow you remove some of the categories from categories widget.
* Author: Zhang Cheng
* Version: 0.1
* Author URI: http://mimiz.cn
*/
class limited_catagories_list_widget extends WP_Widget {

private $_exclude_id = ‘1’; // Categories ID, you want to remove.

function __construct() {
$widget_ops = array( ‘classname’ => ‘widget_categories’, ‘description’ => __( “A list or dropdown of categories” ) );
parent::__construct(‘categories’, __(‘Categories’), $widget_ops);
}

function widget( $args, $instance ) {
extract( $args );

$title = apply_filters(‘widget_title’, empty( $instance[‘title’] ) ? __( ‘Categories’ ) : $instance[‘title’], $instance, $this->id_base);
$c = ! empty( $instance[‘count’] ) ? ‘1’ : ‘0’;
$h = ! empty( $instance[‘hierarchical’] ) ? ‘1’ : ‘0’;
$d = ! empty( $instance[‘dropdown’] ) ? ‘1’ : ‘0’;

echo $before_widget;
if ( $title )
echo $before_title . $title . $after_title;

$cat_args = array(‘orderby’ => ‘name’, ‘show_count’ => $c, ‘hierarchical’ => $h);

if ( $d ) {
$cat_args[‘show_option_none’] = __(‘Select Category’);
wp_dropdown_categories(apply_filters(‘widget_categories_dropdown_args’, $cat_args));
?>

/* 0 ) {
location.href = “/?cat=”+dropdown.options[dropdown.selectedIndex].value;
}
}
dropdown.onchange = onCatChange;
/* ]]> */

<?php
} else {
?>
<ul>
<?php
$cat_args[‘title_li’] = ”;
$cat_args[‘exclude’] = $this->_exclude_id;
wp_list_categories(apply_filters(‘widget_categories_args’, $cat_args));
?>
</ul>
<?php
}

echo $after_widget;
}

function update( $new_instance, $old_instance ) {
$instance = $old_instance;
$instance[‘title’] = strip_tags($new_instance[‘title’]);
$instance[‘count’] = !empty($new_instance[‘count’]) ? 1 : 0;
$instance[‘hierarchical’] = !empty($new_instance[‘hierarchical’]) ? 1 : 0;
$instance[‘dropdown’] = !empty($new_instance[‘dropdown’]) ? 1 : 0;

return $instance;
}

function form( $instance ) {
//Defaults
$instance = wp_parse_args( (array) $instance, array( ‘title’ => ”) );
$title = esc_attr( $instance[‘title’] );
$count = isset($instance[‘count’]) ? (bool) $instance[‘count’] :false;
$hierarchical = isset( $instance[‘hierarchical’] ) ? (bool) $instance[‘hierarchical’] : false;
$dropdown = isset( $instance[‘dropdown’] ) ? (bool) $instance[‘dropdown’] : false;
?>
<p><label for=”<?php echo $this->get_field_id(‘title’); ?>”><?php _e( ‘Title:’ ); ?></label>
<input class=”widefat” id=”<?php echo $this->get_field_id(‘title’); ?>” name=”<?php echo $this->get_field_name(‘title’); ?>” type=”text” value=”<?php echo $title; ?>” /></p>

<p><input type=”checkbox” class=”checkbox” id=”<?php echo $this->get_field_id(‘dropdown’); ?>” name=”<?php echo $this->get_field_name(‘dropdown’); ?>”<?php checked( $dropdown ); ?> />
<label for=”<?php echo $this->get_field_id(‘dropdown’); ?>”><?php _e( ‘Display as dropdown’ ); ?></label><br />

<input type=”checkbox” class=”checkbox” id=”<?php echo $this->get_field_id(‘count’); ?>” name=”<?php echo $this->get_field_name(‘count’); ?>”<?php checked( $count ); ?> />
<label for=”<?php echo $this->get_field_id(‘count’); ?>”><?php _e( ‘Show post counts’ ); ?></label><br />

<input type=”checkbox” class=”checkbox” id=”<?php echo $this->get_field_id(‘hierarchical’); ?>” name=”<?php echo $this->get_field_name(‘hierarchical’); ?>”<?php checked( $hierarchical ); ?> />
<label for=”<?php echo $this->get_field_id(‘hierarchical’); ?>”><?php _e( ‘Show hierarchy’ ); ?></label></p>
<?php
}

}

function register_category_exclude_widget(){
register_widget(‘limited_catagories_list_widget’);
}

add_action(‘widgets_init’, ‘register_category_exclude_widget’);

?>

Zend Studio 9.0.1 使用感受及破解注册方法

Zend Studio 9 发布已经有一段时间了,今天抽空研究一下。

先看官网的介绍:http://www.zend.com/en/products/studio/studio-whats-new

新特性包括:
1. Git and GitHub support (Git和GitHub的支持)
2. Deep cloud integration (深度云集成)
3. Creation of deployment packages (部署包的创建)
4. Much faster startup and running, much smaller footprint (更快的启动和运行速度,更少的资源占用)

注意亮点在第四条,官网上说,启动速度提高了67%,磁盘暂用率降低了40%。
当我看到这里,瞬间我就流泪了。对于现在正用的ZS8(优化后),
每次启动2分钟,内存占用500M,如果再开一个firebug,伤不起啊伤不起。
ZS9的出现,就像黑夜中的烛光,黎明中的曙光,乌云散尽的太阳,光芒万丈哇。

20120111 update
geekso.com上面找到了最新的破解方法:
1. 下载ZendStudio9.0.1破解文件:com.zend.php.core_9.0.1.201112141951.jar
2. 复制到plugins目录下覆盖同名文件。
3. 启动ZS9,输入License Key:
34E606CF10C3E4CF202ABCEAA9B0B7A64DD2C5862A514B944AAAB38E3EB8A5F2CD735A2AB4CF9B952590EFA62BA0AB2B3E5D99C33C55309EE143165AC7F1817D626574615F3B32312F31312F323031313B392E303B3030313B313B3330
4. 查看菜单 Help -> About Zend Studio 过期时间变为9999年说明破解成功。

配置 WordPress 网络(多站点)功能 及 域名映射

自从Wordpress 3.0开始,新增了很多令人惊喜的特性,比如自定义POST类型,分类升级,自定义菜单,增加网络功能等,其中的网络功能即是传说中的多站点了,它整合了Wordpress MU的核心代码,让我们可以只用一套程序实现像WP MU一样的站群系统。

一、安装:
正常安装Wordpress,如果已经安装过,请先备份网站,然后停用所有插件。

二、激活多站点模式:
编辑文件 wp-config.php
在/* That’s all, stop editing! Happy blogging. */这一行之前加入以下代码:
/* allow multisite */
define(‘WP_ALLOW_MULTISITE’, true);

三、后台配置:
登录WP后台,进入Tools——>Network Setup选择网站地址形式,有子域名和子目录两种,
点击Install按钮后,会提示你继续修改 wp-config.php 文件,
按照提示,首先创建在 wp-content目录中创建 blogs.dir 文件夹,
然后根据说明修改 wp-config.php 和 .htaccess 文件,
最后重新登录系统,登陆地址是:
worpress_url/wp-admin/network/
到这一步,Wordpress网络功能就部署完毕了,
我们可以成功在后台新增二级域名或子目录的站点。

四、新增站点绑定顶级域名:
如果想让子站点绑定独立的顶级域名或其他域名,
需要安装域名映射插件: WordPress MU Domain Mapping
官方下载地址:
http://wordpress.org/extend/plugins/wordpress-mu-domain-mapping/
安装成功后,首先全网络激活插件Network Activate,
然后把插件目录下的 sunrise.php 文件移动到 wp-content/ 目录下,
再次编辑 wp-config.php 文件,增加代码:
define( ‘SUNRISE’, ‘on’ );
刷新一下管理后台,在Settings中新增了2个项目,
在Settings——>Domain Mapping中设置服务器IP和CNAME,
在Settings——>Domains中可以添加新的域名,
Site ID就是需要绑定域名站点在数据库中的ID值,在All Sites中可以看到。
同样的,你也可以进入子站点的控制面板中,
在Tools——>Domain Mapping里面设置需要绑定的域名。

注意事项:
1. 服务器空间需要支持.htaccess 。
2. 开启 WordPress Network 功能后,最好不要把WP放在子目录。
3. 在本机测试时,不要使用127.0.0.1,用localhost代替。

— over —

php+css让缩略图显示图片的中心部分

如果原始图片为长方形,让图片缩略图只截取图片中心的正方形部分显示。

分为两部分操作,以缩略图为200px的正方形为例,因缩略图访问次数较多,为节省流量,用php生成一个图片长宽最小不小于200px的保持原图片长宽比的小图:

$thumb_width = $thumb_height = 200;

// Get new dimensions
list($width, $height) = getimagesize($filename);

// If height is longer than width, height increase, width unchanged.
if ($width < $height)
{
$thumb_height = ($thumb_width / $width) * $height;
}
else
{
$thumb_width = ($thumb_height / $height) * $width;
}

// Resample
$image_p = imagecreatetruecolor($new_width, $new_height);
$image = imagecreatefromjpeg($filename);
imagecopyresampled($image_p, $image, 0, 0, 0, 0, $thumb_width, $thumb_height, $width, $height);

// Output
imagejpeg($image_p, null, 100);

第二步,用CSS显示缩小后图片的中间部分:

) no-repeat 50% 50%; max-height:200px; max-width:200px;”>

如果有更好的方法,欢迎回复。

定制OpenCart首页和分类页展示的产品

OpenCart早已把常用的功能写好提供给我们了,直接拿来使用即可。

比如我们想修改首页产品图片为显示8个最畅销产品,只需要调用:
$this->model_catalog_product->getBestSellerProducts(8)

如果想显示最新的6个产品,可以这样使用:
$this->model_catalog_product->getLatestProducts(6)

显示指定的商品:
$this->model_catalog_product->getProducts()

最受欢迎的商品:
$this->model_catalog_product->getPopularProducts()

特价商品:
$this->model_catalog_product->getProductSpecials()

以上方法都返回一个数组,自己根据情况编写视图模板文件即可。

OpenCart 模板创建 module 简单步骤

假如我想创建一个侧边栏模块sidebar,让每一个页面都可以复用,步骤如下:
1. 在controller/module目录下新建sidebar.php文件。
2. 添加文件内容为:
class ControllerModuleSidebar extends Controller {
	protected function index($setting) {
		$this->template = $this->config->get('config_template') . '/template/module/sidebar.tpl';
		$this->render();
	}
}
3. 在template/module创建sidebar.tpl模板文件。
4. 在调用的controller引用:
$this->data['sidebar'] = $this->getChild('module/sidebar');
5. 在模板文件使用: echo $sidebar;
最后我想说 OpenCart 真是一款优秀的开源电子商务软件,以后我会写更多关于 OpenCart 的内容。

让 swfobject.js v2.2 在IE、Firefox、Chrome下都支持透明效果的方法

以前在这篇文章中(http://mimiz.cn/index.php/open-source/swfobject-js-transparent-flash/)介绍了让swfobject.js支持flash透明效果的方法,但这个方法比较山寨,需要修改swfobject.js源文件。下面给出更加优秀的方法,代码如下:

var flash_att = { data:"flash/logo.swf",
width:"88", height:"90", wmode:"transparent",
style:'position: absolute;left:0px;top:0px;'};
var flash_par = {wmode:"transparent"};
swfobject.createSWF(flash_att, flash_par, "flashlogo");


如果你不知道什么是swfobject.js,请进入传送门:
http://mimiz.cn/index.php/open-source/swfobject-js-transparent-flash/