鲍成龙
在不同的遭遇里我发现你的瞬间,有种不可言说的温柔直觉。
鲍成龙

开发中,总是需要给 url 拼接参数,为此,WordPress 非常贴心的提供了一个函数 add_query_arg,给一个 URL 添加新的查询参数获取新的 URL。我们可以使用此功能重建 URL,或添加新的查询参数到 URL,也可以获取带查询参数的完整 URL。添加一个键值对或者一个关联数组,设置键的值为假可以出 URL 移除该查询字符串。用 $_SERVER 值省略旧的查询或 URI(第二或第三个参数)。

add_query_arg( 'key', 'value', 'https://baochenglong.cn/' );
 
add_query_arg( array(
    'key1' => 'value1',
    'key2' => 'value2',
), 'https://baochenglong.cn/' );

dd_query_arg 绝不仅仅是把参数拼接到 URL 尾部,还做了很多兼容,优化,安全等工作。另外,WordPress 官方强烈建议,对返回的 url ,要使用 esc_url 进行处理。如果,我们自己拼接 url 基本不可能考虑的这么周全,所以,强烈建议使用 add_query_arg 拼接 url。

参数 数据类型 是否必需 描述 默认值
$param1 整数|字符串|数字 新的查询字符串或数组
$param2 整数|字符串|数字 新的查询字符串值,如果$param1 是关联数组,此参数为原 URL
$old_query_or_uri 字符串|布尔值 原查询字符串或 URL $_SERVER[REQUEST_URI]

使用举例:

假设我们当前在 WordPress 页面: “http://example.com/client/?s=word”…

// 下面将输出 '/client/?s=word&foo=bar'
echo add_query_arg( 'foo', 'bar' );
 
// 下面将输出 '/client/?s=word&foo=bar&baz=tiny'
$arr_params = array( 'foo' => 'bar', 'baz' => 'tiny' );
echo add_query_arg( $arr_params );

很多时候你可能发现你想使用下面的方法在你所在的当前页面添加查询参数,这中情况下,你可以使用你需要修改的 URL 作为最后一个参数。

// 下面将输出 'http://example.com/2023/06/23/?hello=world'
echo add_query_arg( 'hello', 'world', 'http://example.com/2023/06/23/' );

因为 get_permalink() 函数返回的是一个完整的 URL,在需要修改文章页面时,你可以使用这个函数作为最后一个参数。

// 下面将输出添加查询字符串:?hello=there 后的 id 为 9 的文章的链接。
echo add_query_arg( 'hello', 'there', get_permalink(9) );

通过关联数组删除和添加查询字符串:

$query = 'http://example.com/link?foo=bar';
$new_query = add_query_arg( array('foo' => false, 'baz' => 'qux'), $query );
// 结果:http://example.com/link?baz=qux

 

鲍成龙

使用 POST 方法执行 HTTP 请求并返回其响应数据。

参数 数据类型 是否必需 描述 默认值
$url 字符串 请求 URL
$args 数字 请求参数 array()

返回值

响应数组,如果出错,返回 WP_Error 对象

使用示例

发送的 Post 数据应该在 body 中提供,body 不一定是数组,也可以是 XML 或 JSON 格式的字符串或其他可以通过 HTTP 协议发送的数据。

$response = wp_remote_post( $url, array(
    'timeout'     => 45,
    'redirection' => 5,
    'httpversion' => '1.0',
    'blocking'    => true,
    'headers'     => array(),
    'body'        => array(
        'username' => 'bob',
        'password' => '1234xyz'
    ),
    'cookies'     => array()
    )
);
 
if ( is_wp_error( $response ) ) {
    $error_message = $response->get_error_message();
    echo "Something went wrong: $error_message";
} else {
    echo 'Response:<pre>';
    print_r( $response );
    echo '</pre>';
}

 

在请求中添加基础授权数据

如果需要添加基础授权数据,参考下面的代码在 header 中添加即可。

$response = wp_remote_post( $url, array(
    'body'    => $data,
    'headers' => array(
        'Authorization' => 'Basic ' . base64_encode( $username . ':' . $password ),
    ),
) );
鲍成龙

使用 GET 方法执行 HTTP 请求并返回其响应。

参数 数据类型 是否必需 描述 默认值
$url 字符串 请求 URL
$args 数组 请求参数 array()

函数返回值

成功时,返回一个数组,失败时,返回一个 WP_Error 对象

