js代码 设为首页 加入收藏

// JavaScript Document
//  加入收藏 加入收藏
      
function AddFavorite(sURL, sTitle)
{
    try
    {
        window.external.addFavorite(sURL, sTitle);
    }
    catch (e)
    {
        try
        {
            window.sidebar.addPanel(sTitle, sURL, "");
        }
        catch (e)
        {
            alert("加入收藏失败,请使用Ctrl+D进行添加");
        }
    }
}
//设为首页 设为首页
function SetHome(obj,vrl){
        try{
                obj.style.behavior='url(#default#homepage)';obj.setHomePage(vrl);
        }
        catch(e){
                if(window.netscape) {
                        try {
                                netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
                        }
                        catch (e) {
                                alert("此操作被浏览器拒绝!\n请在浏览器地址栏输入“about:config”并回车\n然后将 [signed.applets.codebase_principal_support]的值设置为'true',双击即可。");
                        }
                        var prefs = Components.classes['@mozilla.org/preferences-service;1'].getService(Components.interfaces.nsIPrefBranch);
                        prefs.setCharPref('browser.startup.homepage',vrl);
                 }
        }
}
设为首页
     
收藏本站

Via:http://www.cnblogs.com/naniannayue/archive/2011/12/16/2289798.html

I18n for WordPress Developers

I18n for WordPress Developers:本文将介绍什么是I18n以及如何在Wordpress开发中使用它,以使插件和主题可以被翻译成多种语言。

 

1.什么是I18n?

I18n是Internationalization的缩写,因为I和n之间一共有18个字母,所以这么缩写。对WordPress来说,这意味着以特殊的方式标记的的字符串应该被翻译。

2.Gettext的简介

WordPress使用的是gettext库和i18n工具。需要注意的是,如果你看看网上,你会看到_()函数,它是指原生的PHP的gettext标准翻译功能,但对于WordPress ,你应该使用WordPress定义的函数来替代PHP的_()函数。

3.可翻译的字符串

为了使你的Wordpress主题的字符可以被翻译为多种语言,你应该用一个_()函数来处理它。

$hello = __( 'Hello, Suoling!', 'suoling-net-theme' );

如果这个字符是前台可见的,应该采用_e()函数了!如下:

$hello = _e( 'Hello, Suoling!', 'suoling-net-theme' );

4.POT文件

在源文件中标记字符串后, 一个叫xgettext的gettext工具将被用来提取原始字符串并建立一个后缀为.pot的主题字 符串翻译文件。下面是一个例子POT文件条目:

#: wp-admin/admin-header.php:49
    msgid "Sign Out"
    msgstr ""

5.PO文件

每个译者使用WordPress 主题的POT文件,用自己的语言转换原来的msgstr部分。其结果是和原来的POT文件格式相同的PO文件,这个PO文件已经被翻译并且可能会和原来的POT的头部不同。

6.MO文件

已经翻译的PO文件会创建一个MO文件。这是一个二进制文件,它包含了所有的原始字符串和相应的翻译。该文件使用msgfmt工具转换。一个典型的msgfmt命令看起来像这样:

msgfmt -o filename.po filename.mo

如果你一次要转换很多PO文件,就可以使用批处理运行它,例如,使用bash命令:

# Find PO files, process each with msgfmt and rename the result to MO
for file in `find . -name "*.po"` ; do msgfmt -o `echo$file | sed s/\.po/\.mo/` $file ; done

7.标记文本(前面这四个字在这一段当名词用)的作用

如果你翻译一个插件或主题,你需要使用一个标记文本来标记该插件/主题所有字符。这样可以提高便携性、并能与一寸的WordPress的主题或插件共同工作。 在一般情况下,Wordpress可以使用多个大型翻译逻辑模块和不同的MO文件。
标记文本可以用来区别不同的模块。
如果你想了解更多,我们建议您阅读了gettext在线手册

8.为翻译而标记文本(括号前面的这四个字是一个动词,区别于上一段)

翻译的字符串被包裹在一个呼叫的一个特殊功能的一组。最常用的一种是__ ( ) 。它只返回参数的翻译:

echo '

' . __( 'Blog Options', 'my-text-domain' ) . '

';

但是看起来_e()用的更广泛,下面这两行的效果是一样的:

echo __( Suoling.net is a nice website!', 'my-text-domain' );
_e( Suoling.net is a nice website!', 'my-text-domain' );

9.占位符

echo 'We deleted $count spam messages.'

你会如何i18n上面这行呢?让我们看看下面这一行:

_e( 'We deleted $count spam messages.', 'my-text-domain' );

试验后你会发现,上面这行是错误的,正确的写法如下:

printf( __( 'We deleted %d spam messages.', 'my-text-domain' ), $count );

问题在哪儿呢?因为_e()只是翻译字符串,所以,它把变量$count也作为字符串翻译,可能的结果是“我们删除了

$ count封垃圾邮件”,正确处理变量的方式是采用类似:

printf(__('字符字符%d字符字符'),$变量名)

使用两个占位符的例子:

printf( __( 'Your city is %1$s, and your zip code is %2$s.', 'my-text-domain' ), $city, $zipcode );

其中的%d是个整数型变量占位符,关于占位符,请点击后面:占位符

 

10.复数形式

让我们回到垃圾邮件的例子。如果我们只有一个垃圾邮件删除,该怎么办?输出将是:We deleted 1 spam messages,这是绝对不正确的英语,在许多其他语言中也肯定是不正确的。

在WordPress中,您可以使用_n()函数。

printf( _n( 'We deleted %d spam message.', 'We deleted %d spam messages.', $count, 'my-text-domain' ), $count );

_n()接受4个参数:

singular – 单数形式的字符串

plural – 复数形式的字符串

count – 对象的数量,这将决定应该返回单数还是复数形式(许多其他种类的自然语言远远超过2种形式)

text domain -是第四可选参数。函数的返回值是给定的数的正确的翻译的形式。

11.消除上下文歧义

有时候一个词在几个场合用,虽然是同一个英文单词,但它在其他语言中意义可能不同。例如Post一词可以用来作为一个动词(点击此处发表您的意见),名词(编辑这篇文章) 。在这种情况下可以使用_x ()函数来消除歧义。__( )也行,但它有一个额外的第二个参数 – the context:

if ( false === $commenttxt ) $commenttxt = _x( 'Comment', 'noun' );
    if ( false === $trackbacktxt ) $trackbacktxt = __( 'Trackback' );
    if ( false === $pingbacktxt ) $pingbacktxt = __( 'Pingback' );
    ...
    // 在代码某处替换
    echo _x( 'Comment', 'column name' );

使用下面这量种方法,我们将得到的字符串评论的原始版本,但会在不同的上下文中看到有两个翻译项。
text domain是第三个可选参数:

echo _x( 'Comment', 'column name', 'my-text-domain' );

同样需要注意的是__( ) , _x ( )可以被写成: _ex ( ) 。前面的例子可以写成:

_ex( 'Comment', 'column name', 'my-text-domain' );

你可以使用上面两种之中你觉得能提高易读性和易于编码的一种。

12.描述

翻译者可能不知道下面这一句该如何翻译的:

__( 'g:i:s a' )

在这种情况下,你可以在源代码中添加一个澄清评论。它应该以

translators:

开头,并应该是gettext转换前最后的PHP评论。下面是一个例子:

/* translators: 草稿保存的日期格式, see http://php.net/date */
    $draft_saved_date_format = __( 'g:i:s a' );

通过增加一个

translators:

评论你可以写“个人”的消息,让翻译者知道如何处理字符串翻译。

13.换行符

Gettext的不喜欢翻译字符串中存在\ r( ASCII码: 13 ),所以请避免使用它,可使用\ n代替。

14.空字符串

空字符串是保留给GETTEXT内部使用的,所以你一定不要尝试空字符串的国际化。它也没有任何意义,因为译者将不会看到任何上下文。
如果你必须使用空字符串,请添加翻译帮助并添加上下文并注意与Gettext系统的兼容性。

15.处理JavaScript文件

使用wp_localize_script()添加翻译的字符串或其他服务器端数据到先前排队的脚本中。

wp_enqueue_script( 'script-handle', … );
    wp_localize_script( 'script-handle', 'objectL10n', array(
    'speed' => $distance / $time,
    'submit' => __( 'Submit', 'my-text-domain' ),
    ) );

然后在JavaScript文件中,相应的script-handle ,你可以使用objectL10n.variable :

$('#submit').val(objectL10n.submit);
    $('#speed').val('{speed} km/h'.replace('{speed}', objectL10n.speed));

16.最佳实践

收集一些WordPress的具体例子,去阅读并理解它们,或者gettext手册中的优秀的文章。
总之,它看起来像这样:
规范的用词、用语。
整个句子在大多数语言中的词序是不同于英语。
合并有关的句子段落,但不要在一个字符串中包括一整页的文字。
使用格式字符串,而不是字符串在sprintf(__(’替换%1 $ s的%2 $ s’的),$,$ b)中;
避免不寻常的标记和不寻常的控制字符。
不要在翻译的短语或尾部留下空白。

17.翻译插件

如果你想翻译插件,请谨记上述建议,例外如下:

你必须使用标记文本,这是你的插件的一个钩子

每个翻译都要调用调用__ ( ‘文字’, ‘标记文本’)

您的标记文本,可能会与你的插件名称相同,必须没有下划线。

18.选用和加载标记文本

标记文本是一个唯一的标识符,这使得WordPress可以区分所有已加载的翻译。
使用你的插件的名称或者其缩写,始终是一个不错的选择。
例如:如果你的插件是一个单一的文件称为shareadraft.php的,或者它在一个称为shareadraft的文件夹下,那么,以shareadraft作为标记文本似乎比较合适。
对于主题 – 建议以主题文件夹名作为标记文本。
标记文本也被用来和你的插件的翻译一起形成MO文件的名称。
你可以在调用plugins_loaded之前调用load_plugin_textdomain函数加载它们。

load_plugin_textdomain( $domain, $path_from_abspath, $path_from_plugins_folder )

实例:

 

此调用尝试从你的插件的基本目录加载my-plugin-{locale}.mo 。
语言环境的语言代码和/或国家代码被定义在wp-config.php中的WPLANG常量中。
例如,中国大陆的语言环境是’zh_CN’,和丹麦的语言环境是’da_DK’。
从上面的代码示例文本域 ‘my-plugin’ ,因此简体中文MO和PO文件应该被命名为my-plugin-zh_CN.mo ,丹麦语应该对应的是my-plugin-da_DK.po.

对于语言和国家代码的更多信息,请参阅安装WordPress-你的语言

 

WordPress 2.6及更新的版本中第三个参数是.mo文件相对于plugins目录所在的目录,它必须使用斜杠结束。如果你的插件并不需要与旧版本的WordPress的兼容性,您可以将第二个参数为空。

低于2.6的版本,第二个参数应该是.mo文件所在的目录。 (相对于ABSPATH的)。第三个参数是空白的。

主题亦相似:

load_theme_textdomain('my_theme');

在你的主题的functions.php文件中写入上面这句,它会搜索你的主题目录,并加载它的locale.mo (其中locale是当前语言,例如zh_CN.mo ) 。

当心

请确定MO文件名称为locale.mo(例如, zh_CN.mo )

不要将你MO文件命名为为my_theme zh_CN.mo

翻译的元数据

如果您添加了这样的一行,WordPress的插件或主题标题的主题或插件名称应该国际化的插件或主题的元数据时,它会显示你的插件管理界面:

Text Domain: my-text-domain

Worspress2.8及更新的版本中小工具的I18n

WordPress 2.8中采用了全新的Widget API ,只需要开发者来扩展标准的widget类和它的一些功能。有了这个API有没有init函数都行。然后使用窗口widget(), form()和update()方法是编码的插件,插件必须进行登记。widget被注册后,再载入标记文本(TEXTDOMAIN )。
例如:

// 注册Foo_Widget小工具   
    function Foo_Widget_init() {   
        return register_widget( 'Foo_Widget' );   
    }   
    add_action( 'widgets_init', 'Foo_Widget_init' );   
             
    $plugin_dir = basename( dirname( __FILE__ ) );   
    load_plugin_textdomain( 'foo_widget', null, $plugin_dir );

这个例子注册了一个名为Foo_Widget的小工具,然后设置插件目录变量和尝试加载的thefoo_widget locale.po文件的。
在主题和插件中标记字符串
上面的所有规则都适用于主题和插件,但还有一个,额外的规则规定,您必须添加标记文本作为每个__e和__ ngettext调用的一个参数,否则你的翻译将不起作用。
示例:

__('String') should become __('String', 'text_domain')   
_e('String') should become _e('String', 'text_domain')   
_n('String', 'Strings', $count) should become _n('String', 'Strings', $count, 'text_domain')

手工添加标记文本是一种负担,所以它会自动添加:
如果你的插件在官方资料库,登记您的帮助页面,并滚动到添加域Gettext的调用。
或者:
获取add-textdomain.php,像这样执行:

php add-textdomain.php -i domain phpfile phpfile ...

之后,标记文本将被添加到所有的gettext调用文件中。

Via:http://suoling.net/i18n-for-wordpress-developers/

WordPress自制主题的升级配置

WordPress自制主题的升级配置:本文适合Wordpress主题主题开发者,因为内容讨论的是如何让自制的Wordpress主题升级而不是教Wordpress用户怎样升级他们使用的主题。

 

1.准备服务器端的XML文件,示例如下:

  
  
    1.2  
      
        v1.2 2013-06-12 
            
  1. 更新后台设置的界面

v1.1 2013-04-08

  1. 更新前台的home.php和single.php

v1.0 2013-02-06

  1. 更新前台显示效果
]]>

