内容 第2页

第一节:Vue3 开发WordPress设置选项 - PHP传数据给JS

阅读(32)

书接上回,我们使用 Vue3 技术撰写前端,为了与后台进行交互,包括从前端加载的开始获取初始设置数据等,都需要从 PHP 中获取数据,但我们开发的项目打包后,只有 JS 文件,因此,开发的第一件事就是解决 PHP 传值给 JS 的问题。

为了方便我们的功能实现,我们开发一个简单的插件。简单介绍下软件环境,都是三平台通用的,大家能都用

  • 编辑器:Visual Studio Code
  • 环境:Local

目标

通过 PHP,将所需数据传给 JS 文件,并在 JS 文件中打印出来。

准备环境

VS Code 下载后安装使用即可。
Local 下载安装后,可点击左下角“+”按钮,一路默认选择,填写站点名称即可.
创建后,如下所示,

左侧列表选择自己创建的站点,

  • 点击 Go to site folder 进入站点文件夹,选择 app → public 即可看到站点根目录文件
  • 点击 WP Admin 即可进入站点后台

我们先在 WordPress 站点的wp-content/plugins目录下新建文件夹 vue-spa ,我们在这里撰写代码,实现我们的功能。

准备插件信息并启用

现在,我们在 vue-spa 文件夹下添加新文件“vue-spa.php”文件,写入以下内容

//vue-spa.php
<?php
/*
Plugin Name: Vue - SPA 
Plugin URI: https://www.npc.ink
Description: 将vue构建的页面嵌入WordPress 中并产生交互
Author: Muze
Author URI: https://www.npc.ink
Version: 1.0.0
*/

分别代表:

  • 插件名
  • 插件介绍网址
  • 插件功能介绍
  • 插件作者
  • 插件作者介绍网站
  • 插件版本

现在,我们的插件准备好了,点击 WP Admin 即可进入站点后台,进入插件页面,选择 Vue – SPA 插件启用吧

准备菜单

为了验证我们准备的数据,需要一个地方来展示,方便验证,就做个菜单出来。承接上文,添加以下代码

//创建一个菜单
function vuespa_create_menu_page()
{
    add_menu_page(
        'VueSpa选项',                   // 此菜单对应页面上显示的标题
        'VueSpa',                      // 要为此实际菜单项显示的文本
        'administrator',               // 哪种类型的用户可以看到此菜单
        'vuespa_id',                   //  此菜单项的唯一ID(即段塞)
        'vuespa_menu_page_display',    // 呈现此页面的菜单时要调用的函数的名称
        'dashicons-admin-customizer',  //图标 - 默认图标
        '500.1',                       //位置
    );
} // end vuespa_create_menu_page 
add_action('admin_menu', 'vuespa_create_menu_page');
//菜单回调 - 展示的内容

function vuespa_menu_page_display()
{
?>
    <!--在默认WordPress“包装”容器中创建标题-->
    <div class="wrap">
        <!--标题-->
        <h2><?php echo esc_html(get_admin_page_title()); ?></h2>
        <!--提供Vue挂载点-->
        <div id="vuespa">此内容将在挂载Vue后被替换</div>
    </div>
<?php

} // vuespa_menu_page_display

代码的用途我放注释了,大家可以看看,主要作用是,在 WordPress 后台创建一个菜单,并展示一段话。

  • 其中的 class 样式class="wrap"是 WordPress 自带的,有利于页面的一致性。
  • 其中的图标,可在本节的开始提供的网址中获取,是 WordPress 的自带图标

现在,我们刷新 WordPress 后台,可以找到 VueSpa 菜单,点击打开即可。

若没有此菜单,请检查是否启用了 Vue – SPA 插件

准备JS文件接收数据

为了确定 PHP 传给 JS 的数据是成功的,我们需要在 JS 文件中进行验证。

我们在插件文件夹下新建文件夹 vite 和 dist 文件夹,并新建 index.js 和index.css 文件,结构类似这样

vue-spa/vite/dist/index.js
vue-spa/vite/dist/index.css

index.js 写入以下代码

//vite/dist/index.js
alert("我加载啦 - Npcink")

index.css 暂时不写

现在,我们需要在 vue-spa.php 文件中载入 index.js 文件,我们在 vue-spa.php 文件中添加以下代码

//载入所需 JS 和 CSS 资源
function vuespa_load_vues($hook)
{
    //判断当前页面是否是指定页面,是则继续加载
    if ('toplevel_page_vuespa_id' != $hook) {
        return;
    }
    //版本号
    $ver = '52';
    //加载到页面顶部
    wp_enqueue_style('vite', plugin_dir_url(__FILE__) . 'vite/dist/index.css', array(), $ver, false);
    wp_enqueue_script('vite', plugin_dir_url(__FILE__) . 'vite/dist/index.js', array(), $ver, false);

}
//样式加载到后台
add_action('admin_enqueue_scripts', 'vuespa_load_vues');

现在,我们只有打开 VueSpa 菜单才会有弹窗。此时,我们就加载了 JS 文件。

准备数据

我们通过PHP准备数据,在JS文件中通过弹窗显示出来。

我们在 vue-spa.php 页面底部添加以下代码准备数据

//准备待传输的数据
function vuespa_data()
{
    $person = [
        "str" => "Hello, world!",
        "num" => 25,
        "city" => [1, 2, 3, 4, 5],
    ];
    return $person;
}

为了看到数据是否做好,我们修改下菜单回调函数 vuespa_menu_page_display() ,先用PHP将数据展示看看

//菜单回调 - 展示的内容
function vuespa_menu_page_display()
{
?>
    <!--在默认WordPress“包装”容器中创建标题-->
    <div class="wrap">
        <!--标题-->
        <h2><?php echo esc_html(get_admin_page_title()); ?></h2>
        <!--提供Vue挂载点-->
        <div id="vuespa">此内容将在挂载Vue后被替换</div>
    </div>
<?php

//展示准备的数据
    echo "<pre>";
    print_r(vuespa_data());
    echo "</pre>";
} // vuespa_menu_page_display

效果如下:

数据展示正常,

传递数据

  • wp_localize_script() | Function | WordPress Developer Resources

传递数据,我们要用到 wp_localize_script()函数,修改我们载入JS的函数 vuespa_load_vues()

//载入所需 JS 和 CSS 资源 并传递数据
function vuespa_load_vues($hook)
{
    //判断当前页面是否是指定页面,是则继续加载
    if ('toplevel_page_vuespa_id' != $hook) {
        return;
    }
    //版本号
    $ver = '52';
    //加载到页面顶部
    wp_enqueue_style('vite', plugin_dir_url(__FILE__) . 'vite/dist/index.css', array(), $ver, false);
    wp_enqueue_script('vite', plugin_dir_url(__FILE__) . 'vite/dist/index.js', array(), $ver, false);

    $pf_api_translation_array = array(
        'route' => esc_url_raw(rest_url()),     //路由
        'nonce' => wp_create_nonce('wp_rest'), //验证标记
        'data' => vuespa_data(),               //自定义数据
    );
    wp_localize_script('vite', 'dataLocal', $pf_api_translation_array); //传给vite项目
}
//样式加载到后台
add_action('admin_enqueue_scripts', 'vuespa_load_vues');

再修改我们的 index.js 文件,将拿到的数据打印出来

//vite/dist/index.js
console.table(dataLocal);

在WordPress 中,点击VueSpa菜单,使用浏览器的开发者工具,即可在控制台中看到传递的数据

其中,各个数据的用途可见注释

'route' => esc_url_raw(rest_url()),     //路由
    'nonce' => wp_create_nonce('wp_rest'), //验证标记
    'data' => vuespa_data(),               //自定义数据
nonce: "82711b7680"
   route: "http://localhost:10004/wp-json/"
  • 我们通过传来的路由,知道要发出 POST 请求的网址
  • 我们通过传来的验证标记,在发出 POST 请求时进行身份验证
  • 我们通过传来的data数据,在 JS 文件中进行进一步的操作

补充

vue-spa.php 本节完整代码

<?php
/*
Plugin Name: Vue - SPA 
Plugin URI: https://www.npc.ink
Description: 将vue构建的页面嵌入WordPress 中并产生交互
Author: Muze
Author URI: https://www.npc.ink
Version: 1.0.0
*/


//创建一个菜单
function vuespa_create_menu_page()
{
    add_menu_page(
        'VueSpa选项',                   // 此菜单对应页面上显示的标题
        'VueSpa',                      // 要为此实际菜单项显示的文本
        'administrator',               // 哪种类型的用户可以看到此菜单
        'vuespa_id',                   //  此菜单项的唯一ID(即段塞)
        'vuespa_menu_page_display',    // 呈现此页面的菜单时要调用的函数的名称
        'dashicons-admin-customizer',  //图标 - 默认图标
        '500.1',                       //位置
    );
} // end vuespa_create_menu_page 
add_action('admin_menu', 'vuespa_create_menu_page');