使用示例

发送 HTTP 请求时,我们可以通过该函数的 $args 参数来设置 HTTP 的各种参数,包括超时时间,HTTP 版本,Headers 等信息。

请求时设置超时时间和 HTTP 版本。

$response = wp_remote_get( 'http://www.example.com/index.php?action=foo',
    array(
        'timeout'     => 120,
        'httpversion' => '1.1',
    )
);

请求时设置内容类型和 API Key。

$args = array(
    'headers' => array(
        'Content-Type' => 'application/json',
        'X-Api-Key' => 'apikey12345'
    )
)
 
$response = wp_remote_get( $url, $args );
if ( is_array( $response ) && ! is_wp_error( $response ) && $response['response']['code'] == '200' ) {
    $headers = $response['headers']; 
    $body = $response['body']; 
}

 

鲍成龙

wordpress 的主循环

<?php 
if ( have_posts() ) :
    while ( have_posts() ) : the_post();
        the_title();
    endwhile;
endif; 
?>

其实是隐藏了一些参数,比如

<?php 
if ( $wp_query->have_posts() ) :
    while ( $wp_query->have_posts() ) : $wp_query->the_post();
        the_title();
    endwhile;
endif;
?>

两段代码是等效的,为了保持代码的简洁性,WordPress 隐藏了全局的主循环变量 $wp_query。

 

WP_Query 最基础用法

<?php
// WP_Query 所使用的参数
$args = array( 'posts_per_page' => 3 );
 
// 调用 WP_Query 新建文章查询.
$the_query = new WP_Query( $args );
 
if ( $the_query->have_posts() ) :
    // 开始循环
    while ( $the_query->have_posts() ) : $the_query->the_post();
        the_title();
        the_excerpt();
    // 结束循环
    endwhile;
else:
    echo '未找到文章';
endif;
 
wp_reset_postdata();
?>

WP_Query 这个万能的文章查询类,有人把 WP_Query 所有的参数做了一个总结,然后注释了一下,供有需要的朋友查阅使用。

<?php
/**
* WordPress 查询综合参考
*
* 官方文档: http://codex.wordpress.org/Class_Reference/WP_Query
* 源代码: http://core.trac.wordpress.org/browser/tags/3.5.1/wp-includes/query.php
*/
 
