wordpress独立站电商cvv源码

WordPress 代码要这么写才规范,5000多字的编码规范吐血整理

WordPress 的 PHP 编码标准对整个 WordPress 社区都适用,但是对于 WordPress 核心代码是强制要求的,而对于主题和插件,WordPress 则鼓励使用,因为主题和插件的作者可能会选择遵循别的编码风格。

但这个编码规范不仅关于编码风格,还包括 WordPress 生态中互操作性、可翻译性和安全性等方面的最佳实践,因此即使使用其他的编码风格 ,还是建议开发者在最佳实践方面仍然遵守 WordPress 编码标准。

目前也不是所有的核心代码都完全符合这个规范,但所有新提交和/或更新的代码则都要求完全遵守。

对于开发者来说,如果想根据这个规范去自动检查自己的代码,可以使用基于 PHP_CodeSniffer 开发的官方 WordPress 编码规范工具。

引号

正确的使用单引号和双引号,如果字符串中不包含变量的时候,则使用单引号,永远不要在字符串中转移引号,而是通过切换引号类型,比如:

echo '<a href="/static/link" title="Yeah yeah!">Link name</a>';echo "<a href='$link' title='$linktitle'>$linkname</a>";

HTML 或 XML 属性中的文本应该进行转义,以便单引号或者双引号不会结束属性使得 HTML 标签无效,甚至引起安全问题,如何对属性进行转义,我们会在以后的文章中详细讲解。

缩进

首先使用制表符而不是空格进行缩进,并且使用空格把代码对齐,以便更易阅读:

[tab]$foo = 'somevalue';[tab]$foo2 = 'somevalue2';[tab]$foo34 = 'somevalue3';[tab]$foo5 = 'somevalue4';

对于关联数组,如果数据含有多个元素的时候,每个元素都应该新起一行:

$query = new WP_Query( array( 'ID' => 123 ) );

$args = array([tab]'post_type' => 'page',[tab]'post_author' => 123,[tab]'post_status' => 'publish',); $query = new WP_Query( $args );

特别关注一下数组最后一个元素后面的逗号,推荐都加上,因为这样更容易调整数组的顺序,并且更容易添加新的元素,因为不用关注之前最后一个是否有逗号。

对于 switch 结构, case 语句应该比 switch 语句多缩进一个制表符, case 的内容也要比 case 条件语句缩进一个 tab。

switch ( $type ) {[tab]case 'foo':[tab][tab]some_function();[tab][tab]break;[tab]case 'bar':[tab][tab]some_function();[tab][tab]break;}

经验法则:行首缩进使用制表符,行中对齐使用空格。

大括号

大括号的使用样式如下所示:

if ( condition ) { action1(); action2();} elseif ( condition2 && condition3 ) { action3(); action4();} else { defaultaction();}

如果代码块非常长,那就要考虑将其分解成更多的较短的代码块,函数或者方法,以便降低复杂度,提高测试的便利性,当然也增加了代码的可读性。

不管是否必需,都要使用大括号:

if ( condition ) { action0();} if ( condition ) { action1();} elseif ( condition2 ) { action2a(); action2b();} foreach ( $items as $item ) { process_item( $item );}

特别注意,强制使用大括号意味着禁止单语句内联控制结构,但是可以使用控制结构的替代语法(例如 if/endif, while/endwhile)——尤其是在 HTML 的模板中嵌入 PHP 代码的时候 ,例如:

<?php if ( have_posts() ) : ?> <div class="hfeed"> <?php while ( have_posts() ) : the_post(); ?> <article id="post-<?php the_ID() ?>" class="<?php post_class() ?>"> <!-- ... --> </article> <?php endwhile; ?> </div><?php endif; ?>使用 elseif 而不是 else if

因为 else if 和 if|elseif 代码块的冒号语法不兼容,因此条件语句中使用 elseif。

数组声明

使用长数组语法 ( array( 1, 2, 3 ) ) 声明数组通常比短数组语法 ( [ 1, 2, 3 ] ) 更具有可读性,对于初学者,也更有描述性。

所以数组声明必须使用长数组语法。

闭包(匿名函数)

在一些的情况下(比如回调函数只需要用一次),可以使用闭包而非重写一个新函数来作为回调函数传递,比如:

$caption = preg_replace_callback( '/<[a-zA-Z0-9]+(?: [^<>]+>)*/', function ( $matches ) { return preg_replace( '/[\r\n\t]+/', ' ', $matches[0] ); }, $caption);

但是不建议 filter 或 action 的回调函数使用闭包,因为通过 remove_action() / remove_filter() 移除的时候,就变得复杂了。

函数多行调用

将一个函数调用拆分为多行时,每个参数必须位于单独的行上, 单行内联注释可以单独一行:

每个参数不得超过一行,如果一个参数需要多行,那么可以先将其赋值给一个变量,然后再将该变量传递给函数调用。

$bar = array( 'use_this' => true, 'meta_key' => 'field_name',);$baz = sprintf( /* translators: %s: Friend's name */ esc_html__( 'Hello, %s!', 'yourtextdomain' ), $friend_name); $a = foo( $bar, $baz, /* translators: %s: cat */ sprintf( __( 'The best pet is a %s.' ), 'cat' ));正则表达式

正则表达式应该使用 Perl 兼容的正则表达式(PCRE, preg_函数),另外永远不要使用 /e 开关,而是使用 preg_replace_callback。

在正则表达式中使用单引号字符串是最简便的,因为相比双引号,单引号字符串只有两个元序列需要转移:\' 和 \\。

PHP 开始和结束标记

在 HTML 模板中如果要嵌入多行 PHP 代码时,PHP 开始和结束标记都要自己单独一行。

正确(多行):

function foo() { ?> <div> <?php echo bar( $baz, $bat ); ?> </div> <?php}

正确(单行):

<input name="<?php echo esc_attr( $name ); ?>" />

错误:

if ( $a === $b ) { ?><some html><?php }不要使用简写的 PHP 标记

重要:永远不要使用简写的 PHP 标记,使用完整版。

正确:

<?php ... ?><?php echo $var; ?>

错误:

<? ... ?><?= $var ?>删除行尾的空格

删除每行末尾的空格,最好在文件末尾省略 PHP 结束标记,如果没有省略,那就确保删除 PHP 结束标记后面的空格。

空格的用法

始终在逗号后放置空格,并在逻辑运算符、比较运算符、字符串连接符和赋值运算符的两侧放置空格。

x === 23foo && bar! fooarray( 1, 2, 3 )$baz . '-5'$term .= 'X'

在控制语句中的左括号和右括号的两侧放置空格:

foreach ( $foo as $bar ) { ...

定义函数时,这样使用空格:

function my_function( $param1 = 'foo', $param2 = 'bar' ) { ...function my_other_function() { ...

调用函数时:

my_function( $param1, func_param( $param2 ) );my_other_function();

当执行逻辑运算时:

if ( ! $foo ) { ...

类型转换必须使用小写的, 并且使用简短形式,(int) 而不是 (integer) ,(bool) 而不是 (boolean),对于浮点类型转换,请使用 (float) 而不是 (real),因为 (real) 在 PHP 7.4 已被弃用,并在 PHP 8 被移除。

foreach ( (array) $foo as $bar ) { ...$foo = (bool) $bar;

当涉及到数组元素的时候,仅当元素的索引是变量的时候,在索引周围包含空格,例如:

$x = $foo['bar']; // 正确$x = $foo[ 'bar' ]; // 错误 $x = $foo[0]; // 正确$x = $foo[ 0 ]; // 错误 $x = $foo[ $bar ]; // 正确$x = $foo[$bar]; // 错误

在 switch 代码中, case 提交和冒号之间不要有空格:

switch ( $foo ) { case 'bar': // 正确 case 'ba' : // 错误}

同样,返回的类型声明的冒号前不应有空格:

function sum( $a, $b ): float { return $a + $b;}

除非另有说明,括号内应有空格。

if ( $foo && ( $bar || $baz ) ) { ...my_function( ( $x - 1 ) * 5, $y );格式化 SQL 语句

在格式化 SQL 语句时,如果 SQL 很复杂,可以将 SQL 语句分成几行并缩进。当然大部分 SQL 语句一行就可以了。然后将 SQL 语句中的关键字(比如 UPDATE 或者 WHERE)大写。

需要更新数据库的函数的参数,传递来之前应该没有对数据进行 SQL 斜杠转义,转义应该尽可能接近查询的时候执行,并且最好使用 $wpdb->prepare() 进行。

$wpdb->prepare() 是一种处理 SQL 查询的转义、引用和整数转换的方法。它使用 sprintf() 格式的子集。例子 :

$wpdb->prepare() 是用来对 SQL 查询进行转义、引用和整数转换等操作的方法,它 sprintf() 的一部分格式化方法,比如:

$var = "dangerous'"; // 可能未转义的原始数据$id = some_foo_number(); // 期待是整形的数据,但是不能确定 $wpdb->query( $wpdb->prepare( "UPDATE $wpdb->posts SET post_title = %s WHERE ID = %d", $var, $id ) );

%s 用于字符串占位符,而 %d 用于整数占位符。注意他们没有被引用,$wpdb->prepare() 会执行转义和引用的工作。

数据库查询

避免直接操作数据库,如果有定义的函数可以获取你需要的数据,则使用它。数据库抽象(使用函数而不是查询)有助于保持代码向前兼容,并且在查询结果被缓存到内存中的时候,它可以快很多倍。

命名约定

在变量名,action/filter 的名称和函数名使用小写,不要使用驼峰式,通过下划线分割单词, 如非必需不要使用缩写,让代码无歧义并能自我说明:

function some_name( $some_variable ) { [...] }

类名必须首字母大写,并用下划线分割,首字母缩写词都应全部大写:

class Walker_Category extends Walker { [...] }class WP_HTTP { [...] }

常量必须全部大写,并用下划线分割

define( 'DOING_AJAX', true );

文件名应使用小写字母进行描述性命名,使用连字符应分隔:

my-plugin-name.php

类文件名应该基于类名,然后在前面加上 class-,然后类名中的下划线替换为连字符,例如 WP_Error 的文件名:

class-wp-error.php

在 wp-includes 目录中含有函数模板标签函数的文件,都会在文件名称末尾附加 -template 以便它们显而易见。

general-template.php每个文件只有一个对象结构(类/接口/特征)

比如,有个名为 class-example-class.php 的文件,它只包含一个类:

// 错误: 文件 class-example-class.phpclass Example_Class { [...] }class Example_Class_Extended { [...] }

第二个类应该在自己的名字为 class-example-class-extended.php 的文件中:

// 正确:文件 class-example-class-extended.php.class Example_Class_Extended { [...] }

// 正确:文件 class-example-class-extended.php.class Example_Class_Extended { [...] }函数参数的自解释标志值

调用函数时使用字符串值而不是 true 和 false:

// 错误function eat( $what, $slowly = true ) {...}eat( 'mushrooms' );eat( 'mushrooms', true ); // true 是什么意思呢?eat( 'dogfood', false ); // false 又是什么意思呢?false 的反面?

PHP 直到 8.0 起,才支持命名参数,但是,由于 WordPress 目前仍支持较旧的 PHP 版本,我们还不能使用这些版本。

没有命名参数,标志的值是没有意义的,每次遇到像上面例子这样的函数调用时,我们都必须搜索函数定义才明白什么意思。通过使用描述性字符串值而不是布尔值,可以使代码更具可读性。

// 正确function eat( $what, $speed = 'slowly' ) {...}eat( 'mushrooms' );eat( 'mushrooms', 'slowly' );eat( 'dogfood', 'quickly' );

当需要使用更多词汇来描述函数参数时,$args 数组参数可能是更好的模式:

// 更好function eat( $what, $args ) {...}eat ( 'noodles', array( 'speed' => 'moderate' ) );动态 Hook 的插值命名

出于可读性和可发现性的目的,应使用插值而不是串联来命名动态 Hook。

动态 Hook 是在其标签名中包含动态值的 Hook,例如 {$new_status}_{$post->post_type}(publish_post)。

HooK 标签中使用的变量应该用大括号 { 和 } 括起来,完整的外部标签名称用双引号括起来。这是为了确保 PHP 可以正确解析内插字符串中给定的变量。

do_action( "{$new_status}_{$post->post_type}", $post->ID, $post );

可能的话,标签名称中的动态值也应尽可能简洁明了,比如 $user_id 就比 $this->id 更加清晰明了。

三元运算符

使用三元运算符很好,但是尽量让他们先测试为真,而不是假,否则容易混淆(一个例外是使用 ! empty(), 因为这里为假反而更直观)。

// (if statement is true) ? (do this) : (else, do this);$musictype = ( 'jazz' === $music ) ? 'cool' : 'blah';// (if field is not empty ) ? (do this) : (else, do this);尤达表达式

if ( true === $the_force ) { $victorious = you_will( $be );}

在涉及变量的逻辑比较时,始终将变量放在右侧,将常量、文字或函数调用放在左侧。如果双方都不是变量,则顺序并不重要。(在计算机科学术语中,在比较中总是尝试将 l 值放在右侧,将 r 值放在左侧。)

在上面的例子中,如果省略了一个等号(承认吧,即使是我们当中最有经验的人也会犯这种错误),你会得到一个解析错误,因为你不能赋值给一个像 true 这样的常量,如果该语句是相反的( $the_force = true ),则赋值将完全有效,返回 1,导致 if 语句结果为 true,这种错误可能让你花费很长时间去 Debug。

尤达表达式适用于 ==, !=, ===, 和 !==。而 <, >, <= 或者 >= 情况不会出现赋值的可能,并且不易阅读,不建议使用。

“聪明”的代码

一般来说,代码的可读性比聪明和简洁更重要:

isset( $var) || $var= some_function();

虽然上面的代码很巧妙,但如果你不熟悉它,需要一段时间才能理解。所以还是这样写吧:

if ( ! isset( $var ) ) { $var = some_function();}

除非绝对的必要,否则不应使用松散的比较,因为可能会产生误导。

正确:

if ( 0 === strpos( 'WordPress', 'foo' ) ) { echo __( 'Yay WordPress!' );}

错误:

if ( 0 == strpos( 'WordPress', 'foo' ) ) { echo __( 'Yay WordPress!' );}

赋值最好不要在条件表达式中:

正确:

$data = $wpdb->get_var( '...' );if ( $data ) { // Use $data}

错误:

if ( $data = $wpdb->get_var( '...' ) ) { // Use $data}

在 switch 语句中,可以将多个空的 case 放到一起。但是,如果一个 case 包含代码,然后直接进入下一个代码块,则必须明确注释。

switch ( $foo ) { case 'bar': // 正确,空的 case 无需注释 case 'baz': echo $foo; // 错误, 含有代码的 case 必须 break,return 或者含有注释 case 'cat': echo 'mouse'; break; // 正确,有 break 的 case 无需注释 case 'dog': echo 'horse'; // no break // 正确,含有注释的 case 可以不要 break。 case 'fish': echo 'bird'; break;}

goto 语句绝对不能用。

eval() 是非常危险并且无法确保安全。 create_function() 函数,相当于内部执行了内部执行 eval(),PHP 7.2 起已弃用,并已在 PHP 8.0 中删除,所以都不能使用。

错误控制符 @

引用 PHP 文档:

PHP 支持一种错误控制运算符:at 符号 (@)。当附加到 PHP 中的表达式时,该表达式可能生成的任何诊断错误都将被抑制。

虽然在 WordPress 核心代码中确实存在此运算符,但它经常被懒惰地使用,而不是进行适当的错误检查。强烈建议不要使用它,甚至 PHP 文档也指出:

警告:在 PHP 8.0.0 之前,@ 运算符可以禁用将终止脚本执行的严重错误。例如,将 @ 附加到不存在的函数调用之前,由于不可用或输入错误,将导致脚本终止而没有说明原因。

不要使用 extract()

extract() 是一个非常糟糕的函数,它使代码更难调试和更难理解,我们应该不应该使用它,并删除现有代码中的所有使用。

宝塔面板安装WordPress网站教程

安装网站环境

成功进入宝塔面板后,会提示安装LNMP运行环境

LNMP即Nginx、MySQL和PHP,这些环境是运行WordPress程序必不可少的。推荐使用PHP7以上版本,其他保持默认即可,推荐使用编译安装,耐心等待,可以在左上角查看进度。

必要的安全设置

为了提高安全性,建议修改面板的别名、默认端口、安全入口、面板用户和密码。

不建议修改并发线程,不建议添加域名和授权IP,以免出现访问不了面板的情况,其他的保持默认即可。

建立WordPress网站

宝塔面板有一键部署WordPress网站插件,但是版本较老,后期进入WordPress后台得升级。手动部署需要到WordPress官网下载最新的安装程序,还可以保证安全性。下面介绍的也会是手动建立站点,其实并没有很复杂。

添加站点

在宝塔界面找到网站,点击添加站点,会出现以下界面:

域名根据实际情况填写,如果是国内空间,则域名必须备案,国外空间则不需要,一般写一个顶级域名和一个www二级域名即可,比如www.jiami.dog,jiami.dog,搭建阶段可以也用云服务器的公网IP代替。

FTP可以选择不创建,后面可以用宝塔面板的文件管理。

数据库选择MySQL,会提示输入用户名名称和密码,自动建立与用户名同名的数据库

PHP版本选择你安装的PHP版本,我安装的是PHP7.2,建议安装版本不低于7。

点击提交,会提示站点创建成功,并显示数据库用户名和密码,这里不用刻意去记录,可以在宝塔的数据库管理界面再次查看。

站点创建完成之后,可以通过公网IP或你绑定的域名测试一下,在浏览器输入公网IP或你绑定的域名即可,如果成功,会显示以下页面:

到这里,网站的基本架构已经搭建完成了,下面要做的就是安装WordPress网站程序。

下载WordPress安装程序

到WordPress中文官网下载最新的中文安装包,一定要选择tar.gz格式

下载完成后需要将安装程序上传到刚刚建立的网站目录下,进入宝塔面板首页,找到你刚刚创建的网站目录

进入此目录会看到如下文件列表,这是宝塔创建站点时的默认主页和404页面,删除即可,.htaccess和.user.ini如果你不懂,就不要动。

上传WordPress安装程序

在你的网站目录下,点击上传,将你刚刚下载的WordPress程序上传,上传成功后是这个样子的:

解压WordPress压缩包

这一步可以使用命令行操作或使用宝塔面板操作,如果使用面板解压,那么解压后的目录权限默认是www用户的。如果使用命令解压,不要忘记把目录所属组更改为www用户,并把权限设置为755。

鼠标移上WordPress压缩包,右侧会出现工具栏,选择解压,在弹出的界面再次选择解压即可,解压完成后文件列表会是这样:

进入wordpress目录,全选所有文件,点击复制或剪切,然后返回到站点目录,选择粘贴所有,你的站点目录一定要是这个样子的:

之后就可以删除wordpress目录和wordpress压缩包,现在已经没用了。到此就完成了WordPress安装的准备工作。

运行WordPress安装程序

浏览器输入域名或公网IP,可以看到WordPress的安装程序页面,出现这个页面说明你之前做的都没问题。

在开始之前,我们需要找到之前创建的MySQL数据库用户名和密码,在宝塔面板-数据库中可以看到

回到WordPress安装页面,点击现在就开始,填入你的数据库名称、用户名和密码,其他项目保持默认即可。

如果信息都正确的话,点击提交会出现以下页面:

输入站点标题、用户名、密码和电子邮件,同时勾选“建议搜索引擎不索引本站点”,因为在网站建设初期不需要搜索引擎收录,后期可以改,点击“安装WordPress”,安装完成之后会出现以下界面:

你可以选择登录或者在浏览器输入你的域名或公网IP,出现以下类似的网页就说明站点搭建成功了。

设置伪静态和固定链接

这一步尤其重要,正确设置伪静态和固定链接可以保证网站被正常访问,顺序一定不要搞错了,先在宝塔设置伪静态规则,再设置WordPress固定链接,否则可能导致除首页之外的任何页面都访问不了。

设置伪静态规则

打开宝塔面板,找到你的站点,点击设置,找到伪静态,选择WordPress

设置固定链接

进入WordPress后台管理界面,找到设置-固定链接,我们使用自定义结构,用文章ID作为链接地址。

结束语

搭建一个网站的步骤还是挺多的,好在有这么多好用的工具来帮助我们建站,除了安装宝塔面板,没有输入一行命令就这么快速地搭建一个网站,真是太赞了。在此过程中要有足够的耐心,看起来容易,但是做起来,还是挺费时间的,希望各位胆大心细,出现问题不要惊慌,检查步骤即可,最坏情况删掉重新再来也不是麻烦事。

教你买人的钙片,牛奶,牛磺酸,蒙脱石喂猫狗,真的又便宜又好

大家好啊

最近一直在研究自制,包括一些人用的产品,发现其实很多所谓的宠物专用产品挂了一个宠物的名字就卖的特别贵,而且并不一定很好

套用一首歌,如果真的是比价格,宠物的真的比人的高几倍

有些产品我们可以用很多人的产品代替,反而又便宜又好

今天就讲这个吧,let's go

人用药品?综述

之前人药兽用在台湾引起了很大的争议,大家可以看看我在脸书上关注的一个博主的说法

因为其实在全球来说,兽药的品种很少,效果不好,如果只用有批文的药,很多病根本没法治,价格也高很多

所以我就有了这个灵感写这篇把人的产品给宠物用的文章

对于药品我了解的真的不多,大部分我也不敢拿人用代替猫狗用

但是有个东西是可以的,就是蒙脱石

人用药品-蒙脱石

蒙脱石是一种物理止泻的产品,也能够吸附一些毒素和水分,放在猫狗粮中不仅能让猫狗软便减少,毕竟水分被蒙脱石吸了,也能吸附黄曲霉素,还能够提供一些矿物质

平时猫狗吃一般都是为了猫狗止泻,我们来看宠物吃的蒙脱石,人吃的蒙脱石,和我们去16爸爸买蒙脱石原料分别多少钱

蒙脱石宠物:5克 10袋,50克卖80块钱,算下来1块6毛钱 1克

有的宠物用蒙脱石粉还加一些鸡肉粉啊,鸡肝粉增加一些适口性,这个不知道有没有加

这个人吃的蒙脱石呢

蒙脱石散人吃:3g 10袋,30g 15块钱,算下来5毛钱1克

而在某宝上买蒙脱石的原料

75块钱50斤,1块5一斤,算下来只要0.3分钱1g

所以算下来宠物蒙脱石是人的蒙脱石价格的3.2倍,是我们看得到的原料价格的533倍

总结一下,人的蒙脱石可以完全替代宠物的,只是不那么好吃而已

只是要注意喂食量,狗的蒙脱石喂食量

18斤以下:2.5g

18-45斤:5g

45-81斤:15g

超过90斤:15-30g

我并没有找到专门说猫应该喂多少蒙脱石的文章,我觉得大家可以参照狗的,一天喂1-2g左右看看情况,如果是生病的话,则谨遵医嘱

而有些所谓宠物专用的蒙脱石,喂养指南根本没有认真写,要么是所有宠物一个用法

要么是喂养指南10kg体重以上的狗喂养量一样

真的很不用心

蒙脱石的主要副作用是便秘,所以注意提供足够的水,检查便秘情况

另外提醒一下,不要照搬宠物蒙脱石的喂养指南,因为宠物蒙脱石我看了几个不是100%的蒙脱石,比如上图启贝的,1袋5g的蒙脱石,只有1.5g是蒙脱石。而我看了几个人吃的蒙脱石3g一袋,3g几乎都是蒙脱石

人营养品综述

鱼油,益生菌,关节保健品我会单独写,所以今天暂时不详细说了,虽然不知道什么时候写,稍微提几句

吃人的鱼油,如果鱼油里面没有维生素d,需要单独补充一点,以免造成维生素E缺乏。而且维生素E是一种抗氧化剂,也非常难中毒,多吃一点没问题的

补充量,猫是每1公斤粮里,每1g鱼油,添加10IU 的维生素E

Add 10 IU Vitamin E above the minimum concentration for each gram of fish oil per kilogram of diet.

对狗来说,每吃10ml的鱼油,搭配4IU的维生素E比较好,同样大家可以选择人的药用的维生素E,比如我随便找了一个

吃人的益生菌会遇到无效的情况,因为有些菌种对猫狗无效

人和猫狗关节保健品的成分其实差不多,都是些葡萄糖胺,软骨素,绿唇贻贝,但要算算价格和喂养量

人营养品-钙片

喂人的钙片我推荐两种原料的

一种是乳矿物盐。比如这个健力多的,114块3瓶60片牛乳钙

而且钙都是进口牛奶里面提取的,宠物的钙片哪里说过100%来自进口牛奶的乳钙啊,我是没见过

为什么选乳矿物盐的人的钙片,因为钙磷比大概是2比1左右

不过可能钙磷比比2比1稍微高一点,最高可能到2.8比1,

喂钙片的时候推荐配合肉一起吃,因为肉天然的磷高钙低,是一种中和

另外一种磷酸氢钙钙磷比天然接近1比1,对猫狗来说是更安全的一种钙源,因为不用那么担心钙磷比的问题

这个要68块钱60g,除了土豪不推荐,太贵了

当然你一定要喂其他原料比如碳酸钙啊,柠檬酸钙啊也行,只是注意补充对应的磷就好

喂多少呢,教大家另一个方法,我们可以直接参照宠物的钙片,比如发育宝钙胃能和上面那个万通,原料都是磷酸氢钙,人吃的这个每袋有0.5g,也就是500mg的磷酸氢钙,钙胃能有270g,那吃这个人的磷酸氢钙只要按照这个指南减半吃就好

不过不过人吃的磷酸氢钙钙片,由于打上了帮小孩长高的噱头,性价比极低,加了一些赖氨酸卖的比宠物的都贵,还是更推荐牛乳钙的,那个卖的便宜,大家找个牛乳钙的钙片算算就好

不过我觉得宠物,无论猫狗,除非兽医诊断,根本不用补钙,反而人要补钙,因为我想了一下我每天吃的食物,含钙的真的很少,什么鸡蛋壳,骨头我都很少吃

人营养品-牛磺酸

最近一直聊的很多的牛磺酸,推荐狗补充,来减少无谷粮心脏问题完全可以吃人用的

宠物红狗含量仅仅只有4%的牛磺酸片,卖你158一瓶,只有80g,等于只有3.2g牛磺酸,才3200mg牛磺酸

而买个进口的吧,不算折扣,1瓶进口牛磺酸100片,每片1000mg,算下来100g牛磺酸都只要159

进口的牛磺酸的必要性不大,因为中国是全世界最大的牛磺酸生产国,你买的进口牛磺酸很有可能是中国生产的

而国内作为饲料的牛磺酸50斤买的多只要29,5毛8一斤

关于牛磺酸狗的补充剂量之前说过了

狗补充牛磺酸有两种说法

1.每36斤补充500mg牛磺酸

2.小型犬每天补充500mg,中型犬每天1000mg,大型犬1500mh

对应now那个牛磺酸片就是小型犬一天半片,中型犬一天一片,大型犬一天一片半

零食牛奶

很多人喜欢给猫狗喂宠物牛奶

其实一个牛奶,羊奶猫狗能不能喝有两个因素

第一个是猫狗本身有没有乳糖不耐,因为每只猫狗不一样,有些猫狗正常的牛奶羊奶都可以喝

第二个就是把奶里面的乳糖去掉

国内最著名的宠物牛奶应该就是新西兰的zeal了吧

zeal 33块 380ml 进口零乳糖牛奶

但是你同样也可以选人吃的零乳糖的牛奶啊

比如这个法国进口的中粮上质零乳糖奶4800ml才卖109

zeal 119只能买不到5瓶,不到2000ml,买人吃的也是进口奶源的零乳糖牛奶,能买1倍多

而且你的猫狗不爱喝,你还可以喝,完全没有压力,我都想下单买了,牛奶也补钙啊

自制

自制其实就是最多的人的食品给猫狗吃的例子

你去超市,菜市场都买不到什么供应给猫狗的肉,菜什么的,都是卖给人的

为什么自制那么好?生骨肉那么好?

最重要的就是你买的全部都是人吃的食材,无论在安全,品质上都完爆90%猫狗粮厂,猫狗零食厂用的原料

最后

最后,大家记住,只有主食才有必要买宠物专用的,如果你不自制的话,其他的我们都可以去思考两个问题

宠物专用产品的原料是什么?是否人的更好更便宜

我家猫狗如果喂人的产品,喂食量是多少

这样,你就能成长为一个更优秀的铲屎官,不会被厂家,也不会被各个宠物博主带节奏,交智商税,付更多的钱买更差的产品

大家也要清楚,你要比别人猫狗养的更好是有代价是,是需要经历痛苦的,是需要你去研究,去计算的

走上这条路是没有那么容易做伸手党的

包括我一直也有这个毛病,我不太喜欢写太难的文章,就是不想经历那么多写文章的痛苦,所以有些问题我并没有研究的那么深刻

看乐队的夏天就会有感触,你要承受痛苦的那一部分,才能把事情做好,这个事情就包括把猫狗养好

不过由于我本身不喜欢买东西,所以也欢迎大家给我推荐其他人用的产品,我留作下一期的文章

查资料查产品查的好累,头疼,今天就到这里了~

参考资料

1.AAFCO Dog and Cat Food Nutrient Profiles

2.

3.