多个WordPress网站如何共享用户表,并实现自动登录?

前提条件

  1. 主域名必须相同。可以是子目录或者子域名多站模式。
  2. 两个网站的数据表在同一个数据库中,只是表前缀不一样。

第一步、子站wp_config.php文件 $table_prefix = 'wp1_'; 下方添加

1
2
define('CUSTOM_USER_TABLE', 'wp_users');
define('CUSTOM_USER_META_TABLE', 'wp_usermeta');

第二步、主站主题functions.php文件添加代码,新增用户会自动同步权限

1
2
3
4
5
6
7
8
9
10
11
12
13
14
add_action( 'user_register', 'dup_capabilities' );
add_action('profile_update', 'dup_capabilities');
function dup_capabilities( $user_id ){
//在这里设置数据表前缀,不分主站子站,全部写上即可。
$prefixs = array('wp11_','wp12_','wp13_');
global $table_prefix;
$cap_val = get_user_meta( $user_id, $table_prefix.'capabilities',true);
if( !empty( $cap_val ) ) {
foreach( $prefixs as $prefix ){
if( $prefix != $table_prefix )
update_user_meta( $user_id, $prefix.'capabilities', $cap_val );
}
}
}

第三步、子站wp-config.php中的以下代码使用主站的代替

1
2
define('AUTH_KEY',         '{+Y:wtH~E}E2g7#$/_{%df9F2!9ed}m=E%^}%,[Z#;+R+vk]@q:x4u)?G,-#I89g'); 
define('SECURE_AUTH_KEY', ' -$Hdq00N4F|iv4n&|}W]h:U}5?+jUb%)G#zgr={ 4yvgSRO;h-K+}R;&n.AAFv0');

第四步、主站子站wp-config.php中上方代码块下方添加,其中123456789自己替换为复杂的字符串

1
2
3
4
5
6
define('SECRET_SALT', '123456789');
define('ADMIN_COOKIE_PATH', '/');
define('COOKIEPATH', '/');
define('SITECOOKIEPATH', '/');
define('COOKIEHASH', md5('123456789'));
define('COOKIE_DOMAIN', 'zhan5u.com');

WordPress如何禁用后台更新提示?

主题functions.php

1
2
3
4
5
6
add_filter('pre_site_transient_update_core',create_function('$a',"return null;")); // 关闭核心提示
add_filter('pre_site_transient_update_plugins',create_function('$a',"return null;")); // 关闭插件提示
add_filter('pre_site_transient_update_themes',create_function('$a',"return null;")); // 关闭主题提示
remove_action('admin_init','_maybe_update_core');// 禁止 WordPress 检查更新
remove_action('admin_init','_maybe_update_plugins');// 禁止 WordPress 更新插件
remove_action('admin_init','_maybe_update_themes'); // 禁止 WordPress 更新主题

wp-cinfig.php文件中

1
define('AUTOMATIC_UPDATAR_DISABLED',true);

jQuery控制html表单中select默认选中

select表单

1
2
3
4
5
<select class="form-control" name="account_country" id="account_country">
<option value="AR">Argentina</option>
<option value="AU">Australia</option>
<option value="AT">Austria</option>
</select>

jQuery控制选中

1
2
3
4
5
6
7
<script>
jQuery.noConflict();
jQuery(document).ready(function($){
//需要执行的代码放这里就可以了
$("#account_country").val("<?php echo get_user_meta( $user_id, "所属国家", true );?>");
});
</script>

WordPress如何制作前台表单,保存用户meta信息。

前台表单

1
2
3
4
5
6
7
8
9
<?php 
$current_user = wp_get_current_user();
?>
<form action="" method="post">
<label for="pv_shop_name">企业名称 *</label>
<input type="text" class="form-control" id="pv_shop_name" name="pv_shop_name" value="<?php echo esc_attr( $current_user->pv_shop_name); ?>">
<input type="hidden" name="ucenter_base_action" value="ucenter_base_action_save">
<button type="submit" class="btn btn-default">Submit</button>
</form>

functions.php 保存更新数据