2.准备update.php,代码示例如下:

latest) == -1) {   
            add_dashboard_page( $theme_data['Name'] . '主题升级', $theme_data['Name'] . '现在升级?', 'administrator', strtolower($theme_data['Name']) . '-updates', update_notifier);   
        }   
    }     
            
    add_action('admin_menu', 'update_notifier_menu');   
            
    function update_notifier() {    
        $xml = get_latest_theme_version(21600); // 告诉函数缓存远程调用6个小时=21600秒   
        $theme_data = get_theme_data(TEMPLATEPATH . '/style.css'); // 获取当前版本的style.css?>   
                 
           
            
        

主题升级

已经有新版本了, 您现在使用的版本是: ,现在要升级到新版本:latest; ?>。

升级下载与介绍

注意: 请做好下面这个文件夹的备份/wp-content/themes//

请登录您的账户, 到 下载 区域下载。

解压zip压缩包,找到解压后的文件夹,然后将这个文件夹下的所有文件FTP上传覆盖 /wp-content/themes// 下的所有文件。

更新日志

changelog; ?>
$interval) ) { // 缓存不存在或者太老,就刷新 if( function_exists('curl_init') ) { // 如果cURL可用,就用它 $ch = curl_init($notifier_file_url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_TIMEOUT, 10); $cache = curl_exec($ch); curl_close($ch); } else { $cache = file_get_contents($notifier_file_url); // 如果不可用,就用file_get_contents() } if ($cache) { // 已经得到结果了 update_option( $db_cache_field, $cache ); update_option( $db_cache_field_last_updated, time() ); } // 读取缓存文件 $notifier_data = get_option( $db_cache_field ); } else { // 缓存文件足够新,就读取它 $notifier_data = get_option( $db_cache_field ); } $xml = simplexml_load_string($notifier_data); return $xml; } ?>

3.在主题functions.php中包含这个文件:

include 'update_notifier.php';

4.还有最关键的一步:权限检查,这一步就先不介绍了,留着你自己探索吧!

Via:http://suoling.net/wordpress-theme-update/

适用于Bootstrap的菜单自定义类(开源)

Bootstrap是Twitter推出的开源前端框架(CSS、js、图标字体,该有的都有了),响应式设计,操作简单,上手容易,但是要写出优秀的网页,那就得多实践、多学习了!顺便说一下,Bootstrap比阿里巴巴推出的Kissy(js库)要好使多了!
本文传播一个适用于Wordpress的Bootstrap菜单开源类!

 

先上代码:

\n";  
                            
                }  
             
                function start_el( &$output, $item, $depth = 0, $args = array(), $id = 0 ) {  
                            
                    $indent = ( $depth ) ? str_repeat( "\t", $depth ) : '';  
             
                    $li_attributes = '';  
                    $class_names = $value = '';  
             
                    $classes = emptyempty( $item->classes ) ? array() : (array) $item->classes;  
                    $classes[] = ($args->has_children) ? 'dropdown' : '';  
                    $classes[] = ($item->current || $item->current_item_ancestor) ? 'active' : '';  
                    $classes[] = 'menu-item-' . $item->ID;  
             
             
                    $class_names = join( ' ', apply_filters( 'nav_menu_css_class', array_filter( $classes ), $item, $args ) );  
                    $class_names = ' class="' . esc_attr( $class_names ) . '"';  
             
                    $id = apply_filters( 'nav_menu_item_id', 'menu-item-'. $item->ID, $item, $args );  
                    $id = strlen( $id ) ? ' id="' . esc_attr( $id ) . '"' : '';  
             
                    $output .= $indent . '';  
             
                    $attributes  = ! emptyempty( $item->attr_title ) ? ' title="'  . esc_attr( $item->attr_title ) .'"' : '';  
                    $attributes .= ! emptyempty( $item->target )     ? ' target="' . esc_attr( $item->target     ) .'"' : '';  
                    $attributes .= ! emptyempty( $item->xfn )        ? ' rel="'    . esc_attr( $item->xfn        ) .'"' : '';  
                    $attributes .= ! emptyempty( $item->url )        ? ' href="'   . esc_attr( $item->url        ) .'"' : '';  
                    $attributes .= ($args->has_children)        ? ' class="dropdown-toggle" data-toggle="dropdown"' : '';  
             
                    $item_output = $args->before;  
                    $item_output .= '';  
                    $item_output .= $args->link_before . apply_filters( 'the_title', $item->title, $item->ID ) . $args->link_after;  
                    $item_output .= ($args->has_children) ? ' ' : '';  
                    $item_output .= $args->after;  
             
                    $output .= apply_filters( 'walker_nav_menu_start_el', $item_output, $item, $depth, $args );  
                }  
             
                function display_element( $element, &$children_elements, $max_depth, $depth=0, $args, &$output ) {  
                            
                    if ( !$element )  
                        return;  
                            
                    $id_field = $this->db_fields['id'];  
             
                    //display this element  
                    if ( is_array( $args[0] ) )   
                        $args[0]['has_children'] = ! emptyempty( $children_elements[$element->$id_field] );  
                    else if ( is_object( $args[0] ) )   
                        $args[0]->has_children = ! emptyempty( $children_elements[$element->$id_field] );   
                    $cb_args = array_merge( array(&$output, $element, $depth), $args);  
                    call_user_func_array(array(&$this, 'start_el'), $cb_args);  
             
                    $id = $element->$id_field;  
             
                    // descend only when the depth is right and there are childrens for this element  
                    if ( ($max_depth == 0 || $max_depth > $depth+1 ) && isset( $children_elements[$id]) ) {  
             
                        foreach( $children_elements[ $id ] as $child ){  
             
                            if ( !isset($newlevel) ) {  
                                $newlevel = true;  
                                //start the child delimiter  
                                $cb_args = array_merge( array(&$output, $depth), $args);  
                                call_user_func_array(array(&$this, 'start_lvl'), $cb_args);  
                            }  
                            $this->display_element( $child, $children_elements, $max_depth, $depth + 1, $args, $output );  
                        }  
                            unset( $children_elements[ $id ] );  
                    }  
             
                    if ( isset($newlevel) && $newlevel ){  
                        //end the child delimiter  
                        $cb_args = array_merge( array(&$output, $depth), $args);  
                        call_user_func_array(array(&$this, 'end_lvl'), $cb_args);  
                    }  
             
                    //end this element  
                    $cb_args = array_merge( array(&$output, $element, $depth), $args);  
                    call_user_func_array(array(&$this, 'end_el'), $cb_args);  
                            
                }  
                        
            }  
             
        }  
             
    endif;  
    ?>