$args = array(
 
/**
* 作者参数 - 显示某些作者发表的文章
*/
'author' => '1,2,3,' //(整数) - 作者ID [使用减号 (-) 排除某个作者 ID, 如: 'author' => '-1,-2,-3,']
'author_name' => 'luetkemj', //(字符串) - 使用 'user_nicename' 用户昵称,(不是名称)
 
/**
* 分类参数 - 显示某个分类里面的文章
*/
'cat' => 5,//(整数) - 分类id
'category_name' => 'staff', 'news', //(字符串) - 分类别名(不是名称)
'category__and' => array( 2, 6 ), //(数组) - 分类id
'category__in' => array( 2, 6 ), //(数组) - 分类id
'category__not_in' => array( 2, 6 ), //(数组) - 分类id
 
/**
* 标签参数 - 显示含有某些标签的文章
*/
'tag' => 'cooking', //(字符串) - 标签别名
'tag_id' => 5, //(整数) -标签id
'tag__and' => array( 2, 6), //(数组) - 标签id
'tag__in' => array( 2, 6), //(数组) - 标签id
'tag__not_in' => array( 2, 6), //(数组) - 标签id
'tag_slug__and' => array( 'red', 'blue'), //(数组) - 标签别名
'tag_slug__in' => array( 'red', 'blue'), //(数组) - 标签别名
 
/**
* 自定义分类法参数 - 显示某些自定义分类法里面的文章
* 重要提示: tax_query 使用多维数组
* 这种查询结构允许我们查询多个自定义分类法
*/
'tax_query' => array( //(数组) - 使用自定义分类法查询参数 (3.1及以后版本可用).
  'relation' => 'AND', //(字符串) - 可用的值有 'AND' 或 'OR' 和 SQL 的 JOIN 作用是相同的
  array(
    'taxonomy' => 'color', //(字符串) - 自定义分类法
    'field' => 'slug', //(字符串) - 使用别名还是分类作为查询条件 ('id' 或 'slug')
    'terms' => array( 'red', 'blue' ), //(整数/字符串/数组) - 自定义分类法分类条目
    'include_children' => true, //(布尔值) - 是否包含自分类,默认为真
    'operator' => 'IN' //(字符串) - 测试条件,可用值为 'IN', 'NOT IN', 'AND'.
  ),
  array(
    'taxonomy' => 'actor',
    'field' => 'id',
    'terms' => array( 103, 115, 206 ),
    'include_children' => false,
    'operator' => 'NOT IN'
   )
),
 
/**
* 文章 & 页面参数- 基于文章或页面参数显示文章
*/
'p' => 1, //(整数) - 文章id
'name' => 'hello-world', //(字符串) - 文章别名
'page_id' => 1, //(整数) - 页面id
'pagename' => 'sample-page', //(字符串) - 页面别名
'pagename' => 'contact_us/canada', //(字符串) - 用斜杠‘/’分割的父页面别名/子页面别名来显示子页面
'post_parent' => 1, //(整数) - 页面id,只返回子页面,只对有子页面的页面有效
'post__in' => array(1,2,3), //(数组) - 需要显示的文章的id
'post__not_in' => array(1,2,3), //(数组) - 需要排除的文章的id
//注意:不能在同一个查询里同时使用 'post__in' 和 'post__not_in'
 
/**
* 文章类型 & 状态参数 - 显示某些文章类型里面的文章
*/
'post_type' => array( //(字符串/ 数组) - 文章类型,根据文章类型获取文章,默认为'post'
    'post', // - 文章
    'page', // - 页面
    'revision', // - 文章版本
    'attachment', // - 附件,默认 WP_Query 设置了发布状态为 'post_status'=>'published', 但是附件默认为 'post_status'=>'inherit',所以你需要设置状态为 'inherit' 或'any'.
    'my-post-type', // - 自定义文章类型 (例如:movies)
),
'post_status' => array( //(字符串 / 数组) - 使用文章状态,根据文章状态获取文章,默认为 'publish'
    'publish', // - 已发布的文章或页面
    'pending', // -等待复审的文章
    'draft', // - 处于草稿状态的文章
    'auto-draft', // - 自动保存为草稿的文章
    'future', // - 定时发布的文章
    'private', // - 未登录用户不能查看的私有文章
    'inherit', // - 版本. 具体参考 get_children.
    'trash' // - 回收站中的文章 (2.9和以后的版本可用).
),
 
//注意:The 'any' 关键字可以用在 post_type 和 post_status 查询,但是不能在数组中使用
'post_type' => 'any', // - 获取所有文章类型里面的文章,除了版本和文章类型参数'exclude_from_search'设置为true的文章类型
'post_status' => 'any', // - 获取处于所有文章状态的文章,除了版本和文章类型参数'exclude_from_search'设置为true的文章类型
 
/**
* 分页参数
*/
'posts_per_page' => 10, //(整数) - 每页显示的文章数量 (2.1和以后的版本可用), 使用'posts_per_page'=-1 显示所有文章,如果查询处于订阅源中,WordPress用 'posts_per_rss' 选项覆盖了这里的设置,需要使用这个限制,尝试使用 'post_limits' 过滤器,或使用 'pre_option_posts_per_rss'过滤器返回 -1
'posts_per_archive_page' => 10, //(整数) - n每页显示的文章数量 - 只在存档页面使用,在存档页面和搜索结果页面覆盖了 showposts 和 posts_per_page 参数
'nopaging' => false, //(布尔值) - 在一页显示所有文章或使用分页,默认值为 'false', 使用分页
'paged' => get_query_var('paged'), //(整数) - 页数,分页时显示第几页
//注意:使用 get_query_var('page'); 如果查询在设置为首页的页面模版中工作,查询参数 'page' 拥有文章分页或内容中使用 <!--nextpage--> 快捷代码的分页。
 
/**
* 偏移参数
*/
'offset' => 3, //(int) - 跳过的文章数量
 
/**
* 排序 & 排序方式参数 - 对获取的文章进行排序
*/
'order' => 'DESC', //(字符串) - 设置 'order_by' 参数升序或降序排列. 默认为'DESC'.
//Possible Values:
//'ASC' - 升序排列,从小到大 (1, 2, 3; a, b, c).
//'DESC' - 降序排列,从大到小 (3, 2, 1; c, b, a).
'orderby' => 'date', //(字符串) - 排序依据. 默认为 'date'.
//可用的参数有://
//'none' - 不排序 (2.8和以后的版本可用)
//'ID' - 根据ID排序,注意ID是大写的
//'author' - 根据作者排序
//'title' - 根据标题排序
//'date' - 根据发表时间排序
//'modified' - 根据最后修改时间排序
//'parent' - 根据父页面排序
//'rand' - 随机排序
//'comment_count' - 根据评论数量排序 (2.9和以后的版本可用).
//'menu_order' - 根据页面序号排序. 通常在页面中使用 (编辑页面时有一个页面序号的字段) 和附件 ( 插入 / 上传媒体相册对话框中的数字), 但是不能对文章类型 'menu_order' 使用数字值 (默认都为 0).
//'meta_value' - 注意'meta_key=keyname' 必须也出现在查询中. 注意排序是按照字母表顺序进行的。(如:words),但是数字排序可能会有问题 (如:1, 3, 34, 4, 56, 6, etc, 而不是你希望的:1, 3, 4, 6, 34, 56)。
//'meta_value_num' - 根据数字meta值排序 (2.8和以后的版本中可用). 同时需要注意'meta_key=keyname' 也要在查询中声明。这个值和上面说明的 'meta_value' 一样,只不过值允许使用数字排序。
//'title menu_order' - 同时使用 menu_order 和 title 排序 更多信息请参考:http://wordpress.stackexchange.com/questions/2969/order-by-menu-order-and-title
//'post__in' - 使用 post__in 数组中制定的 ID 顺序 (3.5以后的版本中可用).
 
/**
* 置顶文章参数 - 显示或忽略置顶文章
*/
'ignore_sticky_posts' => false, //(布尔值) - 是否忽略置顶文章,默认为假不忽略. 在返回文章的开头忽略/排除置顶文章,但是置顶文章还是会在自然查询中列出。
//注意:关于置顶文章的更多信息,请参考:http://codex.wordpress.org/Class_Reference/WP_Query#Sticky_Post_Parameters
 
/**
* 时间参数 - 显示某个时间段内的文章
*/
'year' => 2012, //(int) - 4 个数字的年份 (如:2011)
'monthnum' => 3, //(int) - 月份数字 (从 1 到 12)
'w' => 25, //(int) - 一年中的第几周 (从 0 到 53), 使用 MySQL WEEK 命令,此模式和"start_of_week" 选项相关
'day' => 17, //(int) - 月中的天数 (从 1 到 31)
'hour' => 13, //(int) - 小时 (从 0 到 23).
'minute' => 19, //(int) - 分钟 (从 0 到 60).
'second' => 30, //(int) - 秒 (从 0 到 60).
 
/**
* 自定义字段参数 - 显示拥有某个自定义字段的文章
*/
'meta_key' => 'key', //(字符串) - 自定义字段的键
'meta_value' => 'value', //(字符串) - 自定义字段的值
'meta_value_num' => 10, //(数字) - 自定义字段的值
'meta_compare' => '=', //(字符串) - 测试'meta_value'的操作。可用的值有'!=', '>', '>=', '<', or ='. 默认为 '='.
'meta_query' => array( //(数组) - 自定义字段参数 (3.1和以后的版本可用).
array(
    'key' => 'color', //(字符串) - 自定义字段的键
    'value' => 'blue', //(字符串/数组) - 自定义字段的值 (注意:数组的支持仅限于一个比较值: 'IN', 'NOT IN', 'BETWEEN', or 'NOT BETWEEN')
    'type' => 'CHAR', //(字符串) -自定义字段类型,可用的值有:'NUMERIC', 'BINARY', 'CHAR', 'DATE', 'DATETIME', 'DECIMAL', 'SIGNED', 'TIME', 'UNSIGNED',默认为    'CHAR'
    'compare' => '=' //(字符串) - 测试的操作,可用的值有: '=', '!=', '>', '>=', '<', '<=', 'LIKE', 'NOT LIKE', 'IN', 'NOT IN', 'BETWEEN', 'NOT BETWEEN'. 默认为:'='
),
array(
    'key' => 'price',
    'value' => array( 1,200 ),
    'compare' => 'NOT LIKE'
)
 
/**
* 权限参数 - 显示已发布文章,如果用户有合适的权限,同样现实私有文章:
*/
'perm' => 'readable' //(字符串) 可用的值有:'readable', 'editable' (可能还有其他可用的值我没有测试)
 
/**
* 与缓存相关的参数
*/
'no_found_rows' => false, //(布尔值) 默认为假,为了分页,WordPress 在大多数查询中使用 SQL_CALC_FOUND_ROWS 查询, 即使你不需要分页,通过设置这个参数为真,我们告诉了了WordPress不要查询数据总行数,从而降低数据库负载,如果设置了这个参数为真,分页将不工作,更多信息请参考:http://flavio.tordini.org/speed-up-wordpress-get_posts-and-query_posts-functions
'cache_results' => true, //(布尔值) 默认为真
'update_post_term_cache' => true, //(布尔值) 默认为真
'update_post_meta_cache' => true, //(布尔值) 默认为真
//注意:缓存是个好东西,通常不建议设为假,更多信息请参考:http://codex.wordpresorg/Class_Reference/WP_Query#Permission_Parameters
 
/**
* 搜索参数
*/
's' => $s, //(字符串) - 传递搜索变量到搜索功能,更多信息请参考: http://www.wprecipes.com/how-to-display-the-number-of-results-in-wordpress-search
'exact' => true //(布尔值) - 只匹配完整的titles/posts的信号 - 默认值为假,更多信息请参考:https://gist.github.com/2023628#gistcomment-285118
'sentence' => true //(布尔值) - 进行短语搜索的信号-默认值为假,更多信息请参考:https://gist.github.com/2023628#gistcomment-285118
 
/**
* 文章字段参数
*/
//关于文章字段参数信息,请参考http://codex.wordpress.org/Class_Reference/WP_Query#Post_Field_Parameters
 
/**
* 过滤器
*/
//关于过滤器的更多信息,请参考:http://codex.wordpress.org/Class_Reference/WP_Query#Filters
 
);
 
$the_query = new WP_Query( $args );
 
// 循环开始
if ( $the_query->have_posts() ) :
    while ( $the_query->have_posts() ) : $the_query->the_post();
        // 输出内容
    endwhile;
endif;
 
// 重置文章数据
wp_reset_postdata();
 
?>

 

还有一些例子

<?php
 // 1.用于查询的参数或者参数集合
$args = array(
  'post_type'=>'post'
);
// 2.查询
$query=new WP_Query($args);
 
// 3.判断查询的结果,有内容则循环
if($query->have_posts()):while($query->have_posts()):$query->the_post();
?>
 
//输出循环结构
<?php the_title();?>
 
<?php
endwhile;
endif;
// 4.重置请求数据
wp_reset_postdata();
?>

 

调用 id 为 36 的单篇文章的新建查询如下

$args = array(
  'p'=>'36'
);
$query = new WP_Query( $args  );

等同于

$query = new WP_Query( 'p=36' );

调用指定 page 页面或 category 分类页可以用类似的写法

$query = new WP_Query( 'cat=9' );//调用指定分类的文章
$query = new WP_Query( 'page_id=7' );//指定page页面

调用 id 为 34、32、30 的文章

$args = array(
  'post__in'=>array(34,32,30)
);

post__in 默认调用的是文章信息,如果要调用页面,则需要指定类型

$args = array(
'post_type'=>'page',
'post__in'=>array(3)
);

调用除了 id 为 3 以外的文章

$args = array(
'post__not_in'=>array(3)
);

调用全部文章

$query = new WP_Query( 'post_type=post' );

调用全部页面

$query = new WP_Query( 'post_type=page' );

 

鲍成龙

打开hexed.it

按下Ctrl+O找到sublime text的安装路径,打开sublime_text.exe

 

破解:按Ctrl+F搜索 4157415656575553B828210000,替换为 33C0FEC0C3575553B828210000

 

关闭许可证检查:按Ctrl+F搜索 6C6963656E73652E7375626C696D6568712E636F6D,替换为 7375626C696D6568712E6C6F63616C686F73740000

 

操作完成后,按下Ctrl+S,将原文件备份后(例如改名为sublime_text.exe.bak),保存

 

运行Sublime Text,菜单Help->Enter License->输入下面的激活码->Use License->确定,软件就激活了

 

—– BEGIN LICENSE —–
Zer0Daylab
Unlimited User License
EA7E-81044230
0C0CD4A8 CAA317D9 CCABD1AC 434C984C
7E4A0B13 77893C3E DD0A5BA1 B2EB721C
4BAAB4C4 9B96437D 14EB743E 7DB55D9C
7CA26EE2 67C3B4EC 29B2C65A 88D90C59
CB6CCBA5 7DE6177B C02C2826 8C9A21B0
6AB1A5B6 20B09EA2 01C979BD 29670B19
92DC6D90 6E365849 4AB84739 5B4C3EA1
048CC1D0 9748ED54 CAC9D585 90CAD815
—— END LICENSE ——
鲍成龙

1. self-update 命令官方文档

版本号:https://getcomposer.org/download

中文网:https://docs.phpcomposer.com/03-cli.html#self-update

英文网:https://getcomposer.org/doc/03-cli.md#self-update-selfupdate-

 

2. 版本更新使用示例

查看当前composr版本(大写的V)

composer -V

 

当前composer更新为最新版

composer self-update

 

更新到指定版本

composer self-update 1.10.1

 

3. 版本回滚

回滚到安装的上一个版本

composer self-update --rollback

 

4. 版本更新并删除旧版本的备份

composer self-update --clean-backups

 

 

其他相关命令

composer list 显示所有命令
composer show 显示所有包信息
composer install 在 composer.json 配置中添加依赖库之后运行此命令安装
composer create-project laravel/laravel Laravel –prefer-dist “5.1.*” 创建项目
composer search packagename 搜索包
composer update 更新所有包
composer update monolog/monolog 更新指定包
composer remove monolog/monolog 移除指定的包
composer require monolog/monolog 添加指定包
composer require monolog/monolog:1.19 添加指定包和版本
composer require monolog/monolog=1.19
composer require monolog/monolog 1.19
鲍成龙

简介

转换如 :-)、:-P 等文本表情符号为图像

只有 'use_smilies' 选项被设置为 true 并且函数中的全局变量不为空的时候才转换

如果不渲染,或者查询 get_option( 'use_smilies' );  不存在,为0 等情况 ,update_option( 'use_smilies',1 ); 改为true 就可以了

用法

<?php convert_smilies( $text ) ?>

参数

$text
(string) (required) 将进行表情转换的文本
Default: 无

返回值

(string)
已经将表情转换为图像的字符串。

实例

echo convert_smilies("This smiley is going to show as an image... :) ");

注解

  • 使用: $wp_smiliessearch, $wp_smiliesreplace 表情符号替换数组
  • 使用到的全局变量: (array) $wp_smiliessearch
  • 使用到的全局变量: (array) $wp_smiliesreplace

源文件

wp-includes/formatting.php.

鲍成龙

迎面撞怀不相识,转身才知意难平…

鲍成龙

一、下载PHP8+

这里以php8.2来演示

下载地址: https://windows.php.net/download#php-8.2

在PhpStudy中安装PHP8+

下载完成后将文件解压,修改目录名称为 php8.2.0nts ,都知道phpstudy的安装目录在新版本中是直接安装在D盘的,所以只要你没有修改安装目录,那么所有的安装目录就是一致的。

这里确实给写文章一组提供了很大的方便,因为每个人的安装位置都是一样的就省了很多麻烦。