//菜单回调 - 展示的内容
function vuespa_menu_page_display()
{
?>
    <!--在默认WordPress“包装”容器中创建标题-->
    <div class="wrap">
        <!--标题-->
        <h2><?php echo esc_html(get_admin_page_title()); ?></h2>
        <!--提供Vue挂载点-->
        <div id="vuespa">此内容将在挂载Vue后被替换</div>
    </div>
<?php

    //展示准备的数据
    echo "<pre>";
    print_r(vuespa_data());
    echo "</pre>";
} // vuespa_menu_page_display



//载入所需 JS 和 CSS 资源 并传递数据
function vuespa_load_vues($hook)
{
    //判断当前页面是否是指定页面,是则继续加载
    if ('toplevel_page_vuespa_id' != $hook) {
        return;
    }
    //版本号
    $ver = '52';
    //加载到页面顶部
    wp_enqueue_style('vite', plugin_dir_url(__FILE__) . 'vite/dist/index.css', array(), $ver, false);
    wp_enqueue_script('vite', plugin_dir_url(__FILE__) . 'vite/dist/index.js', array(), $ver, false);

    $pf_api_translation_array = array(
        'route' => esc_url_raw(rest_url()),     //路由
        'nonce' => wp_create_nonce('wp_rest'), //验证标记
        'data' => vuespa_data(),               //自定义数据
    );
    wp_localize_script('vite', 'dataLocal', $pf_api_translation_array); //传给vite项目
}
//样式加载到后台
add_action('admin_enqueue_scripts', 'vuespa_load_vues');


//准备待传输的数据
function vuespa_data()
{
    $person = [
        "str" => "Hello, world! - Npcink",
        "num" => 25,
        "city" => [1, 2, 3, 4, 5],
    ];
    return $person;
}

获取hook变量

若您想知道当前页面的hook变量,可在 vue-spa.php 页面底部添加以下代码获取

function wpdocs_myselective_css_or_js($hook)
{
    echo '<h1 style="color: crimson;text-align: center;">' . esc_html($hook) . '</h1>';
}
//获取当前页面hook
add_action('admin_enqueue_scripts', 'wpdocs_myselective_css_or_js');

最新文章

  • 后续文章持续撰写中,点个关注,获取平台最新文章推送。
  • 技术有限,还望诸位协助勘误,于评论区指出,
  • 常一文多发,最新勘定和增补文章于下方链接给出

00:讲透WordPress 菜单开发 - 添加菜单和子菜单

阅读(28)

在 WordPress 开发中,创建菜单是很多主题或插件开发者常做的事情,对于您,也是或多或少有些许了解的。

但我总结了一些新方法和实际案例,再通过诸多实例和实例图给以详细的介绍,写能帮到您。

本人不才,在此稍做总结,希望能帮助各位查缺补漏,有些许收获。

流程

效果

以下是一些自定义菜单的案例,供大家参考

顶级菜单

带子菜单的顶级菜单

现有顶级菜单下的子菜单

菜单页面是指您首次登录 WordPress 时看到的菜单项。也就是说,它们是左侧菜单中的可用选项,可以包含子菜单页面列表。

创建顶级菜单

参数

add_menu_page( 
string $page_title,
string $menu_title, 
string $capability, 
string $menu_slug, 
    callable $callback = '', 
string $icon_url = '', 
int|float $position = null 
): string 

实例

我们先创建一个顶级菜单出来,再解释每一个参数的意思。

将下列代码添加至当前已启用主题的 function.php 文件底部,

//创建一个菜单
function vuespa_create_menu_page()
{
    add_menu_page(
'VueSpa选项', // 此菜单对应页面上显示的标题
'VueSpa', // 要为此实际菜单项显示的文本
'administrator', // 哪种类型的用户可以看到此菜单
'vuespa_id', //  此菜单项的唯一ID(即段塞)
'vuespa_menu_page_display', // 呈现此页面的菜单时要调用的函数的名称
'dashicons-admin-customizer', //图标 - 默认图标
'500.1', //位置
);
} // end vuespa_create_menu_page 
add_action('admin_menu', 'vuespa_create_menu_page');

保存后,刷新后台页面,即可看到新添加的菜单

效果

$page_title – VueSpa选项

$page_title 选择菜单时要在页面的标题标签中显示的文本

此内容主要展示在页面标签上

再就是之后介绍的回调函数中

  1. <?php echo esc_html(get_admin_page_title());?>

$menu_title – VueSpa

$menu_title 是用于菜单的文本

出现在菜单中,比如这里

$capability – administrator

权限控制,那些权限的用户可以看到此菜单

在本例子中,是只有管理员才能看到此菜单,更多权限可见此文底部给出的权限列表,根据自己的需求选择对应 slug 接口.

用户的权限控制在用户菜单,所有用户中,选择您需要修改的用户,点击编辑,在角色选项中。

$menu_slug – vuespa_id

用于引用此菜单的辅助信息域名称。对于此菜单页面应该是唯一的,并且仅包含小写字母数字、短划线和下划线字符以与 sanitize_key() 兼容。

这个很重要,WordPress 凭借此值找到您设置的菜单信息。

请根据要求填写为唯一的ID,推荐用自己的专属前缀,该信息展示在菜单链接中

  1. http://localhost:10004/wp-admin/admin.php?page=vuespa_id

同时,也会出现在页面 $hook 中,此菜单的 $hook 值是

  1. toplevel_page_vuespa_id

此值是每个菜单的唯一标识值。

后续,我们将使用这一值实现在指定菜单中加载 JS 和 CSS 的功能。

获取此值的方法在页面底部给出。

注意:此值在子菜单中可能会被转义,请注意相关介绍中给出的解决方法。

$callback – vuespa_menu_page_display

调用以输出此页面内容的函数

我们需要在菜单中展示的内容,由此 vuespa_menu_page_display() 函数提供。下面是一个例子

function vuespa_menu_page_display()
{
?>
<!--在默认WordPress“包装”容器中创建标题-->
<div class="wrap">
<!--标题-->
<h2><?php echo esc_html(get_admin_page_title()); ?></h2>
<!--提供Vue挂载点-->
<div id="vuespa">此内容将在挂载Vue后被替换{{data}}</div>
</div>
<?php
} // vuespa_menu_page_display

其中,为了整体外观的一致性,请在菜单内容的最外层,使用样式 class="wrap" 包裹。

回调函数中打印的内容或暴露的内容等,会展示在菜单内容中。

$icon_url – dashicons-admin-customizer

要用于此菜单的图标的 URL

用户展示菜单用的图标值,如下

有以下两个常用方法。

除此之外,还有更多添加自定义图标的方法,篇幅有限,后续补充。

WordPress 图标库

可通过上述链接,在有限的图标中选择自己需要的类型,选择自己需要的图标,点击 “Copy HTML”菜单,将需要的值填入即可。

自定义图标

我们可以去第三方平台,比如开发图标库和阿里巴巴矢量图标库等,找到自己喜欢的svg图标,获取其中的值,通过如下实例方法,进行使用。

$icon = '<svg width="20" height="20" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg"><path fill="black" d="M1280 704q0-26-19-45t-45-19q-172 0-318 49.5t-259.5 134-235.5 219.5q-19 21-19 45 0 26 19 45t45 19q24 0 45-19 27-24 74-71t67-66q137-124 268.5-176t313.5-52q26 0 45-19t19-45zm512-198q0 95-20 193-46 224-184.5 383t-357.5 268q-214 108-438 108-148 0-286-47-15-5-88-42t-96-37q-16 0-39.5 32t-45 70-52.5 70-60 32q-43 0-63.5-17.5t-45.5-59.5q-2-4-6-11t-5.5-10-3-9.5-1.5-13.5q0-35 31-73.5t68-65.5 68-56 31-48q0-4-14-38t-16-44q-9-51-9-104 0-115 43.5-220t119-184.5 170.5-139 204-95.5q55-18 145-25.5t179.5-9 178.5-6 163.5-24 113.5-56.5l29.5-29.5 29.5-28 27-20 36.5-16 43.5-4.5q39 0 70.5 46t47.5 112 24 124 8 96z"/></svg>';
 add_menu_page(
'VueSpa选项', // 此菜单对应页面上显示的标题
'VueSpa', // 要为此实际菜单项显示的文本
'administrator', // 哪种类型的用户可以看到此菜单
'vuespa_id', //  此菜单项的唯一ID(即段塞)
'vuespa_menu_page_display', // 呈现此页面的菜单时要调用的函数的名称
'data:image/svg+xml;base64,' . base64_encode( $icon ), //图标 
'500.1', //位置
);

$position – 500.1

菜单顺序中的位置

通过填写不同的数字,可以改变菜单显示的位置,我建议您带上一个小数点,避免与第三方资源产生冲突。

WordPress 自带的菜单有默认的顺序值,我会在页面底部给出。

您按需选择自己需要的数字即可。

子菜单

子菜单没有图标

有时,单一的菜单不足以满足自己的需求,例如下面这种情况

此时,就需要用到我们的子菜单了。

参数

# add_submenu_page( 
string $parent_slug, 
string $page_title, 
string $menu_title, 
string $capability, 
string $menu_slug, 
    callable $callback = '', 
int|float $position = null 
): string|false

实例

在当前已启用主题的 function.php 文件下方添加以下代码

