• WordPress主题自带Widget翻译无效解决方法

    问题描述

    最近在将前些天做的zAlive主题优化,准备向WordPress官方目录提交,优化过程中不可避免的要将主题国际化(翻译,多语言)。问题出来了:语言包制作好之后,前台页面的翻译没问题,但是后台Widget中主题添加的Widget没有翻译过来。

    解决过程

    起初我只注意到Widget没有翻译过来,于是就向谷歌求救,结果一无所获,然后又翻看WordPress国际化方案,当看到I18n for widgets developed on 2.8+ 时以为Widget的翻译需要用load_plugin_textdomain这个函数,而非load_theme_textdomain。但是事实也并非如此,在我尝试了好多次之后翻译依然无效。

    毫无头绪的我着实懵了,后来在无意中点击到了菜单设置页面,发现菜单也没翻译过来,我就在想是不是所有的主题都这样,WordPress本身就这样?于是将主题切换为WordPress自带的Twenty Twelve,而Twenty Twelve中无论Widget还是菜单翻译都没问题,英文环境下Widget和菜单都是英文,中文环境下Widget和菜单都是中文。看来是我的主题哪里不对劲!

    打开Twenty Twelve的functions.php 发现load_theme_textdomain的调用在add_action( ‘after_setup_theme’, ‘twentytwelve_setup’ );中的twentytwelve_setup函数最上方。对比我的zAlive主题中的functions.php发现我用的是add_action( ‘init’, ‘zAlive_theme_setup’ ),看来问题就在这里,我又打开WordPress Action_Reference发现init在after_setup_theme之后。

    WordPress Action

    WordPress Action

    总结

    Widget以及菜单翻译问题在我将init修改为after_setup_theme后解决了,看来问题就是action的执行顺序造成的,大家以后在做主题的时候还是用after_setup_theme好了

  • WordPress单日志添加AD及sidebar小工具的应用

    1、单日志添加AD(如Google AD)

    WordPress中single.php是单篇日志模板,如果需要在单篇日志中加入GoogleAdSense或是其他广告,这样做。

    找到你所在主题中single.php如下代码

    <?php the_content(); ?>

    在其前面加入

    <!– AD START –>
    <div style=”float:right;margin-left:5px;”>
    此处放入广告代码
    </div>
    <!– AD END –>

    这样修改后效果是广告在日志右上角显示,效果在我的日志中就可以看到。

    如果要改为左上角显示可以在<?php the_content(); ?>前面加入如下代码(这些都是DIV+CSS的应用,有基础的朋友可以根据情况自己修改)

    <!– AD START –>
    <div style=”float:left;margin-right:5px;”>
    此处放入广告代码
    </div>
    <!– AD END –>

    2、WordPress中sidebar小工具的应用

    现在大部分WordPress主题都包含了小工具(widget),本文主要介绍下WordPress中小工具的原理。

    A sidebar中只有1个widget

    (1) WordPress主题所在目录中functions.php中的如下代码是注册一个widget

    if ( function_exists(‘register_sidebar’) )
        register_sidebar(array(
            ‘before_widget’ => ‘<div id=”%1$s”>’,
            ‘after_widget’ => ‘</div>’,
            ‘before_title’ => ‘<h3>’,
            ‘after_title’ => ‘</h3>’,
        ));

    (2) sidebar中的如下代码是用来显示这些注册过的widget中的内容

    <?php if ( !function_exists(‘dynamic_sidebar’)|| !dynamic_sidebar() ) : ?>
    <?php endif; ?>

    (3)有了这些代码后我们就可以在WordPress后台的小工具中随意添加代码了。

    另外如果没有(1)中的代码,那么在后台就查看不到小工具了,此时就相当于主题不支持widget,如果没有(2)中的代码,在WordPress后台能添加widget,但是在WordPress中不能显示这些widget中的内容。

    B sidebar中有多个widget

    (1) 和只有1个widget情况类似,只是functions.php中相关代码改为如下(此例中有两个widget,名字分别为widget1 widget2)

    if( function_exists(‘register_sidebar’) ) {
     register_sidebar(array(
      ‘name’ => ‘widget1’,
      ‘before_widget’ => ‘<div id=”%1$s”>’,
      ‘after_widget’ => ‘</div>’,
      ‘before_title’ => ‘<h3>’,
      ‘after_title’ => ‘</h3>’
     ));
     register_sidebar(array(
      ‘name’ => ‘widget2’,
      ‘before_widget’ => ‘<div id=”%1$s”>’,
      ‘after_widget’ => ‘</div>’,
      ‘before_title’ => ‘<h3>’,
      ‘after_title’ => ‘</h3>’
     ));
    }

    (2) sidebar中的如下代码是显示注册过的widget1和widget2中的内容

    <?php if ( !function_exists(‘dynamic_sidebar’)|| !dynamic_sidebar(widget1) ) : ?>
    <?php endif; ?>

    <?php if ( !function_exists(‘dynamic_sidebar’)|| !dynamic_sidebar(widget2) ) : ?>
    <?php endif; ?>

    注:在以上A和B中的步骤(1)中register_sidebar的参数要因主题的不同需要做修改,用法可以参考http://codex.wordpress.org/Function_Reference/register_sidebar