WordPress不用插件实现AJAX登陆

编辑footer.php在</body>前添加如下代码:

<form id="login" action="login" method="post">
  <h1>网站登陆</h1>
  <p class="status"></p>
  <label for="username">用户名</label>
  <input id="username" type="text" name="username"><label for="password">密码</label>
  <input id="password" type="password" name="password">
  <a class="lost" href="<?php echo wp_lostpassword_url(); ?>">忘记密码?</a>
  <input class="submit_button" type="submit" value="Login" name="submit">
  <a class="close" href="">(关闭)</a>
  <?php wp_nonce_field( 'ajax-login-nonce', 'security' ); ?>
</form>

在要显示登陆链接的地方,添加如下代码:

<?php if (is_user_logged_in()) { ?>
    <a class="login_button" href="<?php echo wp_logout_url( home_url() ); ?>">退出</a>
<?php } else { ?>
    <a class="login_button" id="show_login" href="">登陆</a>
<?php } ?>

CSS文件,添加至style.css

form#login{
    display: none;background-color: #FFFFFF;position: fixed;top: 200px;padding: 40px 25px 25px 25px;width: 350px;z-index: 999;left: 50%;margin-left: -200px;
}

form#login p.status{
    display: none;
}

.login_overlay{
    height: 100%;width: 100%;background-color: #F6F6F6;opacity: 0.9;position: fixed;z-index: 998;
}

在funcitons.php添加如下代码:

function ajax_login_init(){
    wp_register_script('ajax-login-script', get_template_directory_uri() . '/ajax-login-script.js', array('jquery') ); 
    wp_enqueue_script('ajax-login-script');

    wp_localize_script( 'ajax-login-script', 'ajax_login_object', array( 
        'ajaxurl' => admin_url( 'admin-ajax.php' ),'redirecturl' => home_url(),'loadingmessage' => __('正在登陆,请稍后...')));

    add_action( 'wp_ajax_nopriv_ajaxlogin', 'ajax_login' );
}

if (!is_user_logged_in()) {
    add_action('init', 'ajax_login_init');
}

function ajax_login(){
    check_ajax_referer( 'ajax-login-nonce', 'security' );

    $info = array();
    $info['user_login'] = $_POST['username'];
    $info['user_password'] = $_POST['password'];
    $info['remember'] = true;

    $user_signon = wp_signon( $info, false );if ( is_wp_error($user_signon) ){
        echo json_encode(array('loggedin'=>false, 'message'=>__('Wrong username or password.')));
    } else {
        echo json_encode(array('loggedin'=>true, 'message'=>__('Login successful, redirecting...')));
    }

    die();
}

JS文件内容如下:

jQuery(document).ready(function($) {
    $('a#show_login').on('click', function(e){
        $('body').prepend('<div class="login_overlay"></div>');
        $('form#login').fadeIn(500);
        $('div.login_overlay, form#login a.close').on('click', function(){
            $('div.login_overlay').remove();
            $('form#login').hide();
        });
        e.preventDefault();
    });

    $('form#login').on('submit', function(e){
        $('form#login p.status').show().text(ajax_login_object.loadingmessage);
        $.ajax({
            type: 'POST',
            dataType: 'json',
            url: ajax_login_object.ajaxurl,
            data: { 
                'action': 'ajaxlogin',
                'password': $('form#login #password').val(), 
                'security': $('form#login #security').val()
            },
            success: function(data){
                $('form#login p.status').text(data.message);if (data.loggedin == true){
                    document.location.href = ajax_login_object.redirecturl;
                }
            }
        });
        e.preventDefault();
    });
});

在WordPress后台隐藏自定义字段

如果你想在写博客的时候保持日志编辑页面尽量的简洁,你可以通过下面的代码把 WordPress 自定义字段隐藏起来。在你主题的 functions.php 文件中添加以下代码:

add_action('admin_init','hideMetaBoxes');
function hideMetaBoxes() {
	remove_meta_box('postcustom','post','normal');
}

如何从WordPress页面菜单中移除特定页面

从 wp_list_pages() 中生成的页面菜单中移除特定的页面是非常简单的,只需要把下面代码加入到主题的 functions.php 文件中:

// add page ids to the exclude list
add_filter( 'wp_list_pages_excludes', 'bannedPages' );
function bannedPages( $exclude_array ) {
  return array_merge( $exclude_array, array( 4, 17 ) );
}

只需要把数组中的数字改成你要移除页面 ID 就可。

WordPress在Windows主机IIS下设置固定链接实现真正的伪静态方法