上面的代码复制到functions.php中,使用很简单,示例:

开源库链接:

https://gist.github.com/johnmegahan/1597994

作者:
Johnny Megahan

Via:http://suoling.net/bootstrap-menu-walker/

给wordpress的css和js加上时间戳

经常修改主题,因为缓存的缘故,难免遇上需要访客浏览器强制刷新的情况。但是尽量增加客户端css,js,图片缓存时间是提高站点访问速度的一个关键因素,为解决这个矛盾,常见的方法是在css和js后面跟上一段时间戳。当css、js文件修改后,相对应的URL发生变化,让浏览器主动去更新这些文件。而在平时,通过修改站点根目录下的.htaccess给css/js一个尽可能长的缓存时间。

下面是该方法在wordpress中相关的应用。代码很简单,下面给css加上时间戳,(CP来源未知)通过获取css文件的修改时间,输出xxx.css?v=122342344这种形式 。主要是采用了钩子直接修改css的url,下面的代码可以直接复制到function.php里面,无需修改。


注意:add_filter的位置是'stylesheet_uri',没错是uri

js的一样,贴个我用的代码吧,我把js放在根目录/js 目录下面,判断主页和single页面选取不同的js,并通过钩子在wp footer载入。请自行修改代码发挥~

\n
\n
EOF;
}else{
$text = <<\n
EOF;
        
}   
    echo $text;
}
add_action('wp_footer', 'LoadJS', 100);

