Skip to content

Instantly share code, notes, and snippets.

@Alex-Space
Last active April 21, 2022 08:49
Show Gist options
  • Save Alex-Space/9640b4025a6317f1e6a8 to your computer and use it in GitHub Desktop.
Save Alex-Space/9640b4025a6317f1e6a8 to your computer and use it in GitHub Desktop.
doc WordPress
/******** Plugin creation ********/
# Первые шаги в WP:
1) plugins(wp_content/plugins)
2) Там создаем папку с названием плагина в ней одноименный файлик .php
3) В него добавляем информацию о плагине, чтобы WP определил его в админке
4) Создаем файлик readme.txt, в котором пишем описание плагина (пример - https://wordpress.org/plugins/about/readme.txt)
5) Домашнаяя страница для плагина, в ней рассказывается о том как его установить, какие версии WP совместимы с плагином, что менялось от версии к версии вашего плагина, и как его использовать.
# В главный файл плагина в самое начало:
<?php
/*
Plugin Name: Название плагина
Plugin URI: http://страница_с_описанием_плагина_и_его_обновлений
Description: Краткое описание плагина.
Version: Номер версии плагина, например: 1.0
Author: Имя автора плагина
Author URI: http://страница_автора_плагина
*/
?>
# Хуки
Бывают 2 видов: actions & filters
actions - позволяет изменять, или дополнять возможности WP
filters - позволяет изменять, или фильтровать контент
# 2 необходимых хука для создания плагина
register_activation_hook() - Регистрирует функцию, которая вызывается, когда активируем плагин
register_deactivation_hook() - Регистрирует функцию, которая вызывается, когда деактивируем плагин
register_uninstall_hook() - Регистрирует функцию, которая вызывается при удалении плагина, чтобы почистить все следы прибывания плагина в системе. (лучше ее не использовать, вместо этого создать uninstall.php, при удалении плагина он сам исполнится)
# Дочерняя тема - создаем style.css в папке паралельно с темой, и кладем туда следующий код:
/*
Theme Name: Twenty Ten Child
Theme URI: http: //example.com/
Description: Дочерняя тема для темы Twenty Ten
Author: Ваше имя
Author URI: http: //example.com/about/
Template: twentyten
Version: 0.1.0
*/
@import url("../НАЗВАНИЕ ТЕМЫ С КОТОРОЙ КЛОНИРУЕМ/style.css");
# Получить и вывести путь к директории плагина (несколько вариантов)
define('PLUGIN_DIR', plugin_dir_path(__FILE__));
define('PLUGIN_URL', plugin_dir_url(__FILE__));
plugins_url('путь от директории плагина + название файла.js', __FILE__), array('jquery'));
# Получить и вывести путь к директории дочерней темы (несколько вариантов)
<?php bloginfo('stylesheet_directory'); ?>
<?php echo get_stylesheet_directory_uri(); ?>
# Как подключить свою версию jQuery вместо дефолтной в ядре WP
<?php
function my_scripts_method() {
wp_deregister_script( 'jquery' );
wp_register_script( 'jquery', 'http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js');
wp_enqueue_script( 'jquery' );
}
add_action( 'wp_enqueue_scripts', 'my_scripts_method' );
?>
# Добавить фавиконку в дочернюю тему
function blog_favicon() {
echo '<link rel="Shortcut Icon" type="image/x-icon" href="'.get_bloginfo('wpurl').'/favicon.ico" />';
}
add_action('wp_head', 'blog_favicon');
?>
# Создание страницы настроек для плагина (это все в начала главного файла плагина)
add_action( 'admin_menu', 'spl_admin_menu' );
function spl_admin_menu() {
add_options_page(
'Свойства' . SPL_PLUGIN_NAME, // заголовок страницы, title
SPL_PLUGIN_NAME, // название пункта меню
8, // права доступа к странице setting
SPL_OPTION_ID, // слаг для url, можно здесь указать FILE, тогда в адресе просто будет название папки с плагином и название файла плагина
'spl_option_page' // функция генерации элементов, полей для страницы
);
}
function spl_option_page() {
include 'options.php';
}
# Поднять в иерархии элементы админ меню
function admin_menu_items() {
global $menu;
$menu[10]=$menu[26]; // тут пишем позицию на какое место ставим то, что нужно
$menu[26] = array(); // тут избавляемся от дубликата, который остается
}
add_action('admin_menu', 'admin_menu_items');
# Поднять в иерархии кастомный тип записей (добавить в парамерты $args)
'menu_position' => 5, // 5 - это сразу под Posts
# К верхнему примеру пояснение в числах
5 - below Posts
10 - below Media
15 - below Links
20 - below Pages
25 - below comments
60 - below first separator
65 - below Plugins
70 - below Users
75 - below Tools
80 - below Settings
100 - below second separator
# Добавление поддержки разных метаполей в кастомные типы записей (в данном примере использую добавление миниатюр)
function add_thumb() {
add_post_type_support('gallery', array('thumbnail') );
}
add_action( 'init', 'add_thumb' );
# Добавить еще один размер для картинок, которые режет WP при загрузке
add_image_size( 'ThumbForAbout', 590, 886, true );
# Дебаг мод для разработки и отладки ошибок в wordpress. Добавляется в wp-config.php (советуют использовать только на сайте в разработке, потом нужно отключить)
define('WP_DEBUG', true);
# Создает файлик и пишет туда все возникающие ошибки. Код добавлять в wp-config.php (/wp-content/debug.log)
define('WP_DEBUG_LOG', true);
# Для карсивого вывода данных ( пишем в functions.php и вызываем где надо в коде pr(); exit; )
function pr($data) {
echo '<pre>';
print_r($data);
echo '</pre>';
}
# Убрать текстовое поле для конкретного шаблона страницы
function hide_editor() {
// Get the Post ID.
$post_id = $_GET['post'] ? $_GET['post'] : $_POST['post_ID'] ;
if( !isset( $post_id ) ) return;
// Get the name of the Page Template file.
$template_file = get_post_meta($post_id, '_wp_page_template', true);
if($template_file == 'blog.php'){ // edit the template name
remove_post_type_support('page', 'editor');
}
}
add_action( 'admin_init', 'hide_editor' );
# Подключить стили и скрипты, или сделать проверку,если нужно на определенный шаблон (functions.php не работает)
is_page_template( 'название шаблона.php' )
# То же самое только работает в function.php
$template_name = get_post_meta( $wp_query->post->ID, '_wp_page_template', true );
if ( $template_name = 'portfolio.php' ) {
wp_enqueue_script( 'lightbox_script' );
wp_enqueue_style( 'lightbox_styles' );
}
# Создаем страницу настроек (скинул Илья)
function createOptionsPage() {
register_post_type(
'options',
array(
'labels' => array(
'name' => 'Theme settings'
),
'public' => true,
'menu_icon' => 'dashicons-screenoptions',
'menu_position' => 100,
'capabilities' => array(
'create_posts' => 'do_not_allow',
'delete_published_posts' => false
),
'map_meta_cap' => true,
'supports' => array(
'title'
)
)
);
function removeViewLink($actions) {
if(get_post_type() === 'options') {
unset( $actions['view']);
unset( $actions['inline hide-if-no-js']);
}
return $actions;
}
add_filter('post_row_actions', 'removeViewLink', 10, 1);
$checkSettingsPage = get_page_by_path('theme-settings', array(), 'options');
if(empty($checkSettingsPage)) {
wp_insert_post(
array(
'post_title' => 'Theme settings',
'post_slug' => 'theme-settings',
'post_type' => 'options',
'post_status' => 'publish',
'post_author' => 1
)
);
}
/ Get field slug from option page /
function getOptionsField($fieldName) {
$optionsPageId = get_page_by_path('theme-settings', OBJECT, 'options')->ID;
$field = get_field($fieldName, $optionsPageId);
return $field;
}
}
add_action('init', 'createOptionsPage');
# Подключить любой файл в любой шаблон ( парамерт функции - название файла в корне темы, но без .php)
get_template_part('page-nav');
# Скрыть метатег генератор, который помогает определить что за движок используется на сайте
remove_action('wp_head', 'wp_generator');
# Убрать возможность добавления постов через мобильные устройства. (для повышения защиты против хакеров)
add_filter('xmlrpc_enabled', '_return_false');
remove_action('wp_head', 'rsd_link');
remove_action('wp_head', 'wlwmanifest_link');
# Так же хорошо добавить в .htaccess запред на просмотр файлов xmlrpc.php и wp-config.php
<Files xmlrpc.php>
order allow,deny
deny from all
</Files>
<Files wp_config.php>
order allow,deny
deny from all
</Files>
# Advanced custom fields repeater loop
<?php if( have_rows('repeater_field_name') ) : while ( have_rows('repeater_field_name') ) : the_row(); ?>
<?php the_sub_field('sub_field_name'); ?>
<?php endwhile; ?>
<?php else : ?>
<?php endif; ?>
# Вывести похожие записи по тегам
<div class="relatedposts">
<h3>Related posts</h3>
<?php
$orig_post = $post;
global $post;
$tags = wp_get_post_tags($post->ID);
if ($tags) {
$tag_ids = array();
foreach($tags as $individual_tag) $tag_ids[] = $individual_tag->term_id;
$args=array(
'tag__in' => $tag_ids,
'post__not_in' => array($post->ID),
'posts_per_page'=>4, // Number of related posts to display.
'caller_get_posts'=>1
);
$my_query = new wp_query( $args );
while( $my_query->have_posts() ) {
$my_query->the_post();
?>
<div class="relatedthumb">
<a rel="external" href="<? the_permalink()?>"><?php the_post_thumbnail(array(150,100)); ?><br />
<?php the_title(); ?>
</a>
</div>
<?php }
}
$post = $orig_post;
wp_reset_query();
?>
</div>
# Вывести сайдбар по имени или по ID
dynamic_sidebar( 'Sidebar for video post' );
# Добавить поддержку тегов к кастомой сущности
'taxonomies' => array('post_tag')
# Установить необходимые параметры для результатов поиска ( искать в каких типах постов )
function search_filter( $query ) {
if ( $query->is_search ) {
$query->set( 'post_type', array( 'items' ) );
}
return $query;
}
add_filter( 'pre_get_posts', 'search_filter' );
# Отключить кеширование скриптов или стилей ( дописываем null, time() )
wp_register_style( 'кастомное название', get_template_directory_uri() . '/путь до файла', null, time() );
# Позволяет вывести столько символов, сколько нужно без обрезки слова (Использовать - echo get_excerpt(21) )
function get_excerpt($limit, $source = null){
if($source == "content" ? ($excerpt = get_the_content()) : ($excerpt = get_the_excerpt()));
$excerpt = preg_replace(" (\[.*?\])",'',$excerpt);
$excerpt = strip_shortcodes($excerpt);
$excerpt = strip_tags($excerpt);
$excerpt = substr($excerpt, 0, $limit);
$excerpt = substr($excerpt, 0, strripos($excerpt, " "));
$excerpt = trim(preg_replace( '/\s+/', ' ', $excerpt));
$excerpt = '<p>' . $excerpt . '...</p>';
return $excerpt;
}
# Получить категорию в которой находимся
$cat_name = single_cat_title( '', false );
# Перебивает дефолтное значение для количества вывода постов, используется при навигации (Поисковая страница в том числе)
function wpm_set_posts( $query ) {
$query->set( 'posts_per_page', '7' );
}
add_action( 'pre_get_posts', 'wpm_set_posts' );
# Чтобы тема поддерживала Woocommecre
add_action( 'after_setup_theme', 'woocommerce_support' );
function woocommerce_support() {
add_theme_support( 'woocommerce' );
}
# Удалить из админбара
function remove_admin_bar_links() {
global $wp_admin_bar;
$wp_admin_bar->remove_menu('wp-logo'); // Remove the WordPress logo
$wp_admin_bar->remove_menu('about'); // Remove the about WordPress link
$wp_admin_bar->remove_menu('wporg'); // Remove the WordPress.org link
$wp_admin_bar->remove_menu('documentation'); // Remove the WordPress documentation link
$wp_admin_bar->remove_menu('support-forums'); // Remove the support forums link
$wp_admin_bar->remove_menu('feedback'); // Remove the feedback link
$wp_admin_bar->remove_menu('site-name'); // Remove the site name menu
$wp_admin_bar->remove_menu('view-site'); // Remove the view site link
$wp_admin_bar->remove_menu('updates'); // Remove the updates link
$wp_admin_bar->remove_menu('comments'); // Remove the comments link
$wp_admin_bar->remove_menu('new-content'); // Remove the content link
$wp_admin_bar->remove_menu('w3tc'); // If you use w3 total cache remove the performance link
$wp_admin_bar->remove_menu('my-account'); // Remove the user details tab
$wp_admin_bar->remove_menu('customize'); // Remove customize menu
}
add_action( 'wp_before_admin_bar_render', 'remove_admin_bar_links' );
# Кастомные колонки в таблице постов из кастомных полей этих постов
function modify_post_table( $column ) {
$column['product_name'] = 'Product Name';
$column['minimum_principle'] = 'Minimum Principle';
$column['age_grouping'] = 'Age Grouping';
return $column;
}
add_filter( 'manage_products_posts_columns', 'modify_post_table' );
# Если добавить картинку после чекбокса слева в таблице, то этот код это делает
foreach ( $column as $key => $value ) {
$new_arr[$key] = $value;
if ( $key == 'cb' ) {
$new_arr = $new_arr + $product_arr;
}
}
# Подсказка хук такой manage_${post_type}_posts_columns
function modify_post_table_row( $column_name, $post_id ) {
if( $column_name == 'product_name' ) {
$product_name = get_post_meta( $post_id, 'product_name', true );
echo $product_name;
}
if( $column_name == 'minimum_principle' ) {
$minimum_principle = get_post_meta( $post_id, 'minimum_principle', true );
echo $minimum_principle;
}
if( $column_name == 'age_grouping' ) {
$age_grouping = get_post_meta( $post_id, 'age_grouping', true );
echo $age_grouping;
}
}
add_action( 'manage_products_posts_custom_column', 'modify_post_table_row', 10, 2 );
#manage_posts_custom_column - для обычного поста
# Фикс бага для Contact form 7 validation email adress
# Добавить в wp-config.php
define( 'WPCF7_VALIDATE_CONFIGURATION', false );
# Чтобы сработали хуки от qtranslate-x
function community_qtranslate_detect_language( $url_info ) {
$url_info['language'] = 'en';
return $url_info;
}
add_filter( 'qtranslate_detect_language', 'community_qtranslate_detect_language');
qtranxf_init_language();
############################# WooCommerce ############################
# Убрать обязательные поля на My account
function wpm_change_required_fields( $fields ) {
unset( $fields['account_last_name'] );
unset( $fields['account_first_name'] );
}
add_filter( 'woocommerce_save_account_details_required_fields', 'wpm_change_required_fields' );
# Отключить дурацкую валидацию полей в Contact form 7 (в wp-config.php)
define( 'WPCF7_VALIDATE_CONFIGURATION', false );
# Изменить ограничение на размер загружаемого файла
function PBP_increase_upload( $bytes ) {
return 10485760;
}
add_filter( 'upload_size_limit', 'PBP_increase_upload' );
# Вход-выход для WooCommerce
function add_loginout_link( $items, $args ) {
if (is_user_logged_in() && $args->theme_location == 'primary-menu') {
$items .= '<li><a href="'. wp_logout_url( get_permalink( woocommerce_get_page_id( 'myaccount' ) ) ) .'">Выйти</a></li>';
}
elseif (!is_user_logged_in() && $args->theme_location == 'primary-menu') {
$items .= '<li><a href="' . get_permalink( woocommerce_get_page_id( 'myaccount' ) ) . '">Войти</a></li>';
}
return $items;
}
add_filter( 'wp_nav_menu_items', 'add_loginout_link', 10, 2 );
# Поменять валюту в woocommerce
function add_inr_currency( $currencies ) {
$currencies['RUB'] = 'руб.';
return $currencies;
}
add_filter( 'woocommerce_currencies', 'add_inr_currency' );
function add_inr_currency_symbol( $symbol ) {
$currency = get_option( 'woocommerce_currency' );
switch( $currency ) {
case 'RUB': $symbol = 'руб.'; break;
}
return $symbol;
}
add_filter( 'woocommerce_currency_symbol', 'add_inr_currency_symbol' );
# Отключить миграцию со старой версии jQuery
add_action( 'wp_default_scripts', function( $scripts ) {
if ( ! empty( $scripts->registered['jquery'] ) ) {
$jquery_dependencies = $scripts->registered['jquery']->deps;
$scripts->registered['jquery']->deps = array_diff( $jquery_dependencies, array( 'jquery-migrate' ) );
}
} );
# Чтобы фильтровать дробные поля через meta_query ( в WP баг )
function cast_decimal_precision( $array ) {
$array['where'] = str_replace('DECIMAL','DECIMAL(10,4)',$array['where']);
return $array;
}
add_filter('get_meta_sql','cast_decimal_precision');
# Поменять через хук статус поста ( пост статус post status )
function wpm_check_published_post( $ID, $post ) {
remove_action('save_post', 'wpm_check_published_post');
$my_post = array();
$my_post['ID'] = $ID;
$my_post['post_status'] = 'draft';
wp_update_post( $my_post );
add_action('save_post', 'wpm_check_published_post');
}
add_action( 'save_post', 'wpm_check_published_post', 10, 2 );
# Получить все доступные размеры картинок на сайте
global $_wp_additional_image_sizes;
print '<pre>';
print_r( $_wp_additional_image_sizes );
print '</pre>';
# Ajax login
function ajaxLogin() {
check_ajax_referer('ajax-login-nonce', 'security');
$userData = array();
$userData['user_login'] = $_POST['username'];
$userData['user_password'] = $_POST['password'];
$userData['remember'] = true;
$userSignIn = wp_signon($userData, false);
if(is_wp_error($userSignIn)){
echo json_encode(array('loggedin' => false, 'message' => 'Wrong username or password.'));
} else {
echo json_encode(array('loggedin' => true, 'message'=> 'Login successful.'));
}
die();
}
add_action('wp_ajax_nopriv_ajaxLogin', 'ajaxLogin');
# Создание таблиц в плагинах
global $wpdb;
$ac_productmeta = $wpdb->prefix . "ac_productmeta";
if( $wpdb->get_var("SHOW TABLES LIKE '$ac_productmeta'") != $ac_productmeta ) {
// If table not in database. Create new table
$charset_collate = $wpdb->get_charset_collate();
$sql = "CREATE TABLE $ac_productmeta (
id mediumint(9) NOT NULL AUTO_INCREMENT,
product_id mediumint NOT NULL,
product_quantity mediumint,
product_SKU varchar(255),
product_meta_key varchar(255),
product_meta_value longtext,
UNIQUE KEY id (id)
) $charset_collate;";
require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
dbDelta( $sql );
}
# Изменить тайтл у метабокса в админке и тайтл добавления картинки в самом метабоксе
function km_change_featured_image_metabox_title() {
remove_meta_box( 'postimagediv', 'my_post_type_name', 'side' );
add_meta_box( 'postimagediv', __( 'NEW TITLE TEXT', 'km' ), 'post_thumbnail_meta_box', 'my_post_type_name', 'side' );
}
add_action('do_meta_boxes', 'km_change_featured_image_metabox_title' );
function km_change_featured_image_text( $content ) {
if ( 'my_post_type_name' === get_post_type() ) {
$content = str_replace( 'Set featured image', __( 'NEW SET TEXT HERE', 'km' ), $content );
$content = str_replace( 'Remove featured image', __( 'NEW REMOVE TEXT HERE', 'km' ), $content );
}
return $content;
}
add_filter( 'admin_post_thumbnail_html', 'km_change_featured_image_text' );
# Изменить текст кнопки в Media Uploader
// Change button text in Media uploader
function wpse_41767_change_image_button( $translation, $text, $domain )
{
if ( 'default' == $domain and 'Insert into post' == $text )
{
// Once is enough.
remove_filter( 'gettext', 'wpse_41767_change_image_button' );
return 'Use this';
}
return $translation;
}
add_filter( 'gettext', 'wpse_41767_change_image_button', 10, 3 );
# Core metabox callbacks ( для кастомизации метабоксов )
'post_thumbnail_meta_box' - Featured Image metabox
'post_slug_meta_box' - Slug metabox
'post_author_meta_box' - Author metabox
'post_categories_meta_box' - Categories metabox
'post_format_meta_box' - Formats metabox
'post_comment_meta_box' - Comments metabox
'post_comment_status_meta_box' - Comments Status metabox
'post_tags_meta_box' - Tags metabox
'post_submit_meta_box' - Submit metabox
'post_custom_meta_box' - Custom Fields metabox
'post_revision_meta_box' - Post Revisions metabox
# Core Meta Box IDs
'commentstatusdiv' - Comments status metabox (discussion).
'commentsdiv' - Comments metabox.
'slugdiv' - Slug metabox.
'revisionsdiv' - Revisions metabox.
'authordiv' - Author metabox.
'postcustom' - Custom fields metabox.
'postexcerpt' - Excerpt metabox.
'trackbacksdiv' - Trackbacks metabox.
'postimagediv' - Featured image metabox.
'formatdiv' - Formats metabox.
'tagsdiv-post_tag' - Tags metabox.
'categorydiv' - Categories metabox.
'pageparentdiv' - Attributes metabox.
# Используется вместе с этими функциями :
remove_meta_box( 'postexcerpt', 'post', 'side' );
add_meta_box('postexcerpt', __('Post Summary'), 'post_excerpt_meta_box', 'post', 'normal', 'high');
# и они вешаются на хук do_meta_boxes
# Добавить поля в таблицу с термами таксономии в админке
function ac_modify_ac_category_table( $column ) {
$product_arr = array( 'image' => 'Image' );
$new_arr = array();
foreach ( $column as $key => $value ) {
$new_arr[$key] = $value;
if ( $key == 'cb' ) {
$new_arr = $new_arr + $product_arr;
}
}
return $new_arr;
}
add_filter( 'manage_edit-ac_category_columns', 'ac_modify_ac_category_table' );
// Add thumbnail image to thumbnail column in post table in admin panel
function ac_modify_ac_category_table_row( $empty, $column_name, $term_id ) {
if( $column_name == 'image' ) {
$cat_image = get_term_meta( $term_id, 'ac_category_image' );
echo '<span class="helper"></span><img src="' . $cat_image[0] . '" alt="" class="term-column-thumb">';
}
}
add_action( 'manage_ac_category_custom_column', 'ac_modify_ac_category_table_row', 10, 3 );
# Показать все хуки, которые исполняются на странице
$debug_tags = array();
add_action( 'all', function ( $tag ) {
global $debug_tags;
if ( in_array( $tag, $debug_tags ) ) {
return;
}
echo "<pre>" . $tag . "</pre>";
$debug_tags[] = $tag;
} );
# Получить все скрипты, которые зарегистрированы и подключены
function wpa54064_inspect_scripts() {
global $wp_scripts;
foreach( $wp_scripts->queue as $handle ) :
echo $handle . ' | ';
endforeach;
}
add_action( 'wp_print_scripts', 'wpa54064_inspect_scripts' );
# Отключить валидацию на Contact form 7:
# Using wp-config.php
define( 'WPCF7_VALIDATE_CONFIGURATION', false );
# Using functions.php
add_filter( 'wpcf7_validate_configuration', '__return_false' );
# Удалить дефолтные колонки в таблице постов в админке
function my_manage_columns( $columns ) {
unset($columns['date']);
return $columns;
}
function my_column_init() {
add_filter( 'manage_ac_catalog_item_posts_columns' , 'my_manage_columns' );
}
add_action( 'admin_init' , 'my_column_init' );
# Добавить ссылки на страницу настроек плагина в списке плагинов
function plugin_add_settings_link( $links ) {
$settings_link = '<a href="options-general.php?page=plugin_name">' . __( 'Settings' ) . '</a>';
array_push( $links, $settings_link );
return $links;
}
$plugin = plugin_basename( __FILE__ );
add_filter( "plugin_action_links_$plugin", 'plugin_add_settings_link' );
# Пагинация, которая работает с кастомным циклом кастомных записей ( ну и естественно перед циклом, и это переменную в 'paged' эл. массива - $paged = ( get_query_var( 'paged' ) ) ? get_query_var( 'paged' ) : 1; )
$big = 999999999; // need an unlikely integer
$translated = __( 'Page', 'mytextdomain' ); // Supply translatable string
echo paginate_links( array(
'base' => str_replace( $big, '%#%', esc_url( get_pagenum_link( $big ) ) ),
'format' => '?paged=%#%',
'current' => max( 1, get_query_var('paged') ),
'total' => $wp_query->max_num_pages,
'before_page_number' => '<span class="screen-reader-text">'.$translated.' </span>'
) );
# Подключить стили для визивиг TinyMCE редактора
function my_theme_add_editor_styles() {
add_editor_style( get_stylesheet_directory_uri() . '/css/editor.css');
}
add_action( 'current_screen', 'my_theme_add_editor_styles' );
# Валидация полей в WooCommerce ( сначала добавляем их в нашатема/cabinet/woocommerce/myaccount/form-login.php)
function wooc_validate_extra_register_fields( $username, $email, $validation_errors ) {
if ( ! isset( $_POST['agreeaferta'] ) && $_POST['agreeaferta'] !== 'on' ) {
$validation_errors->add( 'agreeaferta_error', 'Вы не приняли условия оферты!' );
}
return $validation_errors;
}
add_action( 'woocommerce_register_post', 'wooc_validate_extra_register_fields', 10, 3 );
# Изменить в WooCommerce поля и убрать валидацию
function storefront_child_remove_checkout_fields($fields) {
unset( $fields ['account_first_name'] );
unset( $fields ['account_last_name'] );
return $fields;
}
add_filter( 'woocommerce_save_account_details_required_fields', 'storefront_child_remove_checkout_fields' );
# Ссылка на дефолтную миниатюру товара woocommerce
wc_placeholder_img_src()
# Проверка, есть ли такая таблица в базе данных
global $wpdb;
$table_name = $wpdb->prefix.'TABLE-NAME-HERE';
if($wpdb->get_var("SHOW TABLES LIKE '$table_name'") != $table_name) {
//table not in database. Create new table
$charset_collate = $wpdb->get_charset_collate();
$sql = "CREATE TABLE $table_name (
id mediumint(9) NOT NULL AUTO_INCREMENT,
field_x text NOT NULL,
field_y text NOT NULL,
UNIQUE KEY id (id)
) $charset_collate;";
require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
dbDelta( $sql );
}
else{
}
############################## Полезная инфа ##############################
############################## Ссылки ##############################
############################## Плагины ##############################
# Замена уролов в SRDBM
/188.166.67.51/dragon\
/smart-space-shop\
https://toster.ru/q/204812 - тема вн Тостере, где советуют литературу по WP
https://developer.wordpress.org/resource/dashicons/ - иконки для Wordpress dashboard
https://codex.wordpress.org/Function_Reference/wp_enqueue_script - все что входить в ядро WP, чего там только нет, надо только подключить при желании использовать
https://github.com/TGMPA/TGM-Plugin-Activation - плагин, который тянет при установки темы все остальные плагины,котоыре используются в теме
https://github.com/Vestride/Shuffle/blob/master/LICENSE - классный фильтр для портфолио MIT лицензия
http://adambrown.info/p/wp_hooks/hook - wordpress hooks все хуки
http://codex.wordpress.org/%D0%A1%D1%82%D0%B0%D0%BD%D0%B4%D0%B0%D1%80%D1%82%D1%8B_%D0%BA%D0%BE%D0%B4%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_PHP - стайл гайл по PHP от Wordpress
http://snippets.webaware.com.au/snippets/woocommerce-add-to-cart-with-quantity-and-ajax/ - Woocommecre add to cart ajax
http://docs.woothemes.com/document/tutorial-customising-checkout-fields-using-actions-and-filters/ - add fields to checkout page WooCommerce
http://weareoutman.github.io/clockpicker/ - timepicker крутой
http://wpscan.org/ - сайт, который ищет уязвимости в WP
http://www.cssauthor.com/bootstrap-admin-templates/ - 50 бесплатных тем для админки WP
# Крутые сайты на WP
https://puzzle-english.com
http://newbornbaby.com.au/ - крутой сайт на WP, который делал Илья (самое крутое, что я видел)
http://www.expandintheusa.com/speakers/ - крутой сайт на WP, который делал Илья
# Плагины на сублайм
Wordpress Generate Salts - генерирует соль (ctrl+alt+g)
# Переводы
https://codex.wordpress.org/Function_Reference/load_textdomain - глобальная переменная $l10n которая содержит все переводы
# Не исследовано
https://wordpress.org/plugins/s2member/ - крутой фреймворк-плагин по управлению пользователями и их защите, с Пейпалом что-то связано (изучить)
http://www.farinspace.com/wpalchemy-metabox/ - класс по легкому созданию метабоксов в своем плагине, или теме
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment