免插件实现wordpress远程图片文件自动本地化

其实有很多插件是可以实现wordpress远程图片本地化的,例如auto_save_image就比较不错。不过如果你是代码控,不喜欢用插件,那么下面这段“wordpress远程图片自动本地化“的代码也许适合你。

把下面代码加入主题的functions.php文件即可。

add_filter(‘content_save_pre’, ‘auto_save_image’);
function auto_save_image($content) {
$upload_path = ”;
$upload_url_path = get_bloginfo(‘url’);
//上传目录
if (($var = get_option(‘upload_path’)) !=”){
$upload_path = $var;
} else {
$upload_path = ‘wp-content/uploads’;
}
if(get_option(‘uploads_use_yearmonth_folders’)) {
$upload_path .= ‘/’.date(“Y”,time()).’/’.date(“m”,time());
}
//文件地址
if(($var = get_option(‘upload_url_path’)) != ”) {
$upload_url_path = $var;
} else {
$upload_url_path = bloginfo(‘url’);
}
if(get_option(‘uploads_use_yearmonth_folders’)) {
$upload_url_path .= ‘/’.date(“Y”,time()).’/’.date(“m”,time());
}
require_once (“../wp-includes/class-snoopy.php”);
$snoopy_Auto_Save_Image = new Snoopy;
$img = array();
//以文章的标题作为图片的标题
if ( !empty( $_REQUEST[‘post_title’] ) )
$post_title = wp_specialchars( stripslashes( $_REQUEST[‘post_title’] ));
$text = stripslashes($content);
if (get_magic_quotes_gpc()) $text = stripslashes($text);
preg_match_all(“/ src=(\”|\’){0,}(http:\/\/(.+?))(\”|\’|\s)/is”,$text,$img);
$img = array_unique(dhtmlspecialchars($img[2]));
foreach ($img as $key => $value){
set_time_limit(180); //每个图片最长允许下载时间,秒
if(str_replace(get_bloginfo(‘url’),””,$value)==$value&&str_replace(get_bloginfo(‘home’),””,$value)==$value){
//判断是否是本地图片,如果不是,则保存到服务器
$fileext = substr(strrchr($value,’.’),1);
$fileext = strtolower($fileext);
if($fileext==””||strlen($fileext)>4)
$fileext = “jpg”;
$savefiletype = array(‘jpg’,’gif’,’png’,’bmp’);
if (in_array($fileext, $savefiletype)){
if($snoopy_Auto_Save_Image->fetch($value)){
$get_file = $snoopy_Auto_Save_Image->results;
}else{
echo “error fetching file: “.$snoopy_Auto_Save_Image->error.”<br>”;
echo “error url: “.$value;
die();
}
$filetime = time();
$filepath = “/”.$upload_path;//图片保存的路径目录
!is_dir(“..”.$filepath) ? mkdirs(“..”.$filepath) : null;
//$filename = date(“His”,$filetime).random(3);
$filename = substr($value,strrpos($value,’/’),strrpos($value,’.’)-strrpos($value,’/’));
//$e = ‘../’.$filepath.$filename.’.’.$fileext;
//if(!is_file($e)) {
// copy(htmlspecialchars_decode($value),$e);
//}
$fp = @fopen(“..”.$filepath.$filename.”.”.$fileext,”w”);
@fwrite($fp,$get_file);
fclose($fp);
$wp_filetype = wp_check_filetype( $filename.”.”.$fileext, false );
$type = $wp_filetype[‘type’];
$post_id = (int)$_POST[‘temp_ID2’];
$title = $post_title;
$url = $upload_url_path.$filename.”.”.$fileext;
$file = $_SERVER[‘DOCUMENT_ROOT’].$filepath.$filename.”.”.$fileext;
//添加数据库记录
$attachment = array(
‘post_type’ => ‘attachment’,
‘post_mime_type’ => $type,
‘guid’ => $url,
‘post_parent’ => $post_id,
‘post_title’ => $title,
‘post_content’ => ”,
);
$id = wp_insert_attachment($attachment, $file, $post_parent);
$text = str_replace($value,$url,$text); //替换文章里面的图片地址
}
}
}
$content = AddSlashes($text);
remove_filter(‘content_save_pre’, ‘auto_save_image’);
return $content;
}
function mkdirs($dir)
{
if(!is_dir($dir))
{
mkdirs(dirname($dir));
mkdir($dir);
}
return ;
}
function dhtmlspecialchars($string) {
if(is_array($string)) {
foreach($string as $key => $val) {
$string[$key] = dhtmlspecialchars($val);
}
}else{
$string = str_replace(‘&’, ‘&’, $string);
$string = str_replace(‘”‘, ‘”‘, $string);
$string = str_replace(‘<‘, ‘<‘, $string);
$string = str_replace(‘>’, ‘>’, $string);
$string = preg_replace(‘/&(#\d;)/’, ‘&\1’, $string);
}
return $string;
}

资料来源:http://www.v7v3.com/wpjiaocheng/2014051171.html

在WordPress文章任意段落插入广告代码

在WordPress的文章内插入广告对用户体验会有所影响,但从技术角度来讲是可以实现的。下面就给大家分享一下如果在WordPress文章内插入广告代码,支持将广告代码插入文章的任意段落后面。

将下面的代码添加到当前主题的functions.php 即可:

//在文章内容的第二段后面插入广告
add_filter( 'the_content', 'prefix_insert_post_ads' );
function prefix_insert_post_ads( $content ) {
	$ad_code = '<div>添加你的广告代码</div>'; 
	if ( is_single() && ! is_admin() ) {
		// 修改 2 这个段落数
		return prefix_insert_after_paragraph( $ad_code, 2, $content );
	}
	return $content;
}   // 插入广告所需的功能代码
function prefix_insert_after_paragraph( $insertion, $paragraph_id, $content ) {
	$closing_p = '</p>';
	$paragraphs = explode( $closing_p, $content );
	foreach ($paragraphs as $index => $paragraph) {
		if ( trim( $paragraph ) ) {
			$paragraphs[$index] .= $closing_p;
		}
		if ( $paragraph_id == $index + 1 ) {
			$paragraphs[$index] .= $insertion;
		}
	}
	return implode( '', $paragraphs );
}
如果你是WordPress插件控,那么使用 Insert Post Ads 插件也可以达到你的要求。
资料来源

正确地移除WordPress版本号的方法

有时候出于安全考虑,很多WordPress博主、站长都会移除WordPress版本号得显示,网上流传最多的方法是在主题的functions.php中添加代码:“remove_action(‘wp_head’, ‘wp_generator’);” 不过大家也许不知道的是,这种方法并没有完全移除WordPress版本号显示(因为wordpress除了会在正文输出版本号,还会在feed中输出版本号,另外,为了更新缓存,某些css和js结尾也会附上WordPress版本号),所以说采用上述方法仅仅只是移除了wordpress正文中的版本号。

正确移除移除WordPress版本号的方法,在当前主题的functions.php中添加以下代码:

 

// 同时删除head和feed中的WP版本号
function ludou_remove_wp_version() {
  return ”;
}
add_filter(‘the_generator’, ‘ludou_remove_wp_version’);
// 隐藏js/css附加的WP版本号
function ludou_remove_wp_version_strings( $src ) {
  global $wp_version;
  parse_str(parse_url($src, PHP_URL_QUERY), $query);
  if ( !empty($query[‘ver’]) && $query[‘ver’] === $wp_version ) {
    // 用WP版本号 + 12.8来替代js/css附加的版本号
    // 既隐藏了WordPress版本号,也不会影响缓存
    // 建议把下面的 12.8 替换成其他数字,以免被别人猜出
    $src = str_replace($wp_version, $wp_version + 12.8, $src);
  }
  return $src;
}
add_filter( ‘script_loader_src’, ‘ludou_remove_wp_version_strings’ );
add_filter( ‘style_loader_src’, ‘ludou_remove_wp_version_strings’ );

 

资料来源:http://www.ludou.org/remove-wordpress-version.html

为wordpress后台HTML编辑器添加自定义标签按钮

为WordPress后台的 HTML 编辑器添加自定义标签按钮可以在编辑文章不用手动输入标签,显得十分方便。不过wordpress默认的快捷标签按钮有时候不能满足我们的需求,那么我们否可以自定义添加自己想要的快捷按钮呢?其实在wordpress后台HTML编辑器添加自定义标签按钮的方法很简单,打开你主题的functions.php文件,在其中添加下面的代码(一般添加在最后,”?>“结束之前)

//添加HTML编辑器自定义快捷标签按钮
add_action(‘after_wp_tiny_mce’, ‘bolo_after_wp_tiny_mce’);
function bolo_after_wp_tiny_mce($mce_settings) {
?>
<script type=”text/javascript”>
QTags.addButton( ‘hr’, ‘横线’, “\n<hr />\n”, “” );
QTags.addButton( ‘h1’, ‘标题1’, “\n<h1>”, “</h1>\n” );
QTags.addButton( ‘h2’, ‘标题2’, “\n<h2>”, “</h2>\n” );
QTags.addButton( ‘h3’, ‘标题3’, “\n<h3>”, “</h3>\n” );
QTags.addButton( ‘wp_page’, ‘分页按钮’, “<!–nextpage–>\n”, “” );
function bolo_QTnextpage_arg1() {
}
</script>
<?php
}

代码解析:

QTags.addButton( ”, ”, ”, ” );

【四对引号,分别表示按钮的ID、按钮显示名、点一下输入内容、再点一下关闭内容(最后一对引号为空则一次输入全部内容),\n表示换行】

形象说明: QTags.addButton( ‘ 按钮ID’, ‘按钮显示名’, ‘点一下输入内容’, ‘点一下关闭内容’ );

可以自定义添加多行 QTags.addButton( ”, ”, ”, ” ); 增加多个按钮!

wordpress文章ID连续终极技巧

wordpress的ID连续问题让很多强迫症患者头疼不已,本人也是其中一个。大家都知道,wordpress的修订版本、自动保存、以及上传图片都会占用文章ID,图片占用id我没话说,但是wordpress的修订版本、自动保存也占用ID就实在心里不舒服(wordpress的修订版本及自动保存个人认为除了占用数据库外,没什么好处的)。以前都是采用修改 WordPress 原文件的方法屏蔽自建 auto-draft 记录,但是似乎目前没有适合 3.6 之后版本的办法,而且每次升级都需要修改原文件,既麻烦又不安全。

下面实现wordpress文章ID连续的方法来自网上,经本人测试有效,特分享给大家。

只要将下面的代码插入到主题functions.php中就可以了,支持 WordPress 3.0~3.6 的任何版本,而且未来升级也不会影响功能。

function keep_id_continuous(){
global $wpdb;
$lastID = $wpdb->get_var(“SELECT ID FROM $wpdb->posts WHERE post_status = ‘publish’ OR post_status = ‘draft’ OR post_status = ‘private’ OR ( post_status = ‘inherit’ AND post_type = ‘attachment’ ) ORDER BY ID DESC LIMIT 1”);
$wpdb->query(“DELETE FROM $wpdb->posts WHERE ( post_status = ‘auto-draft’ OR ( post_status = ‘inherit’ AND post_type = ‘revision’ ) ) AND ID > $lastID”);
$lastID++;
$wpdb->query(“ALTER TABLE $wpdb->posts AUTO_INCREMENT = $lastID”);
}
// 将函数钩在新建文章、上传媒体和自定义菜单之前.
add_filter( ‘load-post-new.php’, ‘keep_id_continuous’ );
add_filter( ‘load-media-new.php’, ‘keep_id_continuous’ );
add_filter( ‘load-nav-menus.php’, ‘keep_id_continuous’ );
// 禁用自动保存,所以编辑长文章前请注意手动保存.
add_action( ‘admin_print_scripts’, create_function( ‘$a’, “wp_deregister_script(‘autosave’);” ) );
// 禁用修订版本
remove_action( ‘pre_post_update’ , ‘wp_save_post_revision’ );

原理为:如果新建文章或上传图片就获取数据库中最后一条有用记录(post_type 为 publish、draft 或 private 的行或 post_type 为 inherit 且类型为 attachment 的行)的 ID,并把之后的无用行(post_type 为 auto-draft 的行和 post_type 为 inherit 且类型为 revision 的行)删除掉,再重设自增。这样无论如何新建文章,数据库中最多有且仅有一条 auto-draft 记录(WordPress 刚刚创建的行,保存之后 post_type 变为 publish、draft 或 private),这样文章 ID 就能连续了。

此段代码经过本人测试,没有发现问题,不过由于代码涉及到DELETE这条极其危险的 MySQL 语句,所以是否使用还请各位自己想清楚。

资料来源:http://xiaoxia.de/keep-wordpress-post-id-continuous/

给WordPress评论框,投稿页面添加算术验证码功能

给wordpress增加算术验证码功能可以在一定程度上防止垃圾评论。给投稿页面增加算术验证码则可以阻止机器人投稿。下面先介绍怎么给wordpress评论增加算术验证码。

打开网站根目录下的 wp-comments-post.php,查找:
if ( ” == $comment_content )
在此代码的上面增加:
if ( !$user->ID ) {
$aaa = trim($_POST[aaa]);
$bbb = trim($_POST[bbb]);
$subab = trim($_POST[subab]);
if((($aaa+$bbb)!=$subab)|| empty($subab)){
wp_die( ‘错误提示:请正确输入的两数字相加的结果.’ );
}
}

然后在主题的comments.php文件中找到评论表单的位置,在适当的地方插入如下代码:
我的是在<!– comment input –>上添加以下代码
<?php if (!$user_ID) : ?>
<?php $aaa=rand(0,5); $bbb=rand(3,9); ?>
<p><label>验证码:</label><input type=”text” name=”subab” id=”subab” size=”2″ tabindex=”5″ style=”width:50px” />=<?php echo $aaa; ?>+<?php echo $bbb; ?><small><span style=”color:red;”>(必填)</span></small><span>请输入两数相加的结果.</span>
<input name=”aaa” value=”<?php echo $aaa; ?>” type=”hidden” />
<input name=”bbb” value=”<?php echo $bbb; ?>” type=”hidden” /></p>
<?php endif; ?>
修改后的文件保存的编码必须为utf-8,否则会出现中文口字了

折腾完给wordpress评论增加算术验证码,那么再折腾一下给wordpress的投稿页面增加算术验证码功能。我的投稿功能代码是采用该篇文章中的代码:http://www.articn.com/post/261.html

在投稿代码中的

if ( empty($content) || mb_strlen($content) > 3000 || mb_strlen($content) < 100) {
wp_die(‘内容必须填写,且长度不得超过3000字,不得少于100字。<a href=”‘.$current_url.'”>点此返回</a>’);
}

下面增加

if ( !$user->ID ) {
$sum=$_POST[‘sum’];
switch($sum){
//得到正确的计算结果则直接跳出
case $_POST[‘num1’]+$_POST[‘num2’]:break;
//未填写结果时的错误讯息
case null:wp_die(‘错误: 你还没有填写算术结果呢!<a href=”‘.$current_url.'”>点此返回</a>’);break;
//计算错误时的错误讯息
default:wp_die(‘错误: 哎呀,这样的算术题你都能算错?重试一下吧!<a href=”‘.$current_url.'”>点此返回</a>’);
}
}

然后再在投稿框的某个位置加上(我是加在“分类”的下面)

<?php if (!$user_ID) : ?>
<?php
$num1=rand(0,9);
$num2=rand(0,9);
echo”<div class=’row’>”
.”<label for=’math’ class=’small’><span style=”color:red;”>验证码(必填):</span></label>”
.”$num1 + $num2 = <input type=’text’ name=’sum’ class=’math_textfield’ value=” tabindex=’1′>”
.”<input type=’hidden’ name=’num1′ value=’$num1′>”
.”<input type=’hidden’ name=’num2′ value=’$num2′>”
.”<label for=’math’ class=’small’> 请输入两数之和</label>”
.”</div>”;
?>
<?php endif; ?>

wordpress常用循环结构(query_posts、WP_Query、get_posts)介绍

wordpress循环结构是一个主题模版的最重要的部分,当你打开index.php文件的时候通常都会看见很具代表性的 if(have_posts()) 语句,包含在其中的就是wordpress的循环结构语句,当然默认的循环方法已经可以很完美的运行在执行单一循环的主题中,但是如果你想制作更加高级的设计,我们就应该了解一些多样性的自定义循环,所以学习更加强大的循环是十分必要的。幸运的是wordpress已经为我们提供了四种灵活的循环结构供我们使用。

  • 默认循环
  • query_posts() 循环
  • WP_Query() 循环
  • get_posts() 循环

这几种循环方式足以应付各种各样的需求,它们都各自都包含了相同的底层功能,接受查询参数的方式从本质上来说也是相同的。这四种技术可以同时运用到你的wordpress主题中。如果你想查看默认循环,最直接方式是打开index.php文件它就包含在里面。它们的功能就是将存储在数据库中的文章循环出来,通过浏览器显示给用户,然后根据模版标签轻松的循环出文章标题、内容、关键词甚至更多内容,下面我们就来认识一下这四种wordpress循环方式。

默认循环
默认循环通常看起来像这样:

<?php if (have_posts()) : while (have_posts()) : the_post(); ?>
<div <?php post_class(); ?> id=”post-<?php the_ID(); ?>”>
<h1><a href=”<?php the_permalink(); ?>”><?php the_title(); ?></a></h1>
<?php the_content(); ?>
</div>
<?php endwhile; ?>
<div class=”navigation”>
<div class=”next-posts”><?php next_posts_link(); ?></div>
<div class=”prev-posts”><?php previous_posts_link(); ?></div>
</div>
<?php else : ?>
<div <?php post_class(); ?> id=”post-<?php the_ID(); ?>”>
<h1>Not Found</h1>
</div>
<?php endif; ?>

那么为什么要使用默认循环?因为大部分情况下默认循环可以为我们循环出文章发布的内容,起初对于大多数主题来说都会使用这种默认循环。它会告诉wordpress通过循环遍历出所有发布的文章信息,包括各种各样的模版标签(文章标题,文章内容..),它会根据有效的标签来识别存储在数据库中的数据种类。

根据发送的数据查询,默认循环将会根据日期或者分类栏目中遍历出一定数量的文章等等。

所以如果只想做一些基本的遍历方式默认循环已经运行的非常好了,如果你想做的更多就应该自定义一些查询条件使它为你做更多的事情。

query_posts()循环

query_posts 循环功能可以让我们修改查询和修改想要获取的文章信息,我们只需要修改一些参数来覆盖之前的查询方式。

<?php global $query_string; // 必须
$posts = query_posts($query_string.’&cat=-9′); // 排除 category 9 ?>
<?php //循环内容 ?>
<?php wp_reset_query(); // 重置 query ?>

如果你有一个默认的循环方式,但是你想改变一下文章显示的数量,并且排除两个分类栏目的文章,最后还要按照正序排序的方式遍历出来,那么你只需在循环之前添加变量参数即可。

<?php global $query_string; // 必需
$posts = query_posts($query_string.’&posts_per_page=3&cat=-6,-9&order=ASC’); ?>
<?php // 循环内容?>
<?php wp_reset_query(); // 重置 query ?>

当然如果你愿意你同样可以使用以下代码覆盖第二句查询,实现的效果是一样的。

$posts = query_posts(‘posts_per_page=3&cat=-6,-9&order=ASC’);

值得注意的一点就是我们已经将$query_string参数 从query_posts中移除了。但这意味着很可能显示不出分页信息,所以在移除该参数之前应该清楚自己想要什么样的效果。

在什么样的情况下可以使用? 我们可以使用query_posts 对参数的修改修改来执行一些简单的循环,包括限制文章显示数量,排除指定分类栏目,标签等等。 如果你需要更加强大复杂的循环方式当然query_posts也可以胜任,但是最好方式是使用WP_Query。

WP_Query()循环

为了想完全控制文章循环的数量,WP_Query 可以胜任这一任务,当我尝试去修改默认的循环方式时,它看起来和query_posts非常相似。例如,使用WP_Query排除一些指定的category:

<?php $custom_query = new WP_Query(‘cat=-9’); // 排除 category 9
while($custom_query->have_posts()) : $custom_query->the_post(); ?>
<div <?php post_class(); ?> id=”post-<?php the_ID(); ?>”>
<h1><a href=”<?php the_permalink(); ?>”><?php the_title(); ?></a></h1>
<?php the_content(); ?>
</div>
<?php endwhile; ?>
<?php wp_reset_postdata(); // reset the query ?>

它接收了与query_posts相同的参数,包括排除或者包括指定categories以及修改显示文章数量上它们基本上时一致的。但是你再看一下下面这几段代码你就会发现在使用自定义循环方面 WP_Query 会方便许多而且也非常容易修改参数。

$custom_query = new WP_Query(‘cat=-7,-8,-9’); // 排除指定 categories
$custom_query = new WP_Query(‘posts_per_page=3’); // 限制文章显示数量
$custom_query = new WP_Query(‘order=ASC’); // 按照正序排序

正如我们所想的那样,WP_Query 可以使用与query_posts 和get_posts相同的组合语法进行循环调用。

$custom_query = new WP_Query(‘posts_per_page=3&cat=-6,-9&order=ASC’);

需要注意的是,无论在什么情况下只要你使用了WP_Query循环,那么我们就不再需要$query_string这个变量了,除了使用WP_Query 自定义默认循环外,我们也可以使用它来自定义更加多样的循环,以下是代码示例:

<?php // 循环1
$first_query = new WP_Query(‘cat=-1’);
while($first_query->have_posts()) : $first_query->the_post();

endwhile;
wp_reset_postdata();
// 循环2
$second_query = new WP_Query(‘cat=-2’);
while($second_query->have_posts()) : $second_query->the_post();

endwhile;
wp_reset_postdata();
// 循环 3
$third_query = new WP_Query(‘cat=-3’);
while($third_query->have_posts()) : $third_query->the_post();

endwhile;
wp_reset_postdata();
?>

以上每一种循环方式都可以使用到你主题的任何地方,无需为它们进行排序,例如第一个循环可以放在侧边栏的位置,第二个放在页脚的位置等等。每一种循环都很容易使用,你可以输入一些有效的参数对其进行修改。

在什么样的情况下可以使用? WP_Query 可以用在多样的自定义循环中,通过设置一些额外的功能,你可以创建任意数量的多个循环然后自定义每一种循环的输出方式。

尽管如此,我们也并不需要每一次都派它上场,有些简单循环你可以用之前的两种循环就足够了。

get_posts() 循环

使用get_posts() 可以在你的主题中很方便的创建多样化的循环,使用这种方法也是比较安全可靠的,你可以在任何地方快速的遍历出文章,你可以尝试使用 get_posts 。假如你想遍历出最新发布的十篇文章,或者随机发表的文章。使用get_posts将变得非常容易,下面是一些简单的例子:

<?php global $post; // 必需
$args = array(‘category’ => -9); // 排除 category 9
$custom_posts = get_posts($args);
foreach($custom_posts as $post) : setup_postdata($post);

endforeach;
?>

值得注意的是,无论什么情况下, get_posts是需要一个数组接收参数的,以下是使用数组的组合方式

$args = array(‘numberposts’=>3, ‘category’=>-6,-9, ‘order’=>’ASC’);

资料来源