接下来将 php8.2.0nts 目录放到phpstudy总PHP的目录 (D:\phpstudy_pro\Extensions\php)

此时你就可以在项目中切换PHP8版本了,但是有一部分伙伴在切换PHP8时有可能会出现500错误,这与电脑系统版本有关系,如果你的电脑在切换到PHP8时出现了500错误,那请下载Microsoft Visual C++:

https://visualstudio.microsoft.com/zh-hans/downloads/

在PhpStudy中安装PHP8+

下载安装后需要重启电脑。

二、整合phpstudy与PHP8.2

通过以上操作,可以正常启动PHP程序并正确运行PHP文件,但也仅此可以运行PHP文件,此时MySQL是连接不了的。

那是因为PHP8是我们自己下载的,里边所有的扩展和配置信息没有修改,所以造成的问题就是自己下载的PHP8配置文件里边所有的扩展都是关闭状态。

此时就要修改PHP中的配置文件php.ini,然而在下载的文件中没有找到php.ini,但发现有个“php.ini-development”文件,你只需将其复制一份,命名为“php.ini”即可。

在php.ini文件中搜索“extension”关键字,参照以下配置,将前边的注释去掉。

在PhpStudy中安装PHP8+

在PhpStudy中安装PHP8+

然后还有一个地方需要修改,搜索“extension_dir”,把你的PHP目录写到这里:

在PhpStudy中安装PHP8+

 

最后重启环境,就可以在你的电脑中完美运行PHP8了!

在PhpStudy中安装PHP8+

鲍成龙

[alert class="info"]Flexbox 是 flexible box 的简称(注:意思是“灵活的盒子容器”),是 CSS3 引入的新的布局模式。它决定了元素如何在页面上排列,使它们能在不同的屏幕尺寸和设备下可预测地展现出来。[/alert]

它之所以被称为 Flexbox ,是因为它能够扩展和收缩 flex 容器内的元素,以最大限度地填充可用空间。与以前布局方式(如 table 布局和浮动元素内嵌块元素)相比,Flexbox 是一个更强大的方式:

  • 在不同方向排列元素
  • 重新排列元素的显示顺序
  • 更改元素的对齐方式
  • 动态地将元素装入容器

一、基本概念

采用 Flex 布局的元素,称为 Flex 容器(flex container),简称"容器"。它的所有子元素自动成为容器成员,称为 Flex 项目(flex item),简称"项目"。‘’

CSS 弹性布局 display:flex 属性

在 Flexbox 模型中,有三个核心概念:
– flex 项(注:也称 flex 子元素),需要布局的元素
– flex 容器,其包含 flex 项
– 排列方向(direction),这决定了 flex 项的布局方向

 

 二、容器属性

