Ответы пользователя по тегу PHP
  • Можно ли по-другому записать код в шорткоде?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    Сделал опрятнее и дам несколько советов

    1. Для вывода тегов в ядре есть функции the_tags(), get_the_tag_list() и get_the_term_list()
    2. Вы можете определить список атрибутов $atts, чтобы сделать шорткод более универсальным
    3. Нужно проверять, что переменная $post определена, get_queried_object() не сработает для главной, архивов и некоторых других шаблонов
    4. Шорткод ВСЕГДА должен возвращать return, а не делать вывод echo
    5. Если функция возвращает данные, то хорошо поставить apply_filters(), это сэкономит вам кучу времени и нервов, если понадобится поменять возвращаемые данные с помощью фильтра add_filter()
    6. В тег <ul> можно вкладывать только элементы <li>


    // Использование [tag-list field="метки_и_ссылки" class="tag-list"]
    add_shortcode( 'tag-list', 'get_custom_tag_list' );
    function get_custom_tag_list( $atts ) {
    
    	// белый список параметров и значения по умолчанию для шорткода
    	$atts = shortcode_atts( array(
    		'class' => 'list',
    		'field' => '',
    		'post_id' => 0
    	), $atts );
    
    	$output = '';
    	$post = get_post( $atts['post_id'] );
    
    	if ( isset( $post->ID ) && !empty($atts['field']) ) {
    		$tags = get_field_object( $atts['field'], $post->ID );
    		if ( $tags ) {
    			$output .= '<ul class="' . $atts['class'] . '">';
    			foreach ( $tags['value'] as $key => $value ) {
    				$output .= '<li class="' . $atts['class'] . '__item" >';
    					$output .= '<a class="' . $atts['class'] . '__link" href="' . $value->description . '" rel="tag">' . $value->name . '</a>';
    				$output .= '</li>';
    			}
    			$output .= '</ul>';
    		}
    	}
    
    	return apply_filters( 'get_custom_tag_list', $output );
    	
    }
    Ответ написан
    Комментировать
  • Как вывести данные из JSON?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    Вам нужно собрать данные всех объектов в формате json

    $mask = array();
    $mask['type'] = 'FeatureCollection';
    
    foreach ( $variable as $key => $value ) {
      $mask['features'][] = array(
        "type" => 'Feature',
        "id"=> $key,
        "geometry" => array (
          "type" => 'Point',
          "coordinates" => [(float) $value->lat, (float) $value->long],
        ),
        "properties" => array (
          "balloonContentBody" => "<strong class='map-title'><a class='link' href='" . $value->post_link . "'>" . $value->post_title . "</a></strong>",
          "balloonContentFooter" => "<a class='hidden' href='#'>Я был здесь!</a>",
          "clusterCaption" => "<strong>" . $value->post_title . "</strong>",
          "hintContent" => "<strong>" . $value->post_title . "</strong>"
        )
      );
    }


    Теперь json_encode( $mask ) передать в обработчик как в этом примере https://yandex.ru/dev/maps/jsbox/2.1/object_manager/
    Ответ написан
    Комментировать
  • Как доработать функцию вывода слудующего за текущим месяца?

    artzolin
    @artzolin
    php, WordPress разработка сайтов artzolin.ru
    Чтобы получить день:
    date_i18n('d',strtotime('+1 month'));

    Update
    Если вы хотите получить следующий месяц независимо от текущей даты:
    date_i18n('F',strtotime('first day of +1 month'));
    Ответ написан
  • Как спарсить Ozon?

    artzolin
    @artzolin
    php, WordPress разработка сайтов artzolin.ru
    Посмотрите Ozon Seller API
    Ответ написан
    Комментировать
  • Не могу узнать расширение загружаемой картинки, как исправить?

    artzolin
    @artzolin
    php, WordPress разработка сайтов artzolin.ru
    Есть еще функция
    $ext = pathinfo( $file, PATHINFO_EXTENSION );
    Ответ написан
    Комментировать
  • Как в for прописать 2 условия?

    artzolin
    @artzolin
    php, WordPress разработка сайтов artzolin.ru
  • Как зациклить PHP массив и встроить в него данные из других массивов?

    artzolin
    @artzolin
    php, WordPress разработка сайтов artzolin.ru
    // стартовый массив
    $items = [
    	1 => array(
    		"description" => "Наименование товара 1",
    		"quantity" => "2.00",
    		"value" => "250.00",
    		"currency" => "RUB",
    	),
    	2 => array(
    		"description" => "Наименование товара 2",
    		"quantity" => "1.00",
    		"value" => "100.00",
    		"currency" => "RUB",
    	)
    ];
    
    // пересобираем для отправки
    $array['receipt']['customer']['full_name'] = 'Иванов Иван Иванович';
    $array['receipt']['customer']['phone'] = '79000000000';
    
    foreach ( $items as $key => $item ) {
    	$array['receipt']['items'][] = [
    		"description" => $item['description'],
    		"quantity" => $item['quantity'],
    		"amount" => array(
    			"value" => $item['value'],
    			"currency" => $item['currency'],
    		),
    		"vat_code" => "2",
    		"payment_mode" => "full_prepayment",
    		"payment_subject" => "commodity"
    	];
    }
    
    var_dump($array);


    В первом массиве $items у вас должны быть данные из корзины в виде массива. В цикле значения заменяете на эти данные, будет что-то типо $item['description'], $item['quantity'] и т.д.
    Ответ написан
  • Как. правильно написать условие для if?

    artzolin
    @artzolin
    php, WordPress разработка сайтов artzolin.ru
    Пример из доки:

    <?php if( get_field('text_field') ): ?>
        <h2><?php the_field('text_field'); ?></h2>
    <?php endif; ?>


    Только ссылки на соц.сети должны быть в общих опциях темы, а не в каком-то отдельно взятом посте
    Ответ написан
    Комментировать
  • Как вывести custom_post_type пост вместо другого custom_post_type поста?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    Вы не совсем правильно используете pre_get_posts. Вот пример правильной подмены post_type в таксономии:

    add_action( 'pre_get_posts', 'custom_pages_cases', 1 );
    if ( ! function_exists( 'custom_pages_cases' ) ) {
    	function custom_pages_cases( $query ) {
    		// Выходим, если это админ-панель или не основной запрос
    		if( is_admin() || ! $query->is_main_query() ) 
    			return;
    
    		if( $query->is_post_type_archive('instructor') || $query->is_tax('instructors') ) {
    			$query->set( 'post_type', 'trainer' );
    		}
    	}
    }


    Но и это не то, что вам нужно. Вам надо сделать нормальный вывод новых постов и таксономий и настроить редирект со старых на новые с помощью wp_redirect()

    add_action( 'template_redirect', 'rider_redirect_canonical' );
    function rider_redirect_canonical() {
    
    	if ( is_single() && ( 'instructor' === get_post_type() ) ) {
    
    		$post_slug = get_post_field('post_name');
    
    		// получаем id записи в другом post_type по текущему слагу
    		$args = array( 'name' => $post_slug, 'post_type' => 'trainer', 'post_status' => 'publish', 'numberposts' => 1 );
    		$post_id = get_posts($args)[0]->ID ?: '0';
    
    		if ( $post_id != '0' ) {
    			wp_redirect( get_permalink($post_id), 301 );
    			exit();
    		}
    
    	}
    }


    Последний пример написан без тестов, но работать должен
    Ответ написан
    2 комментария
  • Как правильно использовать хук publish_post в Wordpress?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    Что именно вы хотите сделать? Опубликовать запись? Используйте для этого функцию wp_insert_post()

    // Создаем массив
    $post_data = array(
    	'post_title'    => 'Заголовок записи',
    	'post_content'  => 'Здесь должен быть контент (текст) записи.',
    	'post_status'   => 'publish',
    	'post_author'   => 1,
    	'post_category' => array(8,39)
    );
    
    // Вставляем данные в БД
    $post_id = wp_insert_post( wp_slash($post_data) );
    Ответ написан
    Комментировать
  • Как закэшировать выполненную часть php кода?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    Мне кажется вы ищите wp_cache_set() и wp_cache_add(), а wp_cache_get(), чтобы получать данные
    Ответ написан
  • Как задать условие?

    artzolin
    @artzolin
    php, WordPress разработка сайтов artzolin.ru
    Если вы можете поместить класс в переменную, то перед выводом можете его проверять

    $class = 'image';
    
    if ( $class != 'image' ) {
    	echo '<img class="' . $class . '" src="img.png"/>';
    }


    Или как вам советуют делать на js
    Ответ написан
    Комментировать
  • Как получить доступ к ключу в массиве JSON?

    artzolin
    @artzolin
    php, WordPress разработка сайтов artzolin.ru
    $array = json_decode( $array, true );
    var_dump($array['event']);
    Ответ написан
    2 комментария
  • Как с помощью php изменить href у ссылки зная ее класс?

    artzolin
    @artzolin
    php, WordPress разработка сайтов artzolin.ru
    Вот как ваша задача будет выглядеть, если использовать библиотеку Simple HTML DOM Parser. В переменной $custom_value передаете новое значение для ссылки. Измененный текст у вас по прежнему в переменной $html

    $html = file_get_html($file_path);
    
    // получаем ссылку
    $link = $html->find( 'a.like', 0 );
    $link->href = $custom_value;
    
    $html->clear();
    unset($html);
    Ответ написан
    Комментировать
  • Как извлечь ссылку из строки?

    artzolin
    @artzolin
    php, WordPress разработка сайтов artzolin.ru
    Посоветую подключить какую-то библиотеку для парсинга по селекторам и жизнь станет проще. Вот пример, как достать нужные вам значения используя Simple HTML DOM Parser

    $html = file_get_html($file_path);
    
    // получаем ссылку
    $link = $html->find( 'a.some-class', 0 )->href;
    
    $html->clear();
    unset($html);
    Ответ написан
    Комментировать
  • Как спарсить ссылку на изображение?

    artzolin
    @artzolin
    php, WordPress разработка сайтов artzolin.ru
    Посоветую подключить какую-то библиотеку для парсинга по селекторам и жизнь станет проще. Вот пример, как достать нужные вам значения используя Simple HTML DOM Parser

    if ( file_exists( $file_path ) ) {	
    	$html = file_get_html($file_path);
    
    	// получаем r-attr
    	$r_attr_text = $html->find( '.r-attr a', 0 )->plaintext;
    	$r_attr_link = $html->find( '.r-attr a', 0 )->href;
    
    	// получаем ссылки на изображения
    	$images = $html->find( '#msgood-gallery img' );
    	foreach ( $images as $key => $image ) {
    		$link = $image->src;
    	}
    
    	$html->clear();
    	unset($html);
    }
    Ответ написан
  • Почему массив с переменной выдает не тот результат?

    artzolin
    @artzolin
    php, WordPress разработка сайтов artzolin.ru
    $string = "1, 2, 3"; // строка
    $array = array(1, 2, 3); // массив
    Ответ написан
    1 комментарий
  • Как регулярным выражением прочитать имя файла?

    artzolin
    @artzolin
    php, WordPress разработка сайтов artzolin.ru
    Если я правильно понял и вам нужно получить все после знака "-", то воспользуйтесь такой регуляркой:

    $string = 'ip-ref 127.0.0.1-353464775.dat';
    preg_match('/([^-]+.dat)$/', $string, $matches);
    
    var_dump($matches[0]);
    Ответ написан
    2 комментария
  • Как спарсить сайт с последующим переводом на другой язык?

    artzolin
    @artzolin
    php, WordPress разработка сайтов artzolin.ru
    Я тоже думал как это реализовать, но в целом задача выглядит не супер сложной. Допустим, если получить из текста все теги <p>, то мы можем ->innertext заменить переводом, после чего у нас в переменной $html будет уже переведенный текст

    $paragraphs = $html->find( 'p' );
    foreach ( $paragraphs as $key => $paragraph ) {
    	$paragraph->innertext = get_translate($paragraph->innertext);
    }


    Конечно, абзацы могут содержать инлайновые теги типо <span>, <strong> и хуже всего <a>. С ними сложнее, но если знать в каком точно формате их переводит переводчик, то регуляркой можно заменить обратно

    Что касается api переводчиков, то они вроде все платные, но с настройкой по документации не должно возникнуть много проблем. Кстати, в мае Яндекс запустили новый сервис Yandex Translate с переводом на нейронках. Стоит это 45 руб. за 100к. символов. Стоит тестить, я считаю
    Ответ написан
    Комментировать
  • Не выводится дата в посте?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    Чтобы работали get_the_date() и the_time() должна быть определена переменная $post. Чтобы ее определить нужно получать посты из базы с помощью wp_query() или get_posts() и установить ее в цикле с помощью setup_postdata($post)

    Что такое getNews() у вас я не знаю, а писать переменные кириллицей моветон
    Ответ написан
    2 комментария