//创建一个菜单
function vuespa_create_menu_page()
{
    add_menu_page(
'VueSpa选项', // 此菜单对应页面上显示的标题
'VueSpa', // 要为此实际菜单项显示的文本
'administrator', // 哪种类型的用户可以看到此菜单
'vuespa_id', //  此菜单项的唯一ID(即段塞)
'vuespa_menu_page_display', // 呈现此页面的菜单时要调用的函数的名称
'dashicons-admin-customizer', //图标 - 默认图标
'500.1', //位置
);
//添加子菜单
    add_submenu_page(
'vuespa_id', //使用上面定义的菜单注册此子菜单
'1号子菜单选项', // 当此菜单项处于活动状态时,浏览器中显示的文本
'控制1号', // 此菜单项的文本
'administrator', // 哪种类型的用户可以看到此菜单
'one_options', // 此菜单项的唯一ID-段塞
'one_options_display', // 用于将此页面的菜单呈现到屏幕的函数
'100.1', //位置
);
//添加子菜单
    add_submenu_page(
'vuespa_id', //使用上面定义的菜单注册此子菜单
'2号子菜单选项', // 当此菜单项处于活动状态时,浏览器中显示的文本
'控制2号', // 此菜单项的文本
'administrator', // 哪种类型的用户可以看到此菜单
'two_options', // 此菜单项的唯一ID-段塞
'two_options_display', // 用于将此页面的菜单呈现到屏幕的函数
'100.2', //位置
);
} // end vuespa_create_menu_page 
add_action('admin_menu', 'vuespa_create_menu_page');

还得补上子菜单的回调函数

//1号子菜单的回调
function one_options_display()
{
?>
<div class="wrap">
我是1号
</div>
<?php
}
//2号子菜单的回调
function two_options_display()
{
?>
<div class="wrap">
我是2号 - Npcink
</div>
<?php
} 

这里,我们在 VueSpa 菜单下新建了两个菜单,效果如下

$parent_slug – vuespa_id

父菜单的 slug 名称(或标准 WordPress 管理页面的文件名)

这里的 $parent_slug 的值,可以是我们之前创建顶级菜单时设置的 $menu_slug的值,也可以是 WordPress 自带菜单的文件名的值,

相关参数于页面底部给出

关于在WordPress 默认菜单下添加子菜单,其他章节会详细举例。

在 WordPress 默认菜单下方添加子菜单

这里,我们以在仪表盘下方添加子菜单为例

方法1 – 使用文件名

//仪表盘下创建子菜单 - 使用文件名
function npcink_add_menu_index()
{
    add_submenu_page(
'index.php',
'3号子菜单', // 此菜单对应页面上显示的标题
'控制3号', // 要为此实际菜单项显示的文本
'manage_options', //权限,谁能访问
'three_options', //唯一ID
'three_options_display', //呈现此页面的菜单时要调用的函数的名称
'90'
);
}
add_action('admin_menu', 'npcink_add_menu_index');
//3号子菜单的回调
function three_options_display()
{
?>
<div class="wrap">
我是3号 - Npcink
</div>
<?php
}

效果

方法2 – 使用辅助函数

这里,我们去掉了 $parent_slug 。

//仪表盘下创建子菜单 - 使用函数名
function npcink_add_menu_index_s()
{
    add_dashboard_page(
'5号子菜单', // 此菜单对应页面上显示的标题
'控制5号', // 要为此实际菜单项显示的文本
'manage_options', //权限,谁能访问
'five_options_s', //唯一ID
'five_options_display_s', //呈现此页面的菜单时要调用的函数的名称
'90'
);
}
add_action('admin_menu', 'npcink_add_menu_index_s');
//3号子菜单的回调
function five_options_display_s()
{
?>
<div class="wrap">
我是5号 - Npcink_s
</div>
<?php
} 

效果

添加不包含顶级菜单的子菜单

在包含顶级菜单时,我们希望点击顶级菜单,就能跳转到第一个子菜单,而不是把顶级菜单内容也加到子菜单中。您可以参考如下写法

//创建一个菜单
function vuespa_create_menu_page()
{
    add_menu_page(
'VueSpa选项', // 此菜单对应页面上显示的标题
'VueSpa', // 要为此实际菜单项显示的文本
'administrator', // 哪种类型的用户可以看到此菜单
'vuespa_id', //  此菜单项的唯一ID(即段塞)
false, // 呈现此页面的菜单时要调用的函数的名称 'vuespa_menu_page_display'
'dashicons-admin-customizer', //图标 - 默认图标
'500.1', //位置
);
//添加子菜单
    add_submenu_page(
'vuespa_id', //使用上面定义的菜单注册此子菜单
'1号子菜单选项', // 当此菜单项处于活动状态时,浏览器中显示的文本
'控制1号', // 此菜单项的文本
'administrator', // 哪种类型的用户可以看到此菜单
'vuespa_id', // 此菜单项的唯一ID-段塞
'one_options_display', // 用于将此页面的菜单呈现到屏幕的函数
'100.1', //位置
);
//添加子菜单
    add_submenu_page(
'vuespa_id', //使用上面定义的菜单注册此子菜单
'2号子菜单选项', // 当此菜单项处于活动状态时,浏览器中显示的文本
'控制2号-Npcink', // 此菜单项的文本
'administrator', // 哪种类型的用户可以看到此菜单
'two_options', // 此菜单项的唯一ID-段塞
'two_options_display', // 用于将此页面的菜单呈现到屏幕的函数
'100.2', //位置
);
} // end vuespa_create_menu_page 
add_action('admin_menu', 'vuespa_create_menu_page');

其中,其他不变,我将顶级菜单的回调函数设为 `false` ,并且将第一个子菜单的slug设为顶级菜单的slug,这样,就实现了如下效果

资料

感谢以下链接提供的资料

权限表

  • 超级管理员 – 有权访问站点网络管理功能和所有其他功能的人。请参阅创建网络一文。
  • 管理员(slug:“administrator”) ——有权访问单个站点内所有管理功能的人。
  • 编辑器(slug:“editor”) ——可以发布和管理帖子(包括其他用户的帖子)的人。
  • 作者(slug:“author”) ——可以发布和管理自己的帖子的人。
  • 贡献者(slug:“contributor”) ——可以编写和管理自己的帖子但不能发布的人。
  • 订阅者(slug:“subscriber”) ——只能管理其个人资料的人。

获取页面唯一 $hook

function wpdocs_myselective_css_or_js( $hook ) {
    echo '<h1 style="color: crimson;text-align: center;">' . esc_html( $hook ) . '</h1>';
}
add_action( 'admin_enqueue_scripts', 'wpdocs_myselective_css_or_js' ); 

默认菜单顺序值

网络管理菜单是开启多站点管理时才会出现的,一般用户无需关注

默认值:菜单结构底部

  • 2 – 仪表板
  • 4 – 分离器
  • 5 – 帖子
  • 10 – 媒体
  • 15 – 链接
  • 20 – 页
  • 25 – 评论
  • 59 – 分离器
  • 60 – 外观
  • 65 – 插件
  • 70 – 用户
  • 75 – 工具
  • 80 – 设置
  • 99 – 分离器

对于“网络管理”菜单,值不同:

  • 2 – 仪表板
  • 4 – 分离器
  • 5 – 站点
  • 10 – 用户
  • 15 – 主题
  • 20 – 插件
  • 25 – 设置
  • 30 – 更新
  • 99 – 分离器

默认菜单的子菜单

文件名

1、在仪表盘添加子菜单: add_submenu_page( ‘index.php’, … );

2、在文章处添加子菜单: add_submenu_page( ‘edit.php’, … );

3、在媒体处添加子菜单: add_submenu_page( ‘upload.php’, … );

4、在链接处添加子菜单: add_submenu_page( ‘link-manager.php’, … );

5、在页面处添加子菜单: add_submenu_page( ‘edit.php?post_type=page’, … );

6、在评论处添加子菜单: add_submenu_page( ‘edit-comments.php’, … );

7、在你自定义文章类型处添加子菜单: add_submenu_page(‘edit.php?post_type=your_post_type’,…)

8、在外观处添加子菜单: add_submenu_page( ‘themes.php’, … );

9、在插件处添加子菜单: add_submenu_page( ‘plugins.php’, … );

10、在用户处添加子菜单: add_submenu_page( ‘users.php’, … );

11、在工具处添加子菜单: add_submenu_page( ‘tools.php’, … );

12、在设置处添加子菜单: add_submenu_page( ‘options-general.php’, … );

函数

父页面辅助信息域 替代功能
index.php(仪表板) add_dashboard_page()
edit.php(帖子) add_posts_page()
upload.php(媒体) add_media_page()
edit.php?post_type=page(页) add_pages_page()
edit-comments.php(评论) add_comments_page()
themes.php(外观) add_theme_page()
plugins.php(插件) add_plugins_page()
users.php(用户) add_users_page()
tools.php(工具) add_management_page()
options-general.php(设置) add_options_page()

完整代码

//创建一个菜单 
function vuespa_create_menu_page()
{
    add_menu_page(
'VueSpa选项', // 此菜单对应页面上显示的标题
'VueSpa', // 要为此实际菜单项显示的文本
'administrator', // 哪种类型的用户可以看到此菜单
'vuespa_id', //  此菜单项的唯一ID(即段塞)
'vuespa_menu_page_display', // 呈现此页面的菜单时要调用的函数的名称
'dashicons-admin-customizer', //图标 - 默认图标
'500.1', //位置
);
//添加子菜单
    add_submenu_page(
'vuespa_id', //使用上面定义的菜单注册此子菜单
'1号子菜单选项', // 当此菜单项处于活动状态时,浏览器中显示的文本
'控制1号', // 此菜单项的文本
'administrator', // 哪种类型的用户可以看到此菜单
'one_options', // 此菜单项的唯一ID-段塞
'one_options_display', // 用于将此页面的菜单呈现到屏幕的函数
'100.1', //位置
);
//添加子菜单
    add_submenu_page(
'vuespa_id', //使用上面定义的菜单注册此子菜单
'2号子菜单选项', // 当此菜单项处于活动状态时,浏览器中显示的文本
'控制2号-Npcink', // 此菜单项的文本
'administrator', // 哪种类型的用户可以看到此菜单
'two_options', // 此菜单项的唯一ID-段塞
'two_options_display', // 用于将此页面的菜单呈现到屏幕的函数
'100.2', //位置
);
} // end vuespa_create_menu_page 
add_action('admin_menu', 'vuespa_create_menu_page');
//菜单回调 - 展示的内容
function vuespa_menu_page_display()
{
?>
<!--在默认WordPress“包装”容器中创建标题-->
<div class="wrap">
<!--标题-->
<h2><?php echo esc_html(get_admin_page_title()); ?></h2>
<!--提供Vue挂载点-->
<div id="vuespa">此内容将在挂载Vue后被替换{{data}}</div>
</div>
<?php
} // vuespa_menu_page_display
//1号子菜单的回调
function one_options_display()
{
?>
<div class="wrap">
我是1号
</div>
<?php
}
//2号子菜单的回调
function two_options_display()
{
?>
<div class="wrap">
我是2号 - Npcink
</div>
<?php
}
//仪表盘下创建子菜单 - 使用文件名
function npcink_add_menu_index()
{
    add_submenu_page(
'index.php',
'3号子菜单', // 此菜单对应页面上显示的标题
'控制3号', // 要为此实际菜单项显示的文本
'manage_options', //权限,谁能访问
'three_options', //唯一ID
'three_options_display', //呈现此页面的菜单时要调用的函数的名称
'90'
);
}
add_action('admin_menu', 'npcink_add_menu_index');
//3号子菜单的回调
function three_options_display()
{
?>
<div class="wrap">
我是3号 - Npcink
</div>
<?php
}
//仪表盘下创建子菜单 - 使用函数名
function npcink_add_menu_index_s()
{
    add_dashboard_page(
'5号子菜单', // 此菜单对应页面上显示的标题
'控制5号', // 要为此实际菜单项显示的文本
'manage_options', //权限,谁能访问
'five_options_s', //唯一ID
'five_options_display_s', //呈现此页面的菜单时要调用的函数的名称
'90'
);
}
add_action('admin_menu', 'npcink_add_menu_index_s');
//3号子菜单的回调
function five_options_display_s()
{
?>
<div class="wrap">
我是5号 - Npcink_s
</div>
<?php
}

预告

这里主要讲了如何在 WordPress 中创建菜单,在下一节,我们讲解决两个实际问题

  • 菜单Tab选项卡
  • 指定菜单加载JS和CSS
  • 指定用户可见菜单

最新文章

  • 后续文章持续撰写中,点个关注,获取平台最新文章推送。
  • 技术有限,还望诸位协助勘误,于评论区指出,
  • 常一文多发,最新勘定和增补文章于下方链接给出

当使用 VS Code 打造一个完善的 C++ 开发环境时,可以按照以下步骤进行

阅读(47)

  1. 安装 Visual Studio Code:前往 VS Code 官方网站(https://code.visualstudio.com/)下载并安装适用于你的操作系统的版本。
  2. 安装 C++ 扩展:在 VS Code 中,点击左侧的扩展图标(或使用快捷键 Ctrl+Shift+X),搜索并安装 “C++” 扩展,这将为你提供 C++ 开发所需的功能和工具。
  3. 安装编译器:C++ 需要一个编译器来将源代码编译为可执行文件。根据你的操作系统,选择并安装一个合适的 C++ 编译器,例如:
    • Windows:安装 MinGW 或者 Microsoft Visual C++ Build Tools。
    • macOS:安装 Xcode Command Line Tools。
    • Linux:安装 GCC 或者 Clang。
  4. 配置编译器路径:打开 VS Code,点击左下角的设置图标(或使用快捷键 Ctrl+,),在设置中搜索 “C++”,找到 “C++: Compiler Path” 选项,设置为你安装的编译器的路径。
  5. 创建 C++ 项目:在 VS Code 中,打开一个文件夹作为你的 C++ 项目的根目录。可以使用菜单栏的 “文件” -> “打开文件夹” 或者使用命令行打开。
  6. 创建或打开 C++ 源代码文件:在项目中创建一个新的 C++ 源代码文件(例如 main.cpp),或者打开一个已有的 C++ 源代码文件。
  7. 编写代码:在打开的源代码文件中编写你的 C++ 代码。
  8. 编译和运行:按下快捷键 Ctrl+Shift+B,选择合适的编译任务(例如 “build” 或者 “compile and run”),这将会编译你的代码并生成可执行文件。你也可以通过在终端中手动执行编译命令来完成这一步骤。
  9. 调试:VS Code 提供了强大的调试功能。你可以设置断点、单步执行代码、查看变量值等。点击左侧的调试图标(或使用快捷键 Ctrl+Shift+D)打开调试面板,配置调试环境并开始调试。
  10. 其他功能:VS Code 还提供了许多其他有用的功能,例如代码自动补全、代码格式化、代码片段等。你可以根据需要安装适用的扩展,并根据个人喜好进行配置。

你可以在 VS Code 中打造一个完善的 C++ 开发环境,方便编写、编译、调试和管理你的 C++ 项目。


当你已经完成了上述步骤后,还可以进一步补充你的 C++ 开发环境,以提高开发效率和代码质量。以下是一些额外的步骤和建议:

7. 使用代码自动补全工具:代码自动补全工具可以帮助你快速输入代码,并提供代码建议和补全。在 VS Code 中,你可以安装 C++ 代码自动补全工具,如 “C/C++ IntelliSense” 扩展,它可以根据你的代码上下文提供智能的代码补全功能。

8. 使用代码重构工具:代码重构工具可以帮助你对代码进行重构,改善代码结构和可维护性。在 VS Code 中,你可以使用 “Visual Studio IntelliCode” 扩展,它提供了一些代码重构功能,如重命名变量、提取函数等。

9. 使用性能分析工具:性能分析工具可以帮助你找出代码中的性能瓶颈,并进行优化。在 C++ 开发中,你可以使用工具如 “Valgrind” 或 “Intel VTune Amplifier” 来进行性能分析。你可以在 VS Code 中安装相应的扩展,并配置工具的路径和规则。

10. 使用单元测试框架:单元测试框架可以帮助你编写和运行单元测试,以验证代码的正确性和稳定性。在 C++ 开发中,你可以使用框架如 “Google Test” 或 “Catch2” 来编写单元测试。你可以在 VS Code 中安装相应的扩展,并配置测试运行器。

11. 使用文档生成工具:文档生成工具可以帮助你自动生成代码文档,以提供给其他开发人员参考。在 C++ 开发中,你可以使用工具如 “Doxygen” 或 “Sphinx” 来生成代码文档。你可以在 VS Code 中安装相应的扩展,并配置生成规则。

12. 持续集成和部署:考虑将你的代码集成到持续集成和部署流程中,以确保代码的质量和稳定性你可以。使用工具如 “Jenkins” 或 “Travis CI” 来进行持续集成和部署。在 VS Code 中,你可以安装相应的扩展,并配置集成和部署流程。

通过以上补充步骤和建议,你可以进一步完善你的 C++ 开发环境,并提高开发效率和代码质量。祝你编程愉快!


当你已经完成了上述步骤后,还可以进一步补充你的 C++ 开发环境,以提高开发效率和代码质量。以下是一些额外的步骤和建议:

7. 使用版本控制工具:版本控制工具可以帮助你管理代码的版本和变更,以便于团队协作和代码回滚。在 C++ 开发中,你可以使用工具如 “Git” 来进行版本控制。你可以在 VS Code 中安装 Git 扩展,并配置你的代码仓库。

8. 使用代码审查工具:代码审查工具可以帮助你进行代码质量的审查和改进。在 C++ 开发中,你可以使用工具如 “Cppcheck” 或 “Clang-Tidy” 来进行静态代码分析。你可以在 VS Code 中安装相应的扩展,并配置代码审查规则。

9. 使用性能调优工具:性能调优工具可以帮助你找出代码中的性能问题,并进行优化。在 C++ 开发中,你可以使用工具如 “perf” 或 “gprof” 来进行性能调优。你可以在 VS Code 中安装相应的扩展,并配置调优规则。

10. 使用内存管理工具:内存管理工具可以帮助你检测和修复内存泄漏和内存访问错误。在 C++ 开发中,你可以使用工具如 “Valgrind” 或 “AddressSanitizer” 来进行内存管理。你可以在 VS Code 中安装相应的扩展,并配置内存管理规则。

11. 使用代码格式化工具:代码格式化工具可以帮助你统一代码的格式和风格,以提高代码的可读性和可维护性。在 C++ 开发中,你可以使用工具如 “Clang-Format” 或 “Uncrustify” 来进行代码格式化。你可以在 VS Code 中安装相应的扩展,并配置格式化规则。

12. 参与开源项目:参与开源项目可以帮助你学习和提高自己的编程能力,并与其他开发者进行交流和合作。你可以在 GitHub 等平台上找到感兴趣的 C++ 开源项目,并贡献自己的代码和想法。

通过以上补充步骤和建议,你可以进一步完善你的 C++ 开发环境,并提高开发效率和代码质量。祝你编程愉快!


当你已经完成了上述步骤后,还可以进一步补充你的 C++ 开发环境,以提高开发效率和代码质量。以下是一些额外的步骤和建议:

7. 使用调试器:调试器可以帮助你找出代码中的错误和问题,并进行调试。在 C++ 开发中,你可以使用工具如 “GDB” 或 “LLDB” 来进行调试。你可以在 VS Code 中安装相应的扩展,并配置调试器。

8. 使用代码生成工具:代码生成工具可以帮助你自动生成代码,以提高开发效率和减少重复工作。在 C++ 开发中,你可以使用工具如 “Yeoman” 或 “CppCodeGenerator” 来进行代码生成。你可以在 VS Code 中安装相应的扩展,并配置生成规则。

9. 使用代码分析工具:代码分析工具可以帮助你分析代码的结构和依赖关系,以便于代码重构和优化。在 C++ 开发中,你可以使用工具如 “Understand” 或 “CppDepend” 来进行代码分析。你可以在 VS Code 中安装相应的扩展,并配置分析规则。

10. 使用多线程库:多线程库可以帮助你实现并发和并行计算,以提高程序的性能和响应速度。在 C++ 开发中,你可以使用库如 “OpenMP” 或 “Pthreads” 来进行多线程编程。你可以在 VS Code 中安装相应的扩展,并配置多线程规则。

11. 使用图形界面库:图形界面库可以帮助你实现图形化界面,以便于用户交互和数据可视化。在 C++ 开发中,你可以使用库如 “Qt” 或 “GTK+” 来进行图形界面编程。你可以在 VS Code 中安装相应的扩展,并配置图形界面规则。

12. 学习算法和数据结构:学习算法和数据结构可以帮助你提高编程能力和解决问题的能力。你可以学习经典的算法和数据结构,如排序、查找、树、图等,并在实际项目中应用它们。

通过以上补充步骤和建议,你可以进一步完善你的 C++ 开发环境,并提高开发效率和代码质量。祝你编程愉快!


当你已经完成了上述步骤后,还可以进一步补充你的 C++ 开发环境,以提高开发效率和代码质量。以下是一些额外的步骤和建议:

7. 使用单元测试框架:单元测试框架可以帮助你编写和运行测试用例,以验证代码的正确性和稳定性。在 C++ 开发中,你可以使用框架如 “Google Test” 或 “Catch2” 来进行单元测试。你可以在 VS Code 中安装相应的扩展,并配置测试规则。

8. 使用持续集成工具:持续集成工具可以帮助你自动构建、测试和部署代码,以提高开发效率和代码质量。在 C++ 开发中,你可以使用工具如 “Jenkins” 或 “Travis CI” 来进行持续集成。你可以在 VS Code 中安装相应的扩展,并配置集成规则。

9. 使用性能分析工具:性能分析工具可以帮助你分析代码的性能瓶颈和优化点,以提高程序的运行效率。在 C++ 开发中,你可以使用工具如 “Perf” 或 “Intel VTune” 来进行性能分析。你可以在 VS Code 中安装相应的扩展,并配置分析规则。

10. 使用代码文档生成工具:代码文档生成工具可以帮助你自动生成代码的文档和注释,以提高代码的可读性和可维护性。在 C++ 开发中,你可以使用工具如 “Doxygen” 或 “CppDoc” 来进行文档生成。你可以在 VS Code 中安装相应的扩展,并配置文档生成规则。

11. 学习设计模式:学习设计模式可以帮助你设计和组织代码的结构,以提高代码的可扩展性和可重用性。你可以学习经典的设计模式,如工厂模式、单例模式、观察者模式等,并在实际项目中应用它们。

12. 参加编程竞赛:参加编程竞赛可以帮助你锻炼编程能力和解决问题的能力,并与其他优秀的开发者进行竞争和交流。你可以参加像 ACM ICPC、Google Code Jam 等编程竞赛,并挑战自己的编程水平。

通过以上补充步骤和建议,你可以进一步完善你的 C++ 开发环境,并提高开发效率和代码质量。祝你编程愉快!


当你已经完成了上述步骤后,还可以进一步补充你的 C++ 开发环境,以提高开发效率和代码质量。以下是一些额外的步骤和建议:

7. 使用版本控制系统:版本控制系统可以帮助你管理代码的版本和变更,以便于团队协作和代码回滚。在 C++ 开发中,你可以使用工具如 “Git” 或 “SVN” 来进行版本控制。学习使用基本的版本控制命令,如提交代码、拉取代码、分支管理等。

8. 使用代码静态分析工具:代码静态分析工具可以帮助你检测代码中的潜在问题和不规范之处,以提高代码的质量和可维护性。在 C++ 开发中,你可以使用工具如 “Cppcheck” 或 “Clang-Tidy” 来进行静态分析。配置这些工具以在编译时或编辑器中显示警告和建议。

9. 学习优化技巧:学习一些常用的优化技巧可以帮助你提高代码的性能和效率。在 C++ 开发中,你可以学习如何减少内存分配、避免不必要的拷贝、使用更高效的数据结构等。阅读相关的书籍和文章,并在实际项目中应用这些技巧。

10. 参与开源项目:参与开源项目可以帮助你学习和借鉴其他开发者的经验和技巧,同时也可以提高你的代码质量和可见性。选择一些与你兴趣相关的开源项目,并积极参与其中,提交代码、解决问题、与社区交流。

11. 持续学习和探索:C++ 是一门非常庞大和复杂的编程语言,不断学习和探索新的特性和技术是非常重要的。关注 C++ 社区的最新动态,参加技术讲座、研讨会和培训课程,与其他开发者交流和分享经验。

通过以上补充步骤和建议,你可以进一步完善你的 C++ 开发环境,并提高开发效率和代码质量。祝你编程愉快!如果你还有其他问题,我会很乐意帮助你。


当你已经完成了上述步骤后,还可以进一步补充你的 C++ 开发环境,以提高开发效率和代码质量。以下是一些额外的步骤和建议:

12. 使用调试器:调试器是一个非常有用的工具,可以帮助你定位代码中的错误和问题。在 C++ 开发中,你可以使用工具如 “GDB” 或 “LLDB” 来进行调试。学习使用基本的调试命令,如设置断点、单步执行、查看变量值等。

13. 使用性能分析工具:性能分析工具可以帮助你找出代码中的性能瓶颈和优化点,以提高代码的性能和效率。在 C++ 开发中,你可以使用工具如 “Valgrind” 或 “Perf” 来进行性能分析。配置这些工具以收集性能数据,并分析结果以找出优化点。

14. 学习多线程编程:多线程编程是一种常用的技术,可以帮助你提高代码的并发性和性能。在 C++ 开发中,你可以学习如何使用线程库如 “std::thread” 或 “pthread” 来进行多线程编程。学习如何避免线程安全问题和死锁等常见问题。

15. 学习模板编程:模板编程是 C++ 中的一种高级技术,可以帮助你实现通用的数据结构和算法。在 C++ 开发中,你可以学习如何使用模板来实现泛型编程。学习如何使用模板元编程来实现高效的编译时计算。

16. 学习面向对象设计:面向对象设计是一种常用的软件设计方法,可以帮助你实现可维护和可扩展的代码。在 C++ 开发中,你可以学习如何使用类、继承、多态等面向对象的概念来进行设计。学习如何遵循 SOLID 原则和设计模式等常用的设计方法。

通过以上补充步骤和建议,你可以进一步完善你的 C++ 开发环境,并提高开发效率和代码质量。祝你编程愉快!如果你还有其他问题,我会很乐意帮助你。

不同数据周期之间的关系及影响

阅读(18)

股票的不同周期数据(如15分钟、30分钟、60分钟、日数据和月数据)可以提供不同层次的市场信息,帮助投资者更好地理解市场趋势和制定交易策略。以下是对这些周期数据的一般理解和利用方法:

1. 15分钟周期:15分钟周期数据提供了较短期的价格波动情况,适合进行日内交易或短期交易。投资者可以观察价格的短期趋势、支撑位和阻力位等技术指标,以捕捉短期的价格波动。

2. 30分钟周期:30分钟周期数据相对于15分钟周期数据提供了更长一点的时间跨度,可以更好地观察价格的中期趋势。投资者可以结合其他技术指标,如移动平均线和相对强弱指标,来判断价格的中期走势和市场动能。

3. 60分钟周期:60分钟周期数据提供了更长期的价格走势,适合进行短期到中期的交易。投资者可以观察价格的长期趋势、重要支撑位和阻力位等关键价格水平,以制定相应的交易策略。

4. 日数据:日数据提供了每个交易日的开盘价、最高价、最低价和收盘价等信息,可以帮助投资者观察价格的长期趋势和重要的价格水平。投资者可以结合日数据进行技术分析,如绘制趋势线、观察价格形态和判断价格的支撑位和阻力位等。

5. 月数据:月数据提供了每个月的开盘价、最高价、最低价和收盘价等信息,可以帮助投资者观察价格的长期趋势和重要的价格水平。投资者可以结合月数据进行趋势分析,如观察长期趋势线、判断价格的长期支撑位和阻力位等。

利用这些周期数据,投资者可以根据自己的交易策略和风险偏好,选择合适的周期进行分析和决策。较短周期的数据适合短期交易,而较长周期的数据适合长期投资。同时,可以结合不同周期的数据进行多重时间框架分析,以获得更全面的市场视角和更准确的交易信号。

补充一些关于股票不同周期数据的理解和利用方法:

1. 不同周期数据的关系:不同周期的数据之间存在一定的关系,较短周期的数据会受到较长周期数据的影响。例如,日数据的趋势会影响到60分钟周期数据的走势,60分钟周期数据的趋势又会影响到30分钟周期数据的走势,以此类推。因此,投资者可以结合多个周期的数据进行分析,以获得更全面的市场视角和更准确的交易信号。

2. 利用不同周期数据进行交易:投资者可以利用不同周期数据进行交易,例如,结合较短周期数据进行日内交易,结合较长周期数据进行长期投资。同时,可以结合不同周期的数据进行多重时间框架分析,以获得更全面的市场视角和更准确的交易信号。

3. 注意不同周期数据的局限性:不同周期数据的局限性也需要注意。较短周期的数据容易受到噪音的影响,而较长周期的数据可能会忽略短期的价格波动。因此,投资者需要根据自己的交易策略和风险偏好,选择合适的周期进行分析和决策。

4. 结合其他技术指标进行分析:除了不同周期数据之外,投资者还可以结合其他技术指标进行分析,如移动平均线、相对强弱指标、MACD等。这些指标可以帮助投资者更准确地判断价格的趋势和市场动,从能而制定相应的交易策略。

总之,股票不同周期数据可以提供不同层次的市场信息,帮助投资者更好地理解市场趋势和制定交易策略。投资者需要根据自己的交易策略和风险偏好,选择合适的周期进行分析和决策,并结合其他技术指标进行分析。

多重时间框架分析是一种将不同周期的数据结合起来进行分析的方法,可以提供更全面的市场视角和更准确的交易信号。以下是一些常见的多重时间框架分析方法:

1. 长期趋势确认:首先,可以使用较长周期的数据(如日线或周线)来确认股票或市场的长期趋势。通过观察价格走势、移动平均线等指标,判断股票或市场是处于上升趋势、下降趋势还是盘整阶段。

2. 中期趋势确认:接下来,可以使用中等周期的数据(如4小时线或60分钟线)来确认股票或市场的中期趋势。通过观察价格走势、趋势线、技术指标等,判断股票或市场的中期趋势是否与长期趋势一致。

3. 短期趋势确认:最后,可以使用较短周期的数据(如15分钟线或5分钟线)来确认股票或市场的短期趋势。通过观察价格走势、波动指标、超买超卖指标等,判断股票或市场的短期趋势是否与长期和中期趋势一致。

在多重时间框架分析中,关键是要观察不同周期数据之间的一致性和相互关系。如果长期、中期和短期趋势都一致,那么交易信号就更加可靠。例如,如果长期趋势为上升,中期趋势也为上升,而短期趋势出现了回调,那么这可能是一个买入机会。

此外,还可以结合其他技术指标和价格形态进行分析。例如,可以观察价格在不同时间框架下的支撑位和阻力位,以及价格形态如头肩顶、双底等形态的出现情况。

需要注意的是,多重时间框架分析需要综合考虑不同周期数据的信息,同时也需要根据自己的交易策略和风险偏好进行判断和决策。

除了多重时间框架分析,还有一些其他的方法可以结合不同周期数据进行分析:

1. 交叉验证:交叉验证是一种将不同周期数据进行交叉验证的方法。例如,可以使用日线数据来预测未来一周的走势,然后使用一周线数据来验证预测的准确性。如果预测准确,那么可以增加交易的信心和准确性。

2. 趋势线分析:趋势线分析是一种将不同周期数据结合起来进行趋势分析的方法。例如,可以使用日线数据来绘制长期趋势线,然后使用小时线数据来绘制中期趋势线,最后使用分钟线数据来绘制短期趋势线。这样可以更全面地了解股票或市场的趋势和走势。

3. 价格形态分析:价格形态分析是一种将不同周期数据结合起来进行价格形态分析的方法。例如,可以使用日线数据来识别头肩顶、双底等形态,然后使用小时线数据来确认形态的有效性,最后使用分钟线数据来确定交易信号。

需要注意的是,不同周期数据的分析方法需要根据自己的交易策略和风险偏好进行选择和调整。同时,也需要注意不同周期数据之间的关系和局限性,以避免分析出现偏差和误判。

当进行多重时间框架分析时,还可以考虑以下几个方面:

1. 同步性分析:观察不同周期数据之间的同步性,即它们是否在同一时间点出现相似的趋势或信号。如果不同周期数据之间存在高度的同步性,那么交易信号的可靠性会更。

2高. 交叉指标分析:使用不同周期数据计算的指标进行交叉分析。例如,可以使用长期周期数据计算的移动平均线与短期周期数据计算的指标(如相对强弱指标)进行比较,以确认趋势的一致性和交叉信号的出现。

3. 价格和成交量关系:观察不同周期数据中价格和成交量之间的关系。例如,如果在较短周期数据中出现价格上涨但成交量下降的情况,可能意味着市场的买盘力量减弱,可能会影响长期和中期趋势。

4. 风险管理:在进行多重时间框架分析时,要注意风险管理。不同周期数据的分析可能会给出不同的交易信号,但要根据自己的风险承受能力和交易计划来决定是否执行交易。

总的来说,多重时间框架分析可以提供更全面和准确的市场视角,帮助确定趋势和交易信号。然而,分析结果仍需结合其他因素进行综合判断,同时要注意市场的动态变化和风险管理。

另外,多重时间框架分析还可以结合其他技术指标和图表模式来增强分析的准确性和可靠性。以下是一些常用的技术指标和图表模式:

1. 技术指标:例如移动平均线、相对强弱指标(RSI)、随机指标(Stochastic Oscillator)、MACD等。这些指标可以帮助确定价格趋势、超买超卖区域、背离等信号。

2. 图表模式:例如头肩顶、双底、三角形形态、矩形整理等。这些模式可以提供价格反转或延续的预测,帮助确定买入或卖出信号。

3. 支撑位和阻力位:观察不同周期数据中的支撑位和阻力位,这些价格水平常常具有重要的技术意义。当价格接近支撑位时,可能会出现反弹;当价格接近阻力位时,可能会出现回调。

4. 价格形态:观察价格的形态特征,例如趋势线的斜率、价格的震荡幅度、价格的波动性等。这些特征可以提供关于趋势的信息,帮助判断市场的走势和波动性。

需要注意的是,多重时间框架分析并不是绝对准确的预测工具,而是一种辅助分析的方法。在进行分析时,要综合考虑多个因素,并结合自己的交易计划和风险管理策略来做出决策。同时,市场是动态变化的,分析结果可能会随着时间的推移而发生变化,因此需要及时调整和更新分析。

此外,多重时间框架分析还可以结合市场情绪和基本面因素进行综合分析。以下是一些补充的要点:

1. 市场情绪:市场情绪是指投资者对市场的整体情感和情绪状态。情绪可以影响市场的波动性和趋势,因此在多重时间框架分析中要考虑市场情绪的影响。可以通过观察交易量、波动性指标(如VIX指数)和市场参与者的情绪调查等来评估市场情绪。

2. 基本面因素:基本面因素包括经济数据、公司财报、政治事件等对市场的影响。在多重时间框架分析中,要考虑基本面因素对不同时间周期的影响。例如,较长周期的分析可能更关注宏观经济数据和长期趋势,而较短周期的分析可能更关注公司财报和短期市场事件。

3. 事件驱动分析:事件驱动分析是指根据特定事件的发生和影响来进行分析。这些事件可能包括公司发布重要公告、政府发布政策、经济数据公布等。在多重时间框架分析中,要注意事件对不同时间周期的影响,并结合技术指标和图表模式来判断市场的反应和趋势。

综上所述,多重时间框架分析是一种综合考虑不同时间周期、技术指标、图表模式、市场情绪和基本面因素的方法。通过综合分析这些因素,可以提供更全面和准确的市场视角,帮助做出更明智的交易决策。然而,分析结果仍需谨慎评估,并结合个人的交易计划和风险管理策略来决策。

另外,多重时间框架分析还可以结合其他交易工具和策略来增强分析的效果。以下是一些常用的交易工具和策略:

1. 波动性指标:例如平均真实范围(ATR)和波动性通道(Bollinger Bands)等。这些指标可以帮助确定价格的波动性水平,从而帮助确定止损和盈利目标的位置。

2. 动量指标:例如相对强弱指标(RSI)和随机指标(Stochastic Oscillator)等。这些指标的价格助可以判断帮超买超卖情况,从而提供买入和卖出的时机。

3. 支撑位和阻力位:观察价格在历史数据中的支撑位和阻力位,这些价格水平常常具有重要的技术意义。当价格接近支撑位时,可能会出现反弹;当价格接近阻力位时,可能会出现回调。

4. 趋势线:通过绘制趋势线来判断价格的趋势方向。趋势线可以帮助确定买入和卖出的时机,并提供价格反转或延续的预测。

5. 均线系统:通过使用不同周期的移动平均线来判断价格的趋势和交叉信号。例如,当短期移动平均线上穿长期移动平均线时,可能会出现买入信号;当短期移动平均线下穿长期移动平均线时,可能会出现卖出信号。

需要注意的是,交易工具和策略的选择应根据个人的交易风格和偏好来确定。不同的工具和策略可能适用于不同的市场环境和交易品种。同时,交易决策应综合考虑多重时间框架分析的结果,并结合风险管理策略来进行。

运算符左移和右移与数学之间的关系

阅读(28)

运算符左移(`<<`)和右移(`>>`)在C++中是位操作符,用于对二进制数进行位移操作。它们与数学中的移位操作有一定的关系,但并不完全相同。

运算符左移(`<<`)将一个二进制数的所有位向左移动指定的位数。例如,`x << n`将二进制数`x`的所有位向左移动`n`位。在移位过程中,右侧空出的位将用零填充。这类似于数学中的乘法操作,将一个数乘以2的幂。

运算符右移(`>>`)将一个二进制数的所有位向右移动指定的位数。例如,`x >> n`将二进制数`x`的所有位向右移动`n`位。在移位过程中,左侧空出的位将用符号位(对于有符号数)或零(对于无符号数)填充。这类似于数学中的除法操作,将一个数除以2的幂。

需要注意的是,运算符左移和右移是按位操作,而不是数学运算。它们对于处理二进制数据和位级操作非常有用,但在数学运算中并不常见。

以下是一些示例,以说明运算符左移和右移的效果:

“`cpp
int x = 10; // 二进制表示为 00001010

int leftShifted = x << 2; // 左移2位,结果为 00101000,相当于数学上的 x * 2^2 = 40

int rightShifted = x >> 1; // 右移1位,结果为 00000101,相当于数学上的 x / 2^1 = 5
“`

希望这可以帮助你理解运算符左移和右移与数学之间的关系。

QT学习-Qt第一个小程序(使用vs2017开发)-研读

阅读(24)

前言

这篇文章就是使用c++开发QT界面。网上关于QT的开发文章眼花缭乱,因为可以在qt creater里面使用c++或者qt designer设计界面,也可以在vs里面使用c++或者qt designer设计界面,花了不少时间弄清楚c++与QT的关系。所以写下此篇博文,方便使用c++开发QT界面的童鞋入门。

Qt是一个1991年由Qt Company开发的跨平台C++图形用户界面应用程序开发框架。你可以通过在QT 的creater软件中使用c++语言进行界面和逻辑的编写,也可以在VS里面进行QT界面的开发,这里我介绍的是后者。在一个工程里面,加入界面设计。Anyway,QT就是一个C++框架,所以C++的规则都可以在这里实现,你所看到的不同于C++的东西也是通过C++编写,封装在框架里面的。当然我们也可以在vs里面使用c++语言直接写界面,但是我觉得qt designer对控件进行布局,省下了很多代码。下面是c++结合qt designer的代码设计过程。

最新更新,学习QT,强烈推荐从这个网站开始:Qt教程,Qt5编程入门教程(非常详细)

#############################################################################

Qt第一个小程序(使用vs2017开发)

2020-01-14 16:11:01
环境

在进行开发前,你需要确保安装了开发环境:

1、安装好QT

https://www.qt.io/download这是QT的官网,选择go open source去下载安装就行。

(按教程安装环境后编译报找不到头文件的错误,查资料得知是 使用MSVC编译器,但是MSVC的 include路径没有设好,在不熟悉windows环境和QT的情况下,用简单的方式(mingw),将编译调试器改为选择mingw 先跑起来先。Qt显示无法打开包含文件”stddef.h”-CSDN论坛)

 

2、安装好VS

3、在VS里面配置好QT.(可以参考https://blog.csdn.net/u014265347/article/details/54972611或Qt5.7 + VS2015 环境搭建_一去丶二三里的博客-CSDN博客_vs2015配置qt环境)

(本工程用的开发环境是vs2015+qt5.10.1)

这篇博客的项目是QT官网教程上的一个使用qt designer设计界面的程序,我们将在VS2015里面使用qt designer设计界面,然后使用c++设计逻辑。

首先打开VS2015,建立工程文件addTool,然后一直点击“next”直到“finish”结束

工程创建成功后,在vs2015的界面里面,显示创建了一下几个文件:

 

其中,我们会对其进行编辑的文件有:

addTool.ui qt designer进行界面设计的文件;

addTool.cpp 编写具体槽函数等;

addTool.h 对界面类进行申明;

下图是加法器实现效果界面,需要用到两个spin控件、1个5个Label和1个Text Browser。当我们改变spin控件的数值时,在Text Browser会显示当前时刻两个加数的和。

 

首先双击addTool.ui ,我们可以通过Widget Box查找这些控件。

 

因为在代码中用到输入、输出控件变量,所以我们在拖出控件后,按下面的方法修改控件的名字:

即要修改控件的名字,然后在程序中的ui类进行调用该名字(变量)

选中控件,在右侧的属性栏里面,找到objectName,把名字由spinBox给成add1。

修改后:

使用同样的方法,把输入的两个spin控件变量名分别为add1、add2,输出的控件Text Browser变量名为result。

现在回到我们的编程。现在我们要解决的问题,就是把对控件的操作跟我们的代码关联起来。这里我们主要解决两个问题:

1、控件的值改变时,怎样实现更新加法值并显示到TextBrowser上?

2、控件的变量怎样映射的类中?

首先,打开.h文件,我们可以看到Ui::addToolClass ui

 

所有界面的变量(控件的名字),可以理解为ui的成员变量。这样第一个问题就解决了。

要想解决第二个问题,我们要理解qt里面的一个机制—“信号槽”。简单的说,假如界面有一个按钮,点击就会弹出对话框,那么”点击”这个动作就是信号,“弹出对话框”的实现就是通过槽做到的。如果我们不通过qt designer来设计界面,只使用c++语言来写界面的话,就需要用到connect函数,但是我们使用qt desgner来设计界面就不需要了,只需要在slots添加函数,下面是程序。

addTool.h,在这个文件里面,添加构造函数和槽函数。

addTools.h

addTool.cpp 具体的函数实现

addTools.cpp

槽函数写好后,我们接下来需要把控件关联槽函数。我们双击addTool.ui 文件,先选中spin控件,点击框中的那个按钮(关联槽函数的按钮)

 

然后左击控件spin,往下拖一段距离,再松开手,就会弹出控件关联槽函数的对话框。

选择valueChanged(int),在右侧通过编辑,把我们写的slot函数添加进来。

 

添加完毕后,选择add1_valueChange(int)

按照同样的方法,给spin2选择槽函数add2_valueChange(int)

 

然后保存.ui文件,按ctrl+f5编译运行工程文件,就可以看到我们的加法工具了,随意改变spin控件的值,会实现加法运算。

(1)自己最后调试的时候,在addTools.h最后一个大括号外的分号不知道怎么没有了,运行就出来了一大堆错误,加上就可以正确运行了

(2)可以设置可输入数值的最大值和最小值

 

VS2019现有项目添加Qt界面

阅读(115)

Qt安装

注意,没有Qt账号请在电脑断网情况下安装。(安装时间较长)

  • 运行qt-opensource-windows-x86-5.14.2.exe,点击next,我的安装路径为C:\Qt\Qt5.14.2,这里选择组件MSVC 2017 32-bitMSVC 2017 64-bit
  • 勾选许可协议,点击下一步->安装即可。

 

VS Qt插件

打开VS2019,点击扩展->管理拓展->联机->搜索Qt,下载并安装。安装完成后需要重启VS。注意关闭Qt插件的自动更新功能。

配置Qt插件

进人VS2019后,在扩展下面选择Qt VS Tools->Qt Options,然后进行qt配置:

选择Qt安装目录下路径 “C:\Qt\Qt5.14.2\5.14.2\msvc2017_64“即可。

配置包含目录及链接器

VC++目录->包含目录 添加

C:\Qt\Qt5.14.2\5.14.2\msvc2017_64\include

库目录下添加

C:\Qt\Qt5.14.2\5.14.2\msvc2017_64\lib

链接器->输入->附加依赖项中添加下面项

  1. Qt5Widgetsd.lib
  2. Qt5Widgets.lib
  3. Qt5Guid.lib
  4. Qt5Gui.lib
  5. Qt5Cored.lib
  6. Qt5Core.lib

添加QT界面

添加UI界面

鼠标右键项目ocr_system,点击添加->新建项,Visual C++->Qt->Qt MainWindow From File,点击添加

配置文件属性

右键点击刚添加的 MainWindow.ui 文件,选择属性,配置和平台为Releasex64,项类型选择自定义生成工具,点击应用,左侧会生成自定义生成工具选项,界面如下:

  • 命令行输入:
"$(QTDIR)\bin\uic.exe" -o ".\GeneratedFiles\ui_%(Filename).h" "%(FullPath)"
  • 说明输入:
    Uic%27ing %(Identity)...
  • 输出
    .\GeneratedFiles\ui_%(Filename).h;%(Outputs)
  • 附加依赖项
    $(QTDIR)\bin\uic.exe;%(AdditionalInputs)
  • 连接对象选择

视图->其他窗口->属性管理器,右键ocr_system选项Release | x64添加新项目属性表,这里命名为”PolarNormalCollectorConfigurest.props”

ocr_system->Release | x64->PolarNormalCollectorConfigurest.props->属性->用户宏->添加用户宏 ,名称:QTDIR,值:C:\Qt\Qt5.14.2\5.14.2\msvc2017_64

编译UI文件

右键ui文件,选择编译,你会发现在路径..\build\GeneratedFiles下生成ui_MainWindow.h文件,右键项目选择添加->现有项->.\GeneratedFiles\ui_MainWindow.h,里面是UI界面控件的定义声明。

右键ui_MainWindow.h,选择属性,配置和平台为Releasex64,项类型选择自定义生成工具,点击应用,左侧会生成自定义生成工具选项

  • 命令行输入:
"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\moc_%(Filename).cpp"
  • 说明 输入:
    Moc%27ing %(Identity)...
  • 输出
    .\GeneratedFiles\moc_%(Filename).cpp
  • 附加依赖项
    $(QTDIR)\bin\moc.exe;%(FullPath)
  • 连接对象:

右键ui_MainWindow.h,选择编译,你会发现在路径..\build\GeneratedFiles下生成moc_ui_MainWindow.cpp文件,右键项目选择添加->现有项->.\GeneratedFiles\moc_ui_MainWindow.cpp,

添加.h和.cpp文件

右键项目选择添加新建项,我这里添加了PaddleOCR.h和PaddleOCR.cpp,用于Qt界面操作。

同理,PaddleOCR.h也要进行 选择属性,配置和平台为Releasex64,项类型选择自定义生成工具,点击应用,左侧会生成自定义生成工具选项

  • 命令行输入:
    "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\moc_%(Filename).cpp"
  • 说明 输入:
    Moc%27ing %(Identity)...
  • 输出
    .\GeneratedFiles\moc_%(Filename).cpp
  • 附加依赖项
  • $(QTDIR)\bin\moc.exe;%(FullPath)
  • 连接对象:

右键PaddleOCR.h,选择编译,你会发现在路径..\build\GeneratedFiles下生成moc_ui_MainWindow.cpp文件,右键项目选择添加->现有项->.\GeneratedFiles\moc_PaddleOCR.cpp,

将自动生成的头文件与.cpp文件添加到项目中来,如下图所示

接下来就可以在UI界面添加控件,在PaddleOCR.h和PaddleOCR.cpp中编代码运行程序了。

注意,所有继承QObject的头文件都需要配置moc进行生成可执行文件并添加到项目中,否则的话会如下报错

简单运行测试

这里笔者测试让UI界面运行出来即可

main函数里原来的PaddleOCR识别代码注释掉,在PaddleOCR.cpp文件中进行OCR识别,

  1. int main(int argc, char* argv[])
  2. {
  3. QApplication a(argc, argv);
  4. QtOCR w;
  5. w.show();
  6. return a.exec();
  7. }

这里我在另一个VS项目中测试成功,注意在.exe所在文件目录下复制以下dll文件

Qt5Widgetsd.dll Qt5Guid.dll Qt5Cored.dll

遇到的问题

双击ui文件打开Qt Designer闪退问题

解决:ui界面右键,进入“打开方式”,找到Qt安装路径下的designer.exe并点击(我的路径为C:\Qt\Qt5.14.2\5.14.2\msvc2017_64\bin\designer.exe)添加,之后将其设为默认值。

用VS Code开发C++ Qt5桌面程序,使用Qt的信号和槽机制来实现功能

阅读(18)

当使用VS Code开发C++ Qt5桌面程序时,你可以使用Qt的信号和槽机制来实现点击按钮弹出新窗体的功能。以下是一个完整可用的示例代码:

“`cpp
// main.cpp
#include <QApplication>
#include <QPushButton>
#include <QMessageBox>
#include “mainwindow.h”

int main(int argc, char *argv[]) {
QApplication app(argc, argv);

MainWindow mainWindow;
mainWindow.show();

return app.exec();
}
“`

“`cpp
// mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QPushButton>
#include <QMessageBox>
#include “dialog.h”

class MainWindow : public QMainWindow
{
Q_OBJECT

public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();

private slots:
void openDialog();

private:
QPushButton *button;
Dialog *dialog;
};

#endif // MAINWINDOW_H
“`

“`cpp
// mainwindow.cpp
#include “mainwindow.h”

MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
button = new QPushButton(“Open Dialog”, this);
connect(button, &QPushButton::clicked, this, &MainWindow::openDialog);
}

MainWindow::~MainWindow()
{
}

void MainWindow::openDialog()
{
dialog = new Dialog(this);
dialog->exec();
}
“`

“`cpp
// dialog.h
#ifndef DIALOG_H
#define DIALOG_H

#include <QDialog>
#include <QPushButton>
#include <QMessageBox>

class Dialog : public QDialog
{
Q_OBJECT

public:
Dialog(QWidget *parent = nullptr);
~Dialog();

private slots:
void showMessage();

private:
QPushButton *button;
};

#endif // DIALOG_H
“`

“`cpp
// dialog.cpp
#include “dialog.h”

Dialog::Dialog(QWidget *parent)
: QDialog(parent)
{
button = new QPushButton(“Show Message”, this);
connect(button, &QPushButton::clicked, this, &Dialog::showMessage);
}

Dialog::~Dialog()
{
}

void Dialog::showMessage()
{
QMessageBox::information(this, “Message”, “Hello, Dialog!”);
}
“`

这个示例代码包含了一个主窗口(MainWindow)和一个对话框(Dialog)。主窗口中有一个按钮,点击按钮会弹出对话框,并在对话框中显示一条消息。

你可以将这些代码保存到对应的文件中,并在VS Code中打开这个项目文件夹。然后,使用Qt命令行工具生成Makefile并构建项目。最后,运行生成的可执行文件,你将看到一个主窗口,点击按钮会弹出一个对话框并显示一条消息。

请确保已正确安装Qt开发工具和VS Code的C++扩展,并按照上述步骤进行操作。希望这个示例代码对你有帮助!

频率单位换算

阅读(141)

在射频领域,常用的频率单位有赫兹(Hz)、千赫(kHz)、兆赫(MHz)和吉赫(GHz)等。它们之间的换算关系如下:

1 kHz = 1000 Hz
1 MHz = 1000 kHz = 10^6 Hz
1 GHz = 1000 MHz = 10^9 Hz

例如,如果要将频率从100 MHz转换为GHz,可以将100 MHz除以1,000,得到0.1 GHz。同样地,如果要将频率从2.4 GHz转换为MHz,可以将2.4 GHz乘以1,000,得到2,400 MHz。

需要注意的是,在射频领域,还有一些其他的频率单位,如毫赫(mHz)、微赫(μHz)和皮赫(pHz)等,它们通常用于极低频率的应用。

快速计算电流,电压,电阻的计算方法

阅读(22)

在电路中,电流、电压和电阻是三个基本的物理量。它们之间的关系可以用欧姆定律来描述:

电流 = 电压 / 电阻

根据欧姆定律,我们可以通过已知的两个物理量来计算第三个物理量。下面是一些快速计算电流、电压和电阻的方法:

1. 计算电流:如果已知电压和电阻,可以通过将电压除以电阻来计算电流。例如,如果电压为12伏,电阻为4欧姆,则电流为12伏 / 4欧姆 = 3安。

2. 计算电压:如果已知电流和电阻,可以通过将电流乘以电阻来计算电压。例如,如果电流为2安,电阻为6欧姆,则电压为2安 x 6欧姆 = 12伏。

3. 计算电阻:如果已知电压和电流,可以通过将电压除以电流来计算电阻。例如,如果电压为9伏,电流为3安,则电阻为9伏 / 3安 = 3欧姆。

需要注意的是,在实际电路中,电流、电压和电阻可能会随着时间、温度和其他因素的变化而变化。因此,这些计算方法只适用于静态电路,而在动态电路中,需要考虑更多的因素来计算电流、电压和电阻。