CSS 弹性布局 display:flex 属性

2.1  flex-direction:

  • row(默认值):主轴为水平方向,起点在左端。
  • row-reverse:主轴为水平方向,起点在右端。
  • column:主轴为垂直方向,起点在上沿。
  • column-reverse:主轴为垂直方向,起点在下沿。

CSS 弹性布局 display:flex 属性

2.2   flex-wrap:

  • nowrap(默认):不换行。
  • wrap:换行,第一行在上方。
  • wrap-reverse:换行,第一行在下方。

 

2.3  justify-content:

  • flex-start(默认值):左对齐
  • flex-end:右对齐
  • center: 居中
  • space-between:两端对齐,项目之间的间隔都相等。
  • space-around:每个项目两侧的间隔相等。所以,项目之间的间隔比项目与边框的间隔大一倍。

CSS 弹性布局 display:flex 属性

2.4  align-items:

  • flex-start:交叉轴的起点对齐。
  • flex-end:交叉轴的终点对齐。
  • center:交叉轴的中点对齐。
  • baseline: 项目的第一行文字的基线对齐。
  • stretch(默认值):如果项目未设置高度或设为auto,将占满整个容器的高度。

CSS 弹性布局 display:flex 属性

2.5  align-content:

定义了多根轴线的对齐方式,如果项目只有一根轴线,那么该属性将不起作用

  • flex-start:与交叉轴的起点对齐。
  • flex-end:与交叉轴的终点对齐。
  • center:与交叉轴的中点对齐。
  • space-between:与交叉轴两端对齐,轴线之间的间隔平均分布。
  • space-around:每根轴线两侧的间隔都相等。所以,轴线之间的间隔比轴线与边框的间隔大一倍。
  • stretch(默认值):轴线占满整个交叉轴。

CSS 弹性布局 display:flex 属性

结合 justify-contentalign-items,看看在 flex-direction 两个不同属性值的作用下,轴心有什么不同:

CSS 弹性布局 display:flex 属性

 三、项目属性

CSS 弹性布局 display:flex 属性

3.1 order属性

CSS 弹性布局 display:flex 属性

3.2 flex-grow属性

flex-grow属性定义项目的放大比例,默认为0,即如果存在剩余空间,也不放大。

 

如果所有项目的flex-grow属性都为1,则它们将等分剩余空间(如果有的话)。如果一个项目的flex-grow属性为2,其他项目都为1,则前者占据的剩余空间将比其他项多一倍。

CSS 弹性布局 display:flex 属性

3.3 flex-shrink属性

flex-shrink属性定义了项目的缩小比例,默认为1,即如果空间不足,该项目将缩小。

.item { 
flex-shrink: <number>; /* default 1 */
 }

CSS 弹性布局 display:flex 属性

如果所有项目的flex-shrink属性都为1,当空间不足时,都将等比例缩小。如果一个项目的flex-shrink属性为0,其他项目都为1,则空间不足时,前者不缩小。

负值对该属性无效。

 

3.4 align-self属性

align-self属性允许单个项目有与其他项目不一样的对齐方式,可覆盖align-items属性。默认值为auto,表示继承父元素的align-items属性,如果没有父元素,则等同于stretch