[ISAPI_Rewrite]
# Defend your computer from some worm attacks
#RewriteRule .*(?:global.asa|default.ida|root.exe|..).* . [F,I,O]
# 3600 = 1 hour
CacheClockRate 3600
RepeatLimit 32
# Protect httpd.ini and httpd.parse.errors files
# from accessing through HTTP
# Rules to ensure that normal content gets through
RewriteRule /software-files/(.*) /software-files/$1 [L]
RewriteRule /images/(.*) /images/$1 [L]
RewriteRule /sitemap.xml /sitemap.xml [L]
RewriteRule /favicon.ico /favicon.ico [L]
# For file-based wordpress content (i.e. theme), admin, etc.
RewriteRule /wp-(.*) /wp-$1 [L]
# For normal wordpress content, via index.php
RewriteRule ^/$ /index.php [L]
RewriteRule /(.*) /index.php/$1 [L]

保存为httpd.ini,传到web目录,然后在固定链接中设置为自己想要的就可以了

分享一下WordPress更改域名地址无需修改数据库的三种方法

大家知道,WP博客更改域名地址,在成功导入数据库和转移网站数据库后,还需要修改HOME和SITEURL两个地址。一般大家都是通过修改数据库,其实不用那么麻烦和危险,哈哈。通过修改配置文件也可以的。

第一种、修改wp-config.php

1、在wp-config.php中,添加以下两行内容:

define('WP_HOME','http://www.newdomain.com');
define('WP_SITEURL','http://www.newdomain.com');

www.newdomain.com 代表你的新地址

2、登录后台,在 “常规 -> 设置”重新配置新博客地址(HOME)和安装地址(SITEURL),成功后一定记得删除上面添加的内容。

第二种、修改functions.php

functions.php指的是位于当前博客主题目录内,可以自定义一些主题函数。

1、在functions.php中,添加以下两行内容:

update_option('siteurl','http://www.newdomain.com');
update_option('home','http://www.newdomain.com');

同样,www.newdomain.com代表你的新地址

2、登录后台,在 “常规 -> 设置”重新配置新博客地址(HOME)和安装地址(SITEURL),成功后一定记得删除上面添加的内容。

第三种、修改wp-config.php(自动更新地址)

1、在wp-config.php中,添加下面一行内容:

define('RELOCATE',true);

2、登录后台地址,WP将自动更新安装地址(SITEURL),手动修改博客地址(HOME)地址即可,成功后一定记得删除上面添加的内容。

总结

很显然,第三种是最简单的,无需填写新的博客域名地址,最重要的是一定记得删除添加过的内容咯。

无需输入FTP信息就能升级WordPress及插件

你是否碰到这样的情况:当添加,删除,升级 WordPress 插件或者直接升级 WordPress 的时候,WordPress 总是提示让你输入 FTP 帐号信息,非些烦人。如果你使用虚拟主机的话,一般不会出现这样的,但是如果你使用 VPS 或者 DV 的话,就很可能出现这种情况,因为 WordPress 是基于文件的所有者来判断的,如果你的服务器的用户名和文件的用户名不是一样的,那么 WordPress 就会让你通过 FTP 来进行更新。

但是每次输入 FTP 信息是非常烦人的,其实我们可以在 wp-config.php 中定义下面这些常量来让 WordPress 自动获取 FTP 信息,而无需每次手动输入:

//添加 FTP 信息,防止每次都提示输入
define('FTP_HOST', 'ftp.yoursite.com');
define('FTP_USER', 'Your_FTP_Username');
define('FTP_PASS', 'Your_FTP_password');
//如果你的 FTP 可以使用 SSL 连接,把下面设置为 True
define('FTP_SSL', true);

WordPress自动摘要的方法

修改 functions.php 文件

add_filter('the_content', 'autoExcerpts');
function autoExcerpts($content = false) {
  // If is the home page, an archive, or search results
  if(is_front_page() || is_archive() || is_search()) :
    global $post;
    $content = $post->post_excerpt;
    
    // If an excerpt is set in the Optional Excerpt box
    if($content) :
      $content = apply_filters('the_excerpt', $content);
    
    // If no excerpt is set
    else :
      $content = $post->post_content;
      $excerpt_length = 55;
      $words = explode(' ', $content, $excerpt_length + 1);
      if(count($words) > $excerpt_length) :
        array_pop($words);
        array_push($words, '...');
        $content = implode(' ', $words);
      endif;
      $content = '<p>' . $content . '</p>';
    endif;
  endif;
    
  // Make sure to return the content
  return $content;
}

当设置摘要的时候,会显示摘要。没有的时候就自动提取摘要