1
2
3
4
5
6
7
8
9
10
11
12
function ucenter_base_action_save() {
if(isset($_POST['ucenter_base_action']) && $_POST['ucenter_base_action'] == 'ucenter_base_action_save') {
$current_user = wp_get_current_user();
$user_ID= $current_user->ID ;
update_user_meta( $user_ID, 'pv_shop_name', $_POST['pv_shop_name'] );
//跳转到新的页面,附加了一个参数。可以让新的页面获取到,并显示提示。
wp_redirect("http://www.zhan5u.com/ucenter/?mode=base");
exit;
}
}
//加入初始化中
add_action('init', 'ucenter_base_action_save');

WordPress如何在前台上传用户的头像图片

前台页面上传表单

1
2
3
4
5
6
7
8
9
10
11
<form action="" method="post" enctype="multipart/form-data">
<!-- 用户上传头像字段 -->
<div class="change-photo-btn">
<div class="photoUpload">
<span><i class="fa fa-upload"></i> 上传图像</span>
<input type="file" class="upload" name="simple_local_avatar"/>
</div>
</div>
<!-- 用户上传头像字段 -->
<button type="submit" class="btn btn-default">Submit</button>
</form>

functions.php 添加图片处理函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
//图片上传函数:上传单张图片
//参数1:图片信息; 参数2:存放图片路径
function upload_image($info,$path){
//获取图片后缀
$pre = strrchr($info["name"],".");
$img_name = date("YmdHis").$pre;
//错误过滤
if($info["error"]>0){
switch($info["error"]){
case 1: echo "文件大小超过php.ini设置的大小 2M。"; break;
case 2: echo "文件大小超过表单设置的大小。"; break;
case 3: echo "文件只有部分被上传。"; break;
case 4: echo "没有文件被上传。"; break;
case 6: echo "找不到临时文件夹。"; break;
case 7: echo "文件写入失败。"; break;
}
echo '<script>alert("返回添加图片页面。"); window.history.back(); </script>';
exit;
}
//图片类型过滤
$pic_arr = array("image/jpeg","image/jpg","image/pjpeg","image/png","image/x-png","image/gif");
if(!in_array($info["type"],$pic_arr)){
echo '<script>alert("上传的文件必须是 jpg、png、gif格式的。"); window.history.back();</script>';
exit;
}
//图片大小过滤
if($info["size"]>(10*1024*1024)){
echo '<script>alert("上传图片的大小不能超过 10M。"); window.history.back();</script>';
exit;
}
if(is_uploaded_file($info["tmp_name"])){
move_uploaded_file($info["tmp_name"],$path.$img_name);
return $img_name;
}
}

functions.php前台接受post信息并处理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
function ucenter_base_action_save() {
$current_user = wp_get_current_user();
$user_ID= $current_user->ID ;

$path = WP_CONTENT_DIR.'/uploads/users_avagar/'; //在 uploads目录下创建一个 users_avagar目录
if(!is_dir($path)){
mkdir($path);
}
$domain=$_FILES;
$files=$domain[simple_local_avatar];
//组合 图片url
$img_url = WP_CONTENT_URL.'/uploads/users_avagar/'.upload_image($files,$path);
// echo $img_url;
update_user_meta($user_ID,'用户头像',$img_url); //写入数据库

//跳转到新的页面,附加了一个参数。可以让新的页面获取到,并显示提示。
wp_redirect("http://www.xxx.com/ucenter/?mode=base");
exit;

}

//加入初始化中
add_action('init', 'ucenter_base_action_save');

前台调用

1
2
3
global $current_user;
get_currentuserinfo();
$user_id=$current_user->ID;
1
<img src="<?php echo get_user_meta( $user_id, "用户头像", true );?>" class="img-responsive">

前台输出post回的信息

1
2
3
$domain=$_FILES;
print_r($domain);
$files=$domain[simple_local_avatar];

JS是如何修改url中参数的?

[新的方法] 不需要URL中提前有次参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
function changeURLArg(arg,arg_val){
var url= this.location.href.toString();
var pattern=arg+'=([^&]*)';
var replaceText=arg+'='+arg_val;
if(url.match(pattern)){
var tmp='/('+ arg+'=)([^&]*)/gi';
tmp=url.replace(eval(tmp),replaceText);
//return tmp;
this.location = tmp;
   window.location.href=tmp
}else{
if(url.match('[\?]')){
tmp = url+'&'+replaceText;
this.location = tmp;
   window.location.href=tmp
}else{
tmp = url+'?'+replaceText;
this.location = tmp;
   window.location.href=tmp
}
}
}