.item {
  align-self: auto | flex-start | flex-end | center | baseline | stretch;
}

CSS 弹性布局 display:flex 属性

弹性布局默认不改变项目的宽度,但是它默认改变项目的高度。如果项目没有显式指定高度,就将占据容器的所有高度。

参考:http://www.ruanyifeng.com/blog/2018/10/flexbox-form.html

http://www.ruanyifeng.com/blog/2015/07/flex-grammar.html

鲍成龙

最近写主题,文章的缩略图处理给我造成了很大的困扰

timthumb.php 是一个很不错的选择,虽然之前某个事件导致开发者不敢用了,原作者也没有继续维护了

但是目前来看,timthumb.php还是很不错的图片处理

但是图片链接的处理 直连看到了很不友好

最近突发奇想 用伪静态来处理,如下 : 现在看来效果还不错,链接也算美观,不清楚的还以为是对象储存的样式呢

 

nginx伪静态用优雅的链接通过timthumb.php处理图片

location ~ (?<src>.*\.(gif|jpg|jpeg|png|bmp|webp))!(?<w>\d+)_(?<h>\d+)$ {
    try_files $uri $uri/ /wp-content/themes/xxx/timthumb.php?src=$src&w=$w&h=$h&zc=1;
}

在图片链接后添加 !240_120 就能通过timthumb.php来处理图片

比如:https://www.wpbase.cn/wp-content/uploads/2022/08/33.jpg!240_240

 

菜鸟一枚,如果有更好的写法 可以教一下 [aru_7]

鲍成龙

安装web
首先,准备两个域名及web环境,我的测试环境是宝塔。

主站A
域名:a.test.com
数据库名称:test
数据库用户:mytest
数据库用户密码:test123
数据表前缀:a_
从站B
域名:b.test.com
数据库名称:test
数据库用户:mytest
数据库用户密码:test123
数据表前缀:b_
先安装A站,使用上述A站配置信息,安装完毕后,再安装B站,B站也使用上述信息。注意:为了实现数据共享,我们必须将两个站的数据表都放在同一个数据库中,上面我用的test数据库。

修改wordpress配置
为实现共用用户数据,我们必须让两个站使用的数据表都为a_user与a_usermeta。或者都使用b_user与b_usermeta,我这里使用的A作为主站,所以我需要把B站使用的b_user与b_usermeta数据表改为使用a_user与a_usermeta数据表。

打开B站wordpress根目录下的wp_config.php配置文件,在其中加入如下配置:

define('CUSTOM_USER_TABLE', 'a_users');
define('CUSTOM_USER_META_TABLE', 'a_usermeta');

这两句配置重新声明了_user与_usermeta数据表的名称,这里将其改为需要共享数据的表名称,我是用的是A站的用户数据。

到此,你的A、B两站用户数据共享已经完成,都可以使用A站点的用户数据注册登录,但wordpress在_usermeta表中有对用户权限的记录,到这一步,你的B站虽然可以使用A站的用户数据登录,但不能访问后台,访问会提示用户权限不够。

自动添加用户权限
当你完成上面的步骤时,你的a_usermeta数据表中,并没有记录用户对B站点的访问权限,为了使A站点的管理员用户能拥有B站点的管理权限,我们需要在a_usermeta数据表中插入如下权限记录:

INSERT INTO `test`.`a_usermeta` (`umeta_id`, `user_id`, `meta_key`, `meta_value`) VALUES (NULL, '1', 'b_capabilities', 'a:1:{s:13:"administrator";s:1:"1";}');

在这里解释下,在_usermeta数据表中meta_key的值为_capabilities的记录项就是记录的用户权限,其前缀代表了权限是哪个站点的。由于我的管理员账号是建站时建立的,所以user_id为1。administrator表示管理员权限,其它权限见WordPress移除用户角色添加新角色并赋予角色能力/权限一文。

通过上面的mysql命令,插入用户对B站点的权限后,我们就可以正常访问B站的后台了。注意:记得清理cookies!

如果不会MySQL,你也可以使用phpmyadmin使用鼠标点击a_usermeta数据表中meta_key值为a_capabilities记录项前面的复制链接,phpmyadmin会自动跳转到插入功能并填入相应值,你只需要修改前缀再点击执行即可。

这里我们使用的是手动的方式来赋予用户对B站点的访问权限,我们不可能手动为每一位用户赋予权限,那么我们可以使用如下代码来实现注册时自动赋予权限。