Via:http://winysky.com/to-the-css-and-js-wordpress-timestamp

WordPress自定义文章类型

WordPress早已经可以完美的作为CMS了,真正的突破是自定义文章类型(custom post type)功能,你可以通过自定义文章类型来创建各种各样的内容。本文将介绍下Wordpress的自定义文章类型。

零、软件准备

先搭建Wordpress本地环境:

 

1.到s135.com下载由张宴开发的APMServ软件,这是一个Windows平台下的Apache+Mysql+PHP集成软件,只需要解压在路径中不含中文的文件夹中即可,比如:H://apmserv是可用的,H://测试软件/apmserv这个路径是不行的。

2.到cn.wordpress.org下载最新版的Wordpress简体中文版,将压缩包解压后得到的文件夹中的内容复制到APMserv的htdocs下,可点击APMserv的菜单直接到相应目录(启用APMSevr的时候,请关闭360相关的所有垃圾软件,浏览器除外),如下图所示:

然后,点击APMserv软件右侧的“管理Mysql数据库”,以账户root,空密码进入,然后创建一个数据库,例如:demo;

3.在你的浏览器的地址栏输入127.0.0.1,即进入Wordpress安装界面,填写相应信息即可安装。

 

一.自定义文章类型的由来

在2005年2月17日发布的WordPress 1.5中,已经支持静态网页、创建post_type数据库字段了。实际上,wp_insert_post()函数在Wordpress1.0中已经存在了,所以在Wordpress1.5添加了post_type,更加灵活了,代码量也更少了,实际上,并非仅仅是如此简单的。

register_post_type()和其它一些对自定义文章类型有用的函数是从Wordpress2.8开始有的,到了Wordpress2.9,这些函数或者功能才成熟。

二.Wordpress可以做什么

自定义文章类型与普通文章除了在数据库中的post_type不同外,其它没什么不同的。普通文章的post_type在数据库中的值是post,普通页面的post_type在数据库中的值是page,附件的post_type在I数据库中的值是attachment ,自定义文章类型的post_type在数据库中的值是你自己设置的。

正确的创建Wordpress自定义文章类型,你需要先考虑以下几个步骤:

1.后台:自定义的文章类型在Wordpress后台左侧仪表盘(将Wordpress翻译为简体中文的人很奇怪的将pannel翻译为仪表盘了,我觉得翻译为控制面板比较合适)有一个独立的菜单项(甚至可以考虑下有个自己的icon),这个菜单项下面至少应该有以下几个二级菜单:自定义文章类型文章的列表菜单项、添加新的自定义文章类型文章的菜单项,进一步可以考虑下为自定义文章类型来个分类和标签什么的,以方便管理;

2.前台:应该通过类似于http://coolwp.net/my-post-type-archive/之类的链接在前台访问到自定义文章类型的归档页面(也就是文章列表页面)。

当然,还有一些与普通的文章类型post类似的属性这里就不详细描述了。

三、Wordpress自定义文章类型的规划

为有效地创建和使用Wordpress自定义文章类型,你需要熟悉以下内容:

1.创建自定义文章类型;

2.创建自定义分类;

3.创建自定义meta box或者输入栏/选择栏。

四、创建Wordpress自定义文章类型

在你所用的Wordpress主题(例如使用Wordpress自带的默认主题)文件夹下的文件functions.php的最后一个?>(如果有的话)之前,如果没有的话,直接添加如下代码:

function sl_custom_post_product() {   
        $labels = array(   
            'name'               => _x( '产品', 'post type general name' ),   
            'singular_name'      => _x( '产品', 'post type singular name' ),   
            'add_new'            => _x( '添加', 'book' ),   
            'add_new_item'       => __( '添加新产品' ),   
            'edit_item'          => __( '编辑产品' ),   
            'new_item'           => __( '新产品' ),   
            'all_items'          => __( '全部产品' ),   
            'view_item'          => __( '查看产品' ),   
            'search_items'       => __( '搜索产品' ),   
            'not_found'          => __( '未找到产品' ),   
            'not_found_in_trash' => __( '回收站中暂无产品' ),    
            'parent_item_colon'  => '',   
            'menu_name'          => '产品'  
        );   
        $args = array(   
            'labels'        => $labels,   
            'description'   => '索凌网络的产品',   
            'public'        => true,   
            'menu_position' => 5,   
            'supports'      => array( 'title', 'editor', 'thumbnail', 'excerpt', 'comments' ),   
            'has_archive'   => true,   
        );   
        register_post_type( 'product', $args );    
    }   
    add_action( 'init', 'sl_custom_post_product' );

即可在Wordpress后台左侧仪表盘看到:

上面代码中:

labels 是一个参数数组;

description的值是对这个自定义文章类型的描述;

public的值设置为true,后面将会介绍;

menu_position菜单在Wordpress后台左侧仪表盘中的位置:5意味着这个自定义文章类型在菜单中将会在“文章”菜单的下面,如果在functions.php中这段代码前面的代码或者包含文件中没有其它自定义文章类型的话,如果在上面这段代码之前已经有其它自定义文章类型,并且menu_position也是5的话,上面这段代码自定义的文章类型将会出现在那个自定义文章类型之后,例如我再上面这段代码之前,已经定义了一个名字叫幻灯的自定义文章类型,并且menu_position也是5,那么顺序是:

 

menu_position数值对应的位置:

  • 5 -文章之下

  • 10 – 多媒体之下

  • 15 – 链接之下(链接在Wordpress3.5开始已经隐藏了)

  • 20 – 页面之下

  • 25 – 评论之下

  • 60 – 第一个分隔符之下(一般是在外观的上面)

  • 65 – 插件之下

  • 70 -用户之下

  • 75 – 工具之下

  • 80 -设置之下

  • 100 – 第二个分隔符之下(一般是在设置之下)

supports的值是一个数组,说明这个文章类型支持哪些特性:

  • ‘title’

  • ‘editor’ (内容编辑器)

  • ‘author’

  • ‘thumbnail’ (缩略图)

  • ‘excerpt’

  • ‘trackbacks’

  • ‘custom-fields’

  • ‘comments’ (是否支持评论)

  • ‘revisions’ (是否自动备份)

  • ‘page-attributes’ (menu order, hierarchical must be true to show Parent option)

  • ‘post-formats’ add post formats

has_archive确定是否归档。

register_post_type()函数的参数说明,请参考:

http://codex.wordpress.org/Function_Reference/register_post_type

五、自定义Wordpress自定义文章类型的交互信息

自定义文章类型的交互信息很少被提及,这里简单介绍下:

function sl_updated_messages( $messages ) {   
        global $post, $post_ID;   
        $messages['product'] = array(   
            0 => '',    
            1 => sprintf( __('产品已更新!  查看'), esc_url( get_permalink($post_ID) ) ),   
            2 => __('自定义栏已更新!'),   
            3 => __('自定义栏已删除!'),   
            4 => __('产品信息已更新!'),   
            5 => isset($_GET['revision']) ? sprintf( __('产品将回滚至 %s'), wp_post_revision_title( (int) $_GET['revision'], false ) ) : false,   
            6 => sprintf( __('产品已发布!  查看'), esc_url( get_permalink($post_ID) ) ),   
            7 => __('产品已保存!'),   
            8 => sprintf( __('产品已提交!  预览'), esc_url( add_query_arg( 'preview', 'true', get_permalink($post_ID) ) ) ),   
            9 => sprintf( __('Product scheduled for: %1$s. 预览产品'), date_i18n( __( 'Y-m-d @ G:i' ), strtotime( $post->post_date ) ), esc_url( get_permalink($post_ID) ) ),   
            10 => sprintf( __('产品草稿已更新!  预览'), esc_url( add_query_arg( 'preview', 'true', get_permalink($post_ID) ) ) ),   
        );   
        return $messages;   
    }   
    add_filter( 'post_updated_messages', 'sl_updated_messages' );

当你发布一个产品的时候,会看到交互信息,如下:

 

六、自定义Wordpress自定义文章类型的上下帮助

WordPress的上下文帮助是指会出现在Wordpress后台指定页面右上角的帮助信息,示例代码如下:

function sl_contextual_help( $contextual_help, $screen_id, $screen ) {    
        if ( 'product' == $screen->id ) {   
               
            $contextual_help = '

产品发布/编辑页面帮助信息

索凌网络提示:请在这里输入Wordpress的上下文帮助信息!

'; } elseif ( 'edit-product' == $screen->id ) { $contextual_help = '

产品列表页面帮助信息

索凌网络提示:请在这里输入Wordpress的上下文帮助信息!

'; } return $contextual_help; } add_action( 'contextual_help', 'sl_contextual_help', 10, 3 );

上述代码加入functions.php之后,你点击产品列表页面的右上角的帮助,会看到设置的帮助信息:

 

点击产品发布/编辑页面右上角的帮助,会看到设置的相应的帮助信息:

 

七、自定义Wordpress自定义文章类型的分类

将下述代码添加到functions.php:

function sl_taxonomies_product() {   
        $labels = array(   
            'name'              => _x( '产品分类', 'taxonomy general name' ),   
            'singular_name'     => _x( '产品分类', 'taxonomy singular name' ),   
            'search_items'      => __( '搜索产品分类' ),   
            'all_items'         => __( '产品的全部分类' ),   
            'parent_item'       => __( '父级分类' ),   
            'parent_item_colon' => __( '父级分类:' ),   
            'edit_item'         => __( '编辑产品分类' ),    
            'update_item'       => __( '更新产品分类' ),   
            'add_new_item'      => __( '添加产品分类' ),   
            'new_item_name'     => __( '新的产品分类' ),   
            'menu_name'         => __( '产品分类' ),   
        );   
        $args = array(   
            'labels' => $labels,   
            'hierarchical' => true,   
        );   
        register_taxonomy( 'product_category', 'product', $args );   
    }   
    add_action( 'init', 'sl_taxonomies_product', 0 );

即可在产品菜单下有个产品分类的二级菜单:

 

八、自定义Wordpress自定义文章类型的meta box

将下述代码添加到functions.php:

add_action( 'add_meta_boxes', 'product_price_box' );   
    function product_price_box() {   
        add_meta_box(    
            'product_price_box',   
            __( '产品价格', 'coolwp' ),   
            'product_price_box_content',   
            'product',   
            'side',   
            'high'  
        );   
    }   
    function product_price_box_content( $post ) {   
        wp_nonce_field( plugin_basename( __FILE__ ), 'product_price_box_content_nonce' );   
        echo '';   
        echo '';   
    }

在产品发布/编辑窗口的右上方(发布栏上方)即可出现如下价格输入栏:

 

但是,上面的代码是不会保存价格的,还需要验证nonce后保存或更新!

九、自定义Wordpress自定义文章类型的前台显示

示例页面模板代码:

 'product',   
                'tax_query' => array(   
                    array(   
                        'taxonomy' => 'product_category',   
                        'field' => 'slug',   
                        'terms' => 'coolwp'  
                    )   
                )   
            );   
            $products = new WP_Query( $args );   
            if( $products->have_posts() ) {   
                while( $products->have_posts() ) {   
                    $products->the_post();   
                    ?>   
                        

Via:http://suoling.net/wordpress-custom-post-type/

为WordPress添加自定义字段实例

WordPress的自定义字段功能可以让你用Wordpress做许多事儿!本文将分享一种最简单的实现方法。

 

WordPress自定义字段的作用:在后台编辑页面像设置标签和特色图像一样设置任何你想在前台页面显示的内容。

本实例来自索凌网络开发中的Wordpress主题i_ebook,将为Wordpress添加三个自定义字段,作用是下载链接和亚马逊推荐链接,并通过CSS将其格式化。

前台显示效果:

 

WordPress自定义字段

后台效果:

WordPress自定义字段实例

现在来上代码了!

1.用一款合适的编辑器(推荐Notepad++或SubmitText)打开你的Wordpress当前使用主题文件夹下的functions.php文件,在文件结尾?>的前面,添加以下内容:

////////////////////自定义字段开始//////////////////////////////////   
    $new_meta_boxes =   
    array(   
        "description" => array(   
            "name" => "description",   
            "std" => "这里填默认的网页描述",   
            "title" => "网页描述:"),   
        "downloads" => array(   
            "name" => "downloads",   
            "std" => "这里填下载链接",   
            "title" => "下载链接:"),    
        "amazons" => array(   
            "name" => "amazons",   
            "std" => "这里填亚马逊实体书推荐链接",   
            "title" => "亚马逊实体书链接:")    
                               
    );

上述代码的作用是先定义一个存放字段信息的数组,接着来代码:

function new_meta_boxes() //将自定义字段显示在后台,注意格式化,本实例的宽度是150px,4行。   
    {   
        global $post, $new_meta_boxes;   
        foreach($new_meta_boxes as $meta_box)    
        {   
            $meta_box_value = get_post_meta($post->ID, $meta_box['name'].'_value', true);   
            if($meta_box_value == "")   
                $meta_box_value = $meta_box['std'];   
            // 自定义字段标题   
            echo'

'.$meta_box['title'].'

'; // 自定义字段输入框 echo '
'; } echo ''; }

上面代码的作用是将自定义字段的编辑框显示在后台编辑页面,这句话有点儿拗口!好了,接着上代码!

function create_meta_box() //创建自定义字段函数,   
    {   
        if ( function_exists('add_meta_box') ) //Wordpress2.5版本增加进去的,所以严格说,之前的古老版本不能用,不过应该没人用那么老的东西吧!   
        {   
        /*
                    
        add_meta_box( $id, $title, $callback, $post_type, $context, $priority, $callback_args );  
        $id HTML 代码中设置区域中id属性的值:new-meta-boxes  
        $title 区域中的标题名称:索凌网络i_Ebook主题模块  
        $callback 添加的设置区域的显示函数(回调函数):new_meta_boxes  
        $post_type 在 post 还是 page 的编辑页面中显示:post  
        $context 设置区域的显示位置,主编辑区、边栏、其他:normal  
        $priority 设置区域显示的优先级  
        $callback_args 回调函数接受的附加参数  
         这个例子不错哦  
         add_meta_box('xz_box_1', 'add_meta_box 测试', 'xz_box_1','post','side','high',array('str1','str2'));  
                    
        */ 
            add_meta_box( 'new-meta-boxes', '索凌网络i_Ebook主题模块', 'new_meta_boxes', 'post', 'normal', 'high' );   
        }   
    }

虽然说这个页面的所有代码都很重要,但是,上面的这个代码应该是最重要的吧!

add_meta_box函数参考页面:点击这里,下面接着来代码!

function save_postdata( $post_id )    
    {   
        global $new_meta_boxes;   
                    
        if ( !wp_verify_nonce( $_POST['newmetaboxes_noncename'], plugin_basename(__FILE__) ))   
            return;   
                    
        if ( !current_user_can( 'edit_posts', $post_id ))   
            return;   
                                    
        foreach($new_meta_boxes as $meta_box)    
        {   
            $data = $_POST[$meta_box['name'].'_value'];   
               
            if(get_post_meta($post_id, $meta_box['name'].'_value') == "")   
                add_post_meta($post_id, $meta_box['name'].'_value', $data, true);   
            elseif($data != get_post_meta($post_id, $meta_box['name'].'_value', true))   
                update_post_meta($post_id, $meta_box['name'].'_value', $data);   
            elseif($data == "")   
                delete_post_meta($post_id, $meta_box['name'].'_value', get_post_meta($post_id, $meta_box['name'].'_value', true));   
        }   
    }

上面的代码意思是在保存文章时保存自定义字段的数据。我不得不说,代码还没完。下面的代码的作用是通过添加两个动作使以上所有的代码发挥作用,所以,说下面的这两句话是本文最重要的代码也不为过。

add_action('admin_menu', 'create_meta_box');   
    add_action('save_post', 'save_postdata');   
    ////////////////////自定义字段结束//////////////////////////////////

functions.php中的所有所需代码添加完毕,下面仅来一个在前台显示下载链接的示例代码:

" rel="nofollow" target="_blank">ID, "downloads_value", true);switch($downloads){case true:echo '下载电子书';break; default: echo '暂无下载';}?>

上面的代码的作用是有下载链接是显示“下载电子书”,并带上下载链接,如果没有下载链接,那么就显示“暂无下载”,并链接到本页。

Via:suoling.net/custom-fields-for-wordpress/

debian下安装lftp

vps定时备份用lftp非常方便(详情请见此处),不过lftp不是自带的,需要自己安装.

lftp需要readline支持.

1、安装readline

官方地址:http://cnswww.cns.cwru.edu/php/chet/readline/rltop.html

wget -c ftp://ftp.cwru.edu/pub/bash/readline-6.2.tar.gz

tar -zxvf readline-6.2.tar.gz

cd readline-6.2

./configure

make

make install

2、安装lftp

官方地址:http://lftp.yar.ru/get.html

wget -c  http://lftp.yar.ru/ftp/lftp-4.4.11.tar.gz

tar -zxvf lftp-4.4.11.tar.gz

cd lftp-4.4.11

./configure

make

make install

OK,搞定!

Debian设置IP地址、网关、DNS

Debian设置IP地址、网关、DNS

说明:
系统:debian 6.0.4
IP地址:192.168.21.166
子网掩码:255.255.255.0
网关:192.168.21.2
DNS:8.8.8.8
8.8.4.4
操作:
系统运维  温馨提醒:qihang01原创内容版权所有,转载请注明出处及原文链接
1、设置IP地址、网关
nano /etc/network/interfaces /etc/network/interfacesbak #备份原有配置文件
nano /etc/network/interfaces #编辑网网卡配置文件
auto lo
auto eth0 #开机自动连接网络
iface lo inet loopback
allow-hotplug eth0
iface eth0 inet static #static表示使用固定ip,dhcp表述使用动态ip
address 192.168.21.166 #设置ip地址
netmask 255.255.255.0 #设置子网掩码
gateway192.168.21.2 #设置网关
ctrl+o #保存配置
ctrl+x #退出
2、设置dns
cp /etc/resolv.conf /etc/resolv.confbak #备份原有dns配置文件
nano /etc/resolv.conf #编辑配置文件
nameserver 8.8.8.8 #设置首选dns
nameserver 8.8.4.4 #设置备用dns
ctrl+o #保存配置
ctrl+x #退出
系统运维  温馨提醒:qihang01原创内容版权所有,转载请注明出处及原文链接
3、重启网络
service networking restart #重启网络
至此,IP地址、网关、DNS配置完成,现在系统已经可以上网了。