<a href="javascript:void(0)" onclick='changeURLArg("category","<?php echo $category->term_id;?>")'><?php echo $category->name;?></a>

修改url的某个参数值 - 必要条件 当前URL 中有这个参数

1
2
3
4
5
6
7
8
//替换指定传入参数的值,paramName为参数,replaceWith为新值
function replaceParamVal(paramName,replaceWith) {
var oUrl = this.location.href.toString();
var re=eval('/('+ paramName+'=)([^&]*)/gi');
var nUrl = oUrl.replace(re,paramName+'='+replaceWith);
this.location = nUrl;
  window.location.href=nUrl
}
1
<a href="javascript:void(0)" onclick='replaceParamVal("category","<?php echo $category->term_id;?>")'><?php echo $category->name;?></a>

WordPress如何通过URL获取多个参数,并通过WP_Query查询

PHP判断URL参数是否存在已经参数的值

1
2
if(isset($_GET['Type']) && $_GET['Type']!="ALL"){
}

WP_Query 查询变量

1
2
3
4
5
6
7
8
$args=array(
'post_type' =>'post',
'cat' => $catnos,
'nopaging' => false,
'paged' => $paged,
'posts_per_page' => '10',
'posts_per_archive_page' => '10',
);

WP_Query 补充修改变量

1
2
3
4
// 获取分类
if (isset($_GET['category'])) {
$args[cat]=$_GET['category'];
}
1
2
3
4
5
6
7
8
9
// 获取国家
if (isset($_GET['country']) && $_GET['country']!="ALL") {
$country_query = array(
'key' => 'country',
'value' => $_GET['country'] ,
'compare' => '='
);
$meta_query[]=$country_query;
}
1
2
3
4
5
6
7
8
9
// 获取Type参数
if (isset($_GET['Type']) && $_GET['Type']!="ALL") {
$Type_query = array(
'key' => 'type',
'value' => $_GET['Type'] ,
'compare' => '='
);
$meta_query[]=$Type_query;
}
1
2
3
4
5
$meta_query[relation] = "AND";
$args[meta_query]=$meta_query;

$query = new WP_Query( $args );
wp_reset_query();
1
2
3
4
if( $query->have_posts() ):
while( $query->have_posts() ) : $query->the_post();
endwhile;
endif;

通过WP_Query查询特定meta的文章或产品,统计数量并保存为json文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$data = array();

$args = array(
'orderby' => 'title',
'order' => 'ASC',
'post_type' =>'post',
'nopaging' => true,
'meta_key' => '交易货币',
'meta_value' => 'United States',
);
$the_query = new WP_Query( $args );
wp_reset_postdata();
//重组数组
$data["United States"] = $the_query->post_count;

//数组转json
$json_string = json_encode($data);

//保存文件在网站根目录
file_put_contents(ABSPATH .'/json/json.json', $json_string);

产品分类页如何通过WP_Query函数查询输出分类下的产品信息?

查询产品信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$term=get_term_by('name',single_cat_title('',false),'product_cat');
$term_id =$term->term_id;
// args
$args = array(
'post_type' => 'product',
'posts_per_page' => 12, // 显示篇数
'tax_query' => array(
'relation' => 'OR',
array(
'taxonomy' => 'product_cat',//此处参数指定为产品目录
'field' => 'id',//调用依据为产品目录id
'terms' => array( $term_id),
),
),
);
// WP_Query
$the_query = new WP_Query( $args );

wp_reset_query();

输出产品信息

1
2
3
4
5
6
7
8
if( $the_query->have_posts() ){
while( $the_query->have_posts() ){
$the_query->the_post();
?>
...
<?php
}
}

如何通过WP_Query函数查询最新的产品信息?

查询最新的15条产品信息

1
2
3
4
5
6
7
8
9
$args = array(
'taxonomy' => 'product_cat',
'post_type' => 'product',
'post_status' => 'publish',
'posts_per_page' => 15,
);

$products = new WP_Query( $args );
wp_reset_query();

显示输出产品信息

1
2
3
4
5
if($products->have_posts()) :
while($products->have_posts()) :
$products->the_post();
endwhile;
endif;