• Как скрыть незаполненные поля ACF в Wordpress?

    iminby, Исходя из задачи Вами поставленной нет. Читаем что написанно в приведенном коде по-русски: Если успешно осуществлен запрос поля acf-croup то выводим. Нет проверки на пустоту.
    Добавим:
    <?php $field =  get_field('acf-croup'); if(/*можно даже перестраховаться и сделать isset($field) && */ !empty($field) ): /* Если поле не пустое то: */ ?>
    <tr class="table__row">
    <th class="table__cell table__cell_head">Модуль крупности</th>
    <td class="table__cell"><?= $croup ? $croup : '-'; ?></td>
    </tr>
    <?php endif; ?>
  • Как вывести произвольные поля?

    kentos,
    Кодом не пишу - потомучто нет конкретики. Опишу алгоритм, как вижу я:
    С помощью ajax(предпочтительно), запроса или при загрузке страницы настроек Вашего плагина из результатов ajax\php WP_Query (например) запроса формируете выпадающий список.
    Подключаете JS, (можно конечно и обычным php post но бррр) ->подключайте JS, который, реагируя на изменения в списке берет что-то из текущей опции списка(selected option), и отправляет на php обработку выводящую JSON-ом результат. Вам остается лишь заменить\подгрузить в соответствующие div все что полагается и получать удовольствие от проделанного)

    берет что-то из текущей опции списка

    Это зависит от того как Вы организуете список. В value опций можно подставлять id выводимых записей, можно брать текст внутри опции в качестве post_title.. если option value нужна для каки-либо иных кроме id записи данных, - можно каждой опции добавлять аттрибут с id или title.. Варианты, как видите есть разные.
  • Как отловить изменение значения переменной input?

    san_jorich
    @san_jorich Автор вопроса
    Спасибо, решил! Тригера как-то вылетели из внимания.
    Плюс подстановка времени решили проблему "уникализации"
    jQuery('#client_surename').on('focusout',function(){
    					var now = new Date(Date.now());					
    					if(jQuery('#client_login').val() ==''){ jQuery('#client_login').val( cyr2lat_login (jQuery('#client_surename').val()+now.getHours()+now.getMinutes()+now.getSeconds() ) ); }
    					jQuery('#client_login').trigger('change');
    				})
  • Самый быстрый и мощный хостинг для Wordpress?

    Главное чтоб Wordpress был нормально заточен. Работаю на Beget, Reg. Доволен
  • Как включить кнопку по результатам валидации, если изначально она выключенна?

    san_jorich
    @san_jorich Автор вопроса
    А если значения изменяются по несколько раз? Например заполнил 1 инут потом 3, 4 и снова отредактировал 1?
  • Как сделать подобный эффект для записей в wordpress сайте?

    Григорий Черняев, Тень - это box-shabow, а разные размеры блоков - все там же по ссылке. Почитайте
  • Изменение содержания записи (content) по условию?

    В Вашем случае можно завести.. наверное год рождения заведен как произвольное поле или опция профиля.. если нет - то заводите, и в запросе калькулируйте дату.
    Если текущая дата минус год рождения участника меньше или равно 30, то выводим иначе алес, брейк, Петя вилл дай.
    Очень многое зависит от того как Вы организовали данные у себя на сайте.
    Не обязательно менять контент. Петю можно не выводить. Если хотите - можно запилить функцию по крону проверяющую Петров на соответствие правилам участия в клубе и сосавлять некий стоп-лист древних Петров. И при выводе проверять - если Петр в стоп-листе то айайай.
  • Изменение содержания записи (content) по условию?

    Если одеть очки то контент будет в розовом, при условии открытых глаз
    $man="Петя"; $woman = "Маша";
    $result = get_option("action");
    if($result=="послала" && $typeof($man)!="Man") { petya_die(); } else{ return $woman.' '.$result.' '.$man;}

    Если Петя Мужик и Маша умная (настоящих мужков не посылают ) - да прибудет с ними счастье. В Вашем случае контент

    А если серьезно.. раз 10 перечитал вопрос и комментарий.. Ну не понятно..
    По-Русски: "Хочу выводить контент если $a !=0 иначе_если $a==0 послать всех.. за мандаринками
    Серьезно: Временные переменные можно хранить в localStorage. Если нужно выводить контент по определенному условию - то сначала проверяется услоие потом "грузится сервер"
    Если нужно изменять контент взависимости от условия - то сначала берется контент, потом с ним вытворяется все, что нужно
    Если входящая переменная = 0, - то, если равна 1 то итд. Конструкция называется swith case.
    swith (Петя){
    case: "Мужик": Выйти замуж; break;
    case: "Немужик": Послать; break;
    default: "Студент Валера": Налить Пивка; Повторить;
    }

    Просто дайте почитать код - так понятнее. Или, на худой конец опишите "что хочу".
  • Не работают плагины в Wordpress?

    coresak, jQuery плагины подключаются особой магией. А то вся консоль красная небось?
    Пример-плагинчик в доработку :)
    <?php
    /*
    Plugin Name: jQuery-Plugin_Includer
    Plugin URI: http://александрсоболев.рф
    Description: Плагин подключающий jQuery скрипты
    Version: 1.0
    Author: Александр Соболев
    Author URI: http://vk.com/san_jorich
    License: GPL2
    */
    /*  Copyright 2018  SOBOLEV_ALEKSANDER  (email : samigrai@mail.ru) */
    function js_includer() {
      wp_register_script('нужная_вам_библиотека\плагин', plugins_url('js/нужная_вам_библиотека\плагин.js', __FILE__));
      wp_enqueue_script('нужная_вам_библиотека\плагин');
      wp_register_script('js_обработчик', plugins_url('js/js_обработчик.js', __FILE__));
      wp_enqueue_script('js_обработчик');
      wp_localize_script( 'js_обработчик', 'ajaxurl', admin_url( 'admin-ajax.php' ) ); // Чтоб работали ajax запросы  
    }
    add_action( 'admin_enqueue_scripts', 'js_includer' ); // Подключение JS-скриптов в админке
    add_action( 'wp_enqueue_scripts', 'js_includer' ); // Подключение JS-скриптов в фронтэнде
    ?>
  • Как добавлять в корзину без перезагрузки страницы? ( WP and Woocommerce )?

    add_to_cart();
    1. Валидный ajax запрос.
    2. На стороне сервера что-то вроде
    $your_cart= new WC_Cart();
    $your_cart->add_to_cart( $product_id = 0, $quantity = 1, $variation_id = 0, $variation = array(), $cart_item_data = array() )
  • Как настроить дополнительные условия валидации полей Contact Form 7 на Wordpress?

    Думал над Вашей историей.. А Вы уверенны что это CF? У присылаемого Вам сообщения есть какие-то особые черты, говорящие о том что это CF?
    Наверное можно попробывать что-то вроде этого
    function custom_wpcf7_validator( $array ) {   
        $stopcode = $array['secret_input'];
        if( !empty( $stopcode ) ){ break; } else { return $array; }
    }; 
    add_filter( 'custom_wpcf7_validator', 'action_wpcf7_posted_data', 9, 1 ); // Только с приоритетом нужно разобраться.. и с массивом
  • Страницу Произольного Типа Записи для для кастомных ролей нужно добавлять отдельно?

    san_jorich
    @san_jorich Автор вопроса
    Игорь Воротнёв, прочитал, Пытаюсь добиться чтоб в админке ничего лишнего не было, а доступ в нее был..дописался до того что в админку не пускает.. Подскажите пожалуйста, какая возможность отвечает за это? И.. правильно ли я добавил в массив произвольные таксономии? Чтобы вдальнейшем писать их в CPT?
    код
    $es_admin_capabilities=array(
     	/* standart capabilities */
     	'activate_plugins'		=>	false,
     	'delete_others_pages'	=>	false,
     	'delete_others_posts'	=>	false,
     	'delete_pages'			=>	false,
     	'delete_posts'			=>	false,
     	'delete_private_pages'	=>	false,
     	'delete_private_posts'	=>	false,
     	'delete_published_pages'=>	false,
     	'delete_published_posts'=>	false,
     	'edit_dashboard'		=>	true,
     	'edit_others_pages'		=>	false,
     	'edit_others_posts'		=>	false,
    	'edit_pages'			=>	false,
    	'edit_posts'			=>	false,
    	'edit_private_pages'	=>	false,
    	'edit_private_posts'	=>	false,
    	'edit_published_pages'  =>	false,
    	'edit_published_posts'  =>	false,
    	'edit_theme_options'	=>	false,
    	'export'				=>	false,
    	'import'				=>	false,
    	'list_users'			=>	false,
    	'manage_categories'		=>	false,
    	'manage_links'			=>	false,
    	'manage_options'		=>	true, // поидее должен пускать в админку но.. не хочет
    	'moderate_comments'		=>	false,
    	'promote_users'			=>	false,
    	'publish_pages'			=>	false,
    	'publish_posts'			=>	false,
    	'read_private_pages'	=>	false,
    	'read_private_posts'	=>	false,
    	'read'					=>	false,
    	'remove_users'			=>	false,
    	'switch_themes'			=>	false,
    	'upload_files'			=>	false,
    	'customize'				=>	false,
    	'delete_site'			=>	false,
    	/* es_event taxonomy capabilities */
    	'edit_es_event'			=>	true,
    	'edit_others_es_event'	=>	true,
    	'publish_es_event'		=>	true,
    	'read_private_es_event'	=>	true,
    	'delete_es_event'		=>	true,
    	'delete_private_es_event'=> true,
        'delete_published_es_event'=>true,
    	'delete_others_es_event' => true,
    	'edit_private_es_event'	=>	true,
    	'edit_published_es_event'=> true,
     	);
    
    function get_es_role_capabilities($role){
    	switch ($role) {
    		case 'es_admin': return $es_admin_capabilities; break;
    	}
    }
    
    register_activation_hook( __FILE__, 'add_se_roles' );
    function add_se_roles() {
    	//require_once(dirname(__FILE__) . '/functions_php/es_users_managment.php');
    	add_role('es_admin', 'Администратор Системы Мероприятий', get_es_role_capabilities('es_admin'));
    }
  • Страницу Произольного Типа Записи для для кастомных ролей нужно добавлять отдельно?

    san_jorich
    @san_jorich Автор вопроса
    Игорь Воротнёв, Спасибо за напутствие и подробный ответ! Уселся за парту, заваривать технологические отверстия.. а произвольные права создаются add_cap( 'my_custom_cap' ), или нужно что-то еще?
  • Почему не создается виртуальная страница?

    Так себе решение) До первого обновления темы. Все тоже что вписанно в functions перепешите в свой нехитрый плагин.
  • Загрузка файлов в Wordpress. Как реализовать?

    san_jorich
    @san_jorich Автор вопроса
    Долго мучил и пробывал разые варианты и разные jQ плагины, но в итоге перевел все на более привычный ajax. Добавил fancybox и теперь гадаю, как встроить сюда кнопку удаления картинки. Уже попытался через title - не то ))
    Что-то срослось
    <div class="row photo2estate ml-3" id="estate_photos">
    						<label for="photos">Фотографии объекта</label>
    						<div id="photos" class = "col-md-12"><?php get_estate_photos($estate_object_id);?></div>						
    						<div class = "col-md-3 upload-form">
    							<div class= "upload-response"></div>
    							<div class = "form-group">
    								<label>Выберите файлы:</label>
    								<input type = "file" name = "files[]" accept = "image/*" class = "files-data form-control" multiple />
    							</div>
    							<div class = "form-group">
    								<input type = "submit" value = "Загрузить" estate_id="<?php echo $estate_object_id;?>" class = "btn btn-primary btn-upload" />
    							</div>
    						</div>
    					</div>

    // Функция загрузки изображений
    add_action('wp_ajax_ae_upload_files', 'ae_upload_files');
    add_action('wp_ajax_nopriv_ae_upload_files', 'ae_upload_files'); // Allow front-end submission 
    
    function ae_upload_files(){
        
        $estate_id = isset( $_POST['estate_id'] ) ? $_POST['estate_id'] : 0;  // The parent ID of our attachments
        $valid_formats = array("jpg", "png", "gif", "bmp", "jpeg"); // Supported file types
        $max_file_size = 4096 * 2000; // in kb
        $max_image_upload = 40; 
        $wp_upload_dir = wp_upload_dir();
        $path = $wp_upload_dir['path'] . '/';
        $count = 0;
    
        $attachments = get_posts( array(
            'post_type'         => 'attachment',
            'posts_per_page'    => -1,
            'post_parent'       => $estate_id,
            'exclude'           => get_post_thumbnail_id()
        ) );
    
        if( $_SERVER['REQUEST_METHOD'] == "POST" ){
            
            if( ( count( $attachments ) + count( $_FILES['files']['name'] ) ) > $max_image_upload ) {
                $upload_message[] = "Лимит возможных фотографий = " . $max_image_upload . " превышен. За подробностями обратитесь к администратору системы";
            } else {
                
                foreach ( $_FILES['files']['name'] as $f => $name ) {
                    $extension = pathinfo( $name, PATHINFO_EXTENSION );
                    // Generate a randon code for each file name
                    $new_filename = 'estate_'.$estate_id.'-img_'.ae_generate_random_code( 5 )  . '.' . $extension;
                    
                    if ( $_FILES['files']['error'][$f] == 4 ) { continue; }
                    
                    if ( $_FILES['files']['error'][$f] == 0 ) {
                        if ( $_FILES['files']['size'][$f] > $max_file_size ) { $upload_message[] = "$name слишком большой!";  continue; }
                        elseif( ! in_array( strtolower( $extension ), $valid_formats ) ){ $upload_message[] = "$name формат файла не поддерживается!";  continue; }
                        else{ 
                        
                            if( move_uploaded_file( $_FILES["files"]["tmp_name"][$f], $path.$new_filename ) ) {
                                
                                $count++; 
    
                                $filename = $path.$new_filename;
                                $filetype = wp_check_filetype( basename( $filename ), null );
                                $wp_upload_dir = wp_upload_dir();
                                $attachment = array(
                                    'guid'           => $wp_upload_dir['url'] . '/' . basename( $filename ), 
                                    'post_mime_type' => $filetype['type'],
                                    'post_title'     => preg_replace( '/\.[^.]+$/', '', basename( $filename ) ),
                                    'post_content'   => '',
                                    'post_status'    => 'inherit'
                                );
    
                                $attach_id = wp_insert_attachment( $attachment, $filename, $estate_id );
    
                                require_once( ABSPATH . 'wp-admin/includes/image.php' );
                                
                                $attach_data = wp_generate_attachment_metadata( $attach_id, $filename ); 
                                wp_update_attachment_metadata( $attach_id, $attach_data );
                                
                            }
                        }
                    }
                }
            }
        }
    
        if ( isset( $upload_message ) ) :
            foreach ( $upload_message as $msg ){        
                printf( __('<p class="bg-danger">%s</p>', 'wp-trade'), $msg );
            }
        endif;
        
        // If no error, show success message
        if( $count != 0 ){ printf( __('<p class = "bg-success">Изображения загруженны успешно!</p>', 'wp-trade'), $count ); }  exit();
    }
    
    // Random code generator used for file names.
    function ae_generate_random_code($length=6) {
     
       $string = '';
       $characters = "23456789ABCDEFHJKLMNPRTVWXYZabcdefghijklmnopqrstuvwxyz";
     
       for ($p = 0; $p < $length; $p++) {
           $string .= $characters[mt_rand(0, strlen($characters)-1)];
       }
     
       return $string;
     
    }

    jQuery(document).ready(function() {
        
        jQuery('body').on('click', '.btn-upload', function(e){
            e.preventDefault;
            var estate_id = jQuery(this).attr('estate_id');
            var fd = new FormData();
            var files_data = jQuery('.upload-form .files-data');
            
            jQuery.each(jQuery(files_data), function(i, obj) {
                jQuery.each(obj.files,function(j,file){
                    fd.append('files[' + j + ']', file);
                })
            });
            
            fd.append('action', 'ae_upload_files');  
            
            // Remove this code if you do not want to associate your uploads to the current page.
            fd.append('estate_id', estate_id); 
    
            jQuery.ajax({
                type: 'POST',
                url: ajaxurl,
                data: fd,
                contentType: false,
                processData: false,
                success: function(response){
                    swal('Успешно!','Фотографии успешно загруженны!','success')
                    //jQuery('.upload-response').html(response); // Append Server Response
                }
            });
        });
    });
  • Как скачать файл на сайте wordpress через метод post?

    zeni1agent,
    PHP
    <?php
    /*
    Plugin Name: File Download Counter
    Plugin URI: http://александрсоболев.рф
    Description: Плагин-виджет, реализующий счетчик кликов
    Author: Александр Соболев
    Version: 1.1
    Author URI: http://александрсоболев.рф
    */
    function js_includer() {  wp_register_script('my_click_counter', plugins_url('js/my_click_counter.js', __FILE__));  wp_enqueue_script('my_click_counter'); wp_localize_script( 'my_click_counter', 'ajaxurl', admin_url('admin-ajax.php') );}
    function register_my_counter() { register_setting( 'my_click_counter', 'counter', 'intval' ); } 
    function count_plus(){$all_options = get_option('my_click_counter'); $count = intval($all_options['counter']); $new_val= ++$count;update_option( 'my_click_counter', $new_val ); wp_send_json($new_val); }
    function show_counter(){get_option('my_click_counter'); $count = intval($all_options['counter']); $counter_div='<div id="my_counter_accept">Тест счечика.</div><div id="my_click_counter">'.$counter_div.'</div>';return $counter_div;} add_shortcode( 'show_counter', 'show_counter' );
    add_action( 'admin_enqueue_scripts', 'js_includer' ); add_action( 'wp_enqueue_scripts', 'js_includer' ); add_action( 'admin_init', 'register_my_counter' ); add_action( 'wp_ajax_count_plus','count_plus' ); add_action( 'wp_ajax_nopriv_count_plus','count_plus' );
    ?>

    JS:
    jQuery(document).ready(function(){
    	jQuery('#my_counter_accept').on('click',function(){
    		jQuery.ajax({ type: "POST", url: ajaxurl, dataType: 'json',  data: { action: 'count_plus'}, beforeSend: function(){jQuery('.класс ссылки').remove(); }, success: function(new_val) { console.log('Файл скачен '+new_val+' раз'); } });	
    	})
    });

    Написанно бегло. JS кидаем в каталог JS, относительно корневого.
    Корректируем класс ссылки.Возможны правки и допилы. Плагин создает опцию содержащую в себе общее количество скачек файлов\файла(у Вас в примере он один). Счетчик увиличивается при нажатии. Также, при нажатии ссылка скрывается, чтоб не дублировать значение счетчика злонамеренно.
    Скорее всего нужно дописывать и править код под Ваши задачи, но "рабочая база" теперь у Вас есть)