- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 webpack 来打包我的文件。我想添加一个脚本,使我能够即时更改定制器中的设置。
我创建了一个包含我所有定制器功能的类
<?php
/**
* The Customizer specific functionality.
*
* @since 1.0.0
* @package mytheme
*/
namespace MyTheme\Customizer;
use MyTheme\Helpers as Helpers;
/**
* Class Customizer
*/
class Customizer {
/**
* Global theme name
*
* @var string
*
* @since 1.0.0
*/
protected $theme_name;
/**
* Global theme version
*
* @var string
*
* @since 1.0.0
*/
protected $theme_version;
/**
* Initialize class
*
* @param array $theme_info Load global theme info.
* @param Helpers\General_Helper $helpers Instance of the General Helpers object.
*
* @since 1.0.0
*/
public function __construct( $theme_info = null, Helpers\General_Helper $helpers ) {
$this->theme_name = $theme_info['theme_name'];
$this->theme_version = $theme_info['theme_version'];
$this->helpers = $helpers;
}
/**
* Register customizer settings
*
* @see add_action('customize_register',$func)
* @param \WP_Customize_Manager $wp_customize WP Customize object.
* @since 1.0.0
*/
public function register_customizer_settings( \WP_Customize_Manager $wp_customize ) {
// Abort if selective refresh is not available.
if ( ! isset( $wp_customize->selective_refresh ) ) {
return;
}
/**
* Footer section
*/
$wp_customize->add_section( 'footer_section', array(
'title' => esc_html__( 'Footer', 'mytheme' ),
'priority' => 100,
) );
/**
* Copyright notice
*/
$wp_customize->add_setting( 'footer_copyright', array(
'default' => '',
'type' => 'theme_mod',
'transport' => 'postMessage',
'sanitize_callback' => 'wp_kses_post',
) );
$wp_customize->add_control( 'footer_copyright', array(
'label' => esc_html__( 'Footer Copyright Text', 'mytheme' ),
'section' => 'footer_section',
'type' => 'text',
) );
}
/**
* Enqueue live preview script
*
* @since 1.0.0
*/
public function live_preview_enqueue() {
$customizer_script = '/skin/public/scripts/customizer.js';
wp_register_script( $this->theme_name . '-customizer', get_template_directory_uri() . $customizer_script, array(), $this->helpers->get_assets_version( $customizer_script ) );
wp_enqueue_script( $this->theme_name . '-customizer', array( 'jquery', 'customize-preview' ), false );
}
}
在我加载我的 Action 的另一个类中
private function define_customizer_hooks() {
$customizer = new Customizer\Customizer( $this->get_theme_info(), new Helpers\General_Helper() );
$this->loader->add_action( 'customize_register', $customizer, 'register_customizer_settings', 11 );
$this->loader->add_action( 'customize_preview_init', $customizer, 'live_preview_enqueue' );
}
现在,我可以正常查看我的设置。 页 footer 分
正在显示。但是我的控制台出现错误
jQuery.Deferred exception: wp.customize is not a function TypeError: wp.customize is not a function
customizer.js 看起来像这样
/* global wp */
$(function() {
wp.customize('footer_copyright', (value) => {
value.bind((newval) => {
if ($('.footer__copyright').length) {
if (newval !== '') {
if ($('.footer__copyright').hasClass('hide')) {
$('.footer__copyright').removeClass('hide').text(newval);
} else {
$('.footer__copyright').text(newval);
}
} else {
$('.footer__copyright').addClass('hide');
}
} else {
$('.footer__container').append(`<div class="footer__copyright">${newval}</div>`);
}
});
});
});
我的 webpack.config.js 看起来像这样:
/* global process __dirname */
const DEV = process.env.NODE_ENV !== 'production';
const path = require('path');
const webpack = require('webpack');
const CleanWebpackPlugin = require('clean-webpack-plugin');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
const BrowserSyncPlugin = require('browser-sync-webpack-plugin');
const UglifyJsPlugin = require('uglifyjs-webpack-plugin');
const appPath = `${path.resolve(__dirname)}`;
// Dev Server
const proxyUrl = 'mytheme.test';
// Theme
const themeName = 'mytheme';
const themePath = `/wp-content/themes/${themeName}/skin`;
const themeFullPath = `${appPath}${themePath}`;
const themePublicPath = `${themePath}/public/`;
const themeEntry = `${themeFullPath}/assets/application.js`;
const themeAdminEntry = `${themeFullPath}/assets/application-admin.js`;
const themeGutenbergEntry = `${themeFullPath}/assets/application-gutenberg.js`;
const themeCustomizerEntry = `${themeFullPath}/assets/customizer.js`;
const themeOutput = `${themeFullPath}/public`;
// Outputs
const outputJs = 'scripts/[name].js';
const outputCss = 'styles/[name].css';
const outputFile = '[name].[ext]';
const outputImages = `images/${outputFile}`;
const outputFonts = `fonts/${outputFile}`;
const allModules = {
rules: [
{
test: /\.(js|jsx)$/,
use: 'babel-loader',
exclude: /node_modules/,
},
{
test: /\.json$/,
exclude: /node_modules/,
use: 'file-loader',
},
{
test: /\.(png|svg|jpg|jpeg|gif|ico)$/,
exclude: [/fonts/, /node_modules/],
use: `file-loader?name=${outputImages}`,
},
{
test: /\.(eot|otf|ttf|woff|woff2|svg)$/,
exclude: [/images/, /node_modules/],
use: `file-loader?name=${outputFonts}`,
},
{
test: /\.scss$/,
exclude: /node_modules/,
use: [
MiniCssExtractPlugin.loader,
'css-loader', 'postcss-loader', 'sass-loader',
],
},
],
};
const allPlugins = [
new MiniCssExtractPlugin({
filename: outputCss,
}),
new webpack.ProvidePlugin({
$: 'jquery',
jQuery: 'jquery',
}),
// Use BrowserSync For assets
new BrowserSyncPlugin({
host: 'localhost',
port: 3000,
proxy: proxyUrl,
files: [
{
match: ['wp-content/themes/**/*.php', 'wp-content/plugins/**/*.php'],
},
],
}),
new webpack.DefinePlugin({
'process.env': {
NODE_ENV: JSON.stringify(process.env.NODE_ENV || 'development'),
},
}),
new webpack.IgnorePlugin(/^\.\/locale$/, /moment$/),
];
const allOptimizations = {
runtimeChunk: false,
splitChunks: {
cacheGroups: {
commons: {
test: /[\\/]node_modules[\\/]/,
name: 'vendors',
chunks: 'all',
},
},
},
};
// Use only for production build
if (!DEV) {
allOptimizations.minimizer = [
new UglifyJsPlugin({
cache: true,
parallel: true,
sourceMap: true,
uglifyOptions: {
output: {
comments: false,
},
compress: {
warnings: false,
drop_console: true, // eslint-disable-line camelcase
},
},
}),
];
allPlugins.push(new CleanWebpackPlugin([themeOutput]));
}
module.exports = [
// Theme Skin
{
context: path.join(__dirname),
entry: {
application: [themeEntry],
applicationAdmin: [themeAdminEntry],
themeGutenberg: [themeGutenbergEntry],
customizer: [themeCustomizerEntry],
},
output: {
path: themeOutput,
publicPath: themePublicPath,
filename: outputJs,
library: ['wp', '[name]'],
libraryTarget: 'var',
},
externals: {
wp: 'wp',
},
optimization: allOptimizations,
mode: 'production',
module: allModules,
plugins: allPlugins,
devtool: DEV ? '#inline-source-map' : '',
},
];
和package.json是
{
"name": "mytheme",
"version": "1.0.0",
"author": "dingo_d",
"private": true,
"main": "",
"scripts": {
"__sassUnusedTheme": "sass-unused \"wp-content/themes/init_theme_name/**/*.scss\"",
"__eslintTheme": "eslint wp-content/themes/init_theme_name/skin/assets/",
"__stylelintTheme": "stylelint \"wp-content/themes/init_theme_name/**/*.scss\" --syntax scss",
"precommitCss": "npm run __stylelintTheme",
"precommitCssUnused": "npm run __sassUnusedTheme",
"precommitJs": "npm run __eslintTheme",
"precommit": "npm run precommitJs && npm run precommitCss && npm run precommitCssUnused",
"start": "webpack --progress --watch --display-error-details --display-reasons",
"build": "NODE_ENV=production webpack --progress"
},
"devDependencies": {
"@infinumjs/eslint-config": "^1.1.0",
"@infinumjs/stylelint-config": "^1.0.0",
"babel-core": "^6.26.3",
"babel-eslint": "^8.2.3",
"babel-loader": "^7.1.4",
"babel-plugin-syntax-dynamic-import": "^6.18.0",
"babel-preset-env": "^1.6.1",
"browser-sync": "^2.24.1",
"browser-sync-webpack-plugin": "^2.2.2",
"clean-webpack-plugin": "^0.1.19",
"copy-webpack-plugin": "^4.5.1",
"css-loader": "^0.28.11",
"eslint": "^4.19.1",
"eslint-plugin-import": "^2.11.0",
"expose-loader": "^0.7.5",
"extract-text-webpack-plugin": "^3.0.2",
"file-loader": "^1.1.11",
"imports-loader": "^0.8.0",
"mini-css-extract-plugin": "^0.4.0",
"node-sass": "^4.9.0",
"postcss-cssnext": "^3.1.0",
"postcss-loader": "^2.1.4",
"precss": "^3.1.2",
"sass-loader": "^7.0.1",
"style-loader": "^0.21.0",
"stylelint": "^9.2.0",
"uglifyjs-webpack-plugin": "^1.2.5",
"webpack": "^4.6.0",
"webpack-cli": "^2.1.2"
},
"dependencies": {
"autoprefixer": "^8.4.1",
"babel-polyfill": "^6.26.0",
"bugsnag-js": "^4.6.0",
"css-mqpacker": "^6.0.2",
"cssnano": "^3.10.0",
"jquery": "^3.3.1",
"jquery-match-height": "^0.7.2",
"layzr.js": "^2.2.2",
"media-blender": "^2.1.0",
"normalize.css": "^8.0.0",
"npm": "^6.0.0",
"postcss-font-magician": "^2.1.1",
"slick-carousel": "^1.8.1",
"whatwg-fetch": "^2.0.4"
},
"browserslist": [
"android >= 4.2",
"not ie < 11",
"last 2 versions",
"Safari >= 8"
]
}
困扰我的是,我基本上使用(并修改)了我的代码,该代码在没有所有花哨的构建工具(https://themes.svn.wordpress.org/expire/1.0.9/inc/customizer/js/customizer.js)的情况下构建的主题中工作
我试过
/* global wp */
(function(api) {
api('footer_copyright', (value) => {
value.bind((newval) => {
if ($('.footer__copyright').length) {
if (newval !== '') {
if ($('.footer__copyright').hasClass('hide')) {
$('.footer__copyright').removeClass('hide').text(newval);
} else {
$('.footer__copyright').text(newval);
}
} else {
$('.footer__copyright').addClass('hide');
}
} else {
$('.footer__container').append(`<div class="footer__copyright">${newval}</div>`);
}
});
});
})(wp.customize);
不过,我又得到了
Uncaught ReferenceError: wp is not defined
在检查器中,可能在加载所有内容后,wp.customize
可用(ƒ (){return f.instance.apply(f,arguments)}
).
我遵循了 Gutenberg 给出的建议团队,他们正在使用 webpack,但我不确定我做得对不对。
最佳答案
不确定这是否是最佳解决方案,但我决定在我的 wp_enqueue_script
调用中添加依赖项。例如我最初有:
wp_enqueue_script('scripts/admin/remove_category.js', asset_path('scripts/admin/remove_category.js'));
但后来我搜索了 WordPress JS 文件以查看哪些使用了 wp
,我想我可以选择其中的任意一个作为依赖项并随后确保 wp
在我的脚本中可用,如下所示:
wp_enqueue_script('scripts/admin/remove_category.js', asset_path('scripts/admin/remove_category.js'), ['wp-util']);
关于javascript - WordPress 定制器和 webpack - 公开 wp global,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50190389/
我之前让 dll 注入(inject)器变得简单,但我有 Windows 7,我用 C# 和 C++ 做了它,它工作得很好!但是现在当我在 Windows 8 中尝试相同的代码时,它似乎没有以正确的方
我正在尝试制作一个名为 core-splitter 的元素,该元素在 1.0 中已弃用,因为它在我们的项目中起着关键作用。 如果您不知道 core-splitter 的作用,我可以提供一个简短的描述。
我有几个不同的蜘蛛,想一次运行所有它们。基于 this和 this ,我可以在同一个进程中运行多个蜘蛛。但是,我不知道如何设计一个信号系统来在所有蜘蛛都完成后停止 react 器。 我试过了: cra
有没有办法在达到特定条件时停止扭曲 react 器。例如,如果一个变量被设置为某个值,那么 react 器应该停止吗? 最佳答案 理想情况下,您不会将变量设置为一个值并停止 react 器,而是调用
https://code.angularjs.org/1.0.0rc9/angular-1.0.0rc9.js 上面的链接定义了外部js文件,我不知道Angular-1.0.0rc9.js的注入(in
我正在尝试运行一个函数并将服务注入(inject)其中。我认为这可以使用 $injector 轻松完成.所以我尝试了以下(简化示例): angular.injector().invoke( [ "$q
在 google Guice 中,我可以使用函数 createInjector 创建基于多个模块的注入(inject)器。 因为我使用 GWT.create 在 GoogleGin 中实例化注入(in
我在 ASP.NET Core 1.1 解决方案中使用配置绑定(bind)。基本上,我在“ConfigureServices Startup”部分中有一些用于绑定(bind)的简单代码,如下所示: s
我在 Spring MVC 中设置 initBinder 时遇到一些问题。我有一个 ModelAttribute,它有一个有时会显示的字段。 public class Model { privat
我正在尝试通过jquery post发布knockoutjs View 模型 var $form = $('#barcodeTemplate form'); var data = ko.toJS(vm
如何为包含多态对象集合的复杂模型编写自定义模型绑定(bind)程序? 我有下一个模型结构: public class CustomAttributeValueViewModel { publi
您好,我正在尝试实现我在 this article 中找到的扩展方法对于简单的注入(inject)器,因为它不支持开箱即用的特定构造函数的注册。 根据这篇文章,我需要用一个假的委托(delegate)
你好,我想自动注册我的依赖项。 我现在拥有的是: public interface IRepository where T : class public interface IFolderReposi
我正在使用 Jasmine 测试一些 Angular.js 代码。为此,我需要一个 Angular 注入(inject)器: var injector = angular.injector(['ng'
我正在使用 Matlab 代码生成器。不可能包含代码风格指南。这就是为什么我正在寻找一个工具来“ reshape ”、重命名和重新格式化生成的代码,根据我的: 功能横幅约定 文件横幅约定 命名约定 等
这个问题在这里已经有了答案: Where and why do I have to put the "template" and "typename" keywords? (8 个答案) 关闭 8
我开发了一种工具,可以更改某些程序的外观。为此,我需要在某些进程中注入(inject)一个 dll。 现在我基本上使用这个 approach .问题通常是人们无法注入(inject) dll,因为他们
我想使用 swing、spring 和 hibernate 编写一个 java 应用程序。 我想使用数据绑定(bind)器用 bean 的值填充 gui,并且我还希望它反射(reflect) gui
我有这段代码,当两个蜘蛛完成后,程序仍在运行。 #!C:\Python27\python.exe from twisted.internet import reactor from scrapy.cr
要点是 Spring Batch (v2) 测试框架具有带有 @Autowired 注释的 JobLauncherTestUtils.setJob。我们的测试套件有多个 Job 类提供者。因为这个类不
我是一名优秀的程序员,十分优秀!