彻底解决WordPress中文截断产生乱码的方法

将以下两个函数写进主题所附带的functions.php文件中

function LimitChar($max_char = 200, $more_text = '...', $more_link_text = '', $limit_type = 'content') {
  if ($limit_type == 'title') {
    $limiter = get_the_title();
  } else {
    $limiter = get_the_content();
  }
  $limiter = apply_filters('the_content', $limiter);
  $limiter = strip_tags(str_replace(']]>', ']]>', $limiter));
  if (strlen($limiter) > $max_char) {
    $limiter = substr($limiter, 0, $max_char+1);
    $limiter = utf8Conver($limiter);
    echo $limiter;
    echo $more_text;
    if ($more_link_text != '') {
      echo ' <a href="'; echo the_permalink(); echo '">'.$more_link_text.'</a>';
    }
  } else {
    echo $limiter;
  }
}
      
function utf8Conver($str) {
  $len = strlen($str);
  for ($i=strlen($str)-1; $i>=0; $i-=1){
    $hex .= ' '.ord($str[$i]);
    $ch = ord($str[$i]);
    if (($ch & 128)==0) return(substr($str,0,$i));
    if (($ch & 192)==192) return(substr($str,0,$i));
  }
  return($str.$hex);
}

把模板文件中比如index.php中将截断函数替换成新的。

<?php LimitChar(200); ?>

给WordPress Page添加摘要输入框

SEO 一个方面就是给页面添加 Meta Description,虽然添加 Description 不会更改页面的权重,但是在 Google 等现代搜索引擎的搜索结果页面会直接使用 Description 来作为搜索结果,这样显示得更加友好,用户也能一眼就知道博客文章或者页面主要内容是什么,使得用户更加容易点击你的页面,增加博客的流量。

我一般是使用 WordPress 的摘要直接作为 Meta Description 进行 SEO,但是默认情况下 WordPress Page 编辑页面没有摘要(Excerpt)输入框,所以对 WordPress 进行 SEO 的时候比较麻烦。

这个时候我们就可以通过以下代码给我 WordPress Page 添加摘要输入框:

add_action( 'admin_menu', 'pageDescription' );
function pageDescription() {
  add_meta_box( 'postexcerpt', __('Excerpt'), 'post_excerpt_meta_box', 'page', 'normal', 'core' );
}

只需将以上的代码添加到当前主题的 functions.php 文件即可。当然你也可以添加一个插件头,作为一个单独插件使用。这样在 WordPress 后台编辑 Page 的时候和编辑 Post 一样有摘要输入框了。

如何控制WordPress文章标题的长度

其实解决这个问题很简单,只需要一句话就行了。在 WordPress 里,我们使用

<?php the_title(); ?>

来输出文章标题,与其相关的还有一个函数:

<?php get_the_title(); ?>

简单的说说两者的关系,get_the_title() 返回值是一个字符串(文章标题),而 the_title() 就是该字符串通过 echo 输出后的值。

实际上就是 WordPress 自己在输出文章标题时进行了简化,直接用

<?php the_title(); ?>

代替了

<?php echo get_the_title(); ?>

除此之外这里还需要用到另外一个函数:mb_strimwidth(string str, int start, int width, [string trimmarker], [string encoding]);

mb_strimwidth() truncates string str to specified width. It returns truncated string.

If trimmarker is set, trimmarker is appended to return value.

start is start position offset. Number of characters from the beginning of string. (First character is 0)

trimmarker is string that is added to the end of string when string is truncated.

encoding is character encoding. If it is omitted, internal encoding is used.

现在大部分的 PHP 服务器都支持了 MB 库(mbstring 库 全称是 Multi-Byte String 即各种语言都有自己的编码,他们的字节数是不一样的,目前php内部的编码只支持ISO-8859-*, EUC-JP, UTF-8 其他的编码的语言是没办法在 php 程序上正确显示的。解决的方法就是通过 php 的 mbstring 函数库来解决),所以我们可以放心的使用这个用于控制字符串长度的函数:

<?php echo mb_strimwidth(get_the_title(), 0, 38, '...'); ?>

那么我们只需要用上面这个函数替换 WordPress 原有的

<?php the_title(); ?>

即可,这里我输出了字符串的第0位到第38位,根据主题的不同可以自行设置该数值,另外多余长度部分使用“…”代替。

控制 WordPress 文章标题长度

其实我在控制文章摘要的时候也是使用的这个函数

<?php echo mb_strimwidth(strip_tags(apply_filters('the_content', $post->post_content)), 0, 470,"......"); ?>

来输出470个字符长度的摘要,并过滤了 HTML 标记。