Простая загрузка файлов в темах и плагинах WordPress

Сейчас пишу проект, стараюсь не использовать сторонние плагины.

Была необходимость реализовать возможность загрузки файлов на сайт.

Оказалось, что в интернете не так уж и много решений, точнее много, но всё не то…

<?php
/**
 * Form builder helper
 *
 * @param string $label Field label
 * @return none
 */
function fileupload( $label ) { ?>
  <tr>
    <td class="left_label"> <?php
      echo $label; ?>
    </td>
    <td>
      <form name="uploadfile" id="uploadfile_form" method="POST" enctype="multipart/form-data" action="<?php echo $this->filepath.'#uploadfile'; ?>" accept-charset="utf-8" >
        <input type="file" name="uploadfiles[]" id="uploadfiles" size="35" class="uploadfiles" />
        <input class="button-primary" type="submit" name="uploadfile" id="uploadfile_btn" value="Upload"  />
      </form>
    </td>
  </tr>  <?php
}

/**
 * Handle file uploads
 *
 * @todo check nonces
 * @todo check file size
 *
 * @return none
 */
function fileupload_process() { 
  $uploadfiles = $_FILES['uploadfiles'];

  if (is_array($uploadfiles)) {

    foreach ($uploadfiles['name'] as $key => $value) {

      // look only for uploded files
      if ($uploadfiles['error'][$key] == 0) {

        $filetmp = $uploadfiles['tmp_name'][$key];

        //clean filename and extract extension
        $filename = $uploadfiles['name'][$key];

        // get file info
        // @fixme: wp checks the file extension....
        $filetype = wp_check_filetype( basename( $filename ), null );
        $filetitle = preg_replace('/\.[^.]+$/', '', basename( $filename ) );
        $filename = $filetitle . '.' . $filetype['ext'];
        $upload_dir = wp_upload_dir();

        /**
         * Check if the filename already exist in the directory and rename the
         * file if necessary
         */
        $i = 0;
        while ( file_exists( $upload_dir['path'] .'/' . $filename ) ) {
          $filename = $filetitle . '_' . $i . '.' . $filetype['ext'];
          $i++;
        }
        $filedest = $upload_dir['path'] . '/' . $filename;

        /**
         * Check write permissions
         */
        if ( !is_writeable( $upload_dir['path'] ) ) {
          $this->msg_e('Unable to write to directory %s. Is this directory writable by the server?');
          return;
        }

        /**
         * Save temporary file to uploads dir
         */
        if ( !@move_uploaded_file($filetmp, $filedest) ){
          $this->msg_e("Error, the file $filetmp could not moved to : $filedest ");
          continue;
        }

        $attachment = array(
          'post_mime_type' => $filetype['type'],
          'post_title' => $filetitle,
          'post_content' => '',
          'post_status' => 'inherit'
        );

        $attach_id = wp_insert_attachment( $attachment, $filedest );
        require_once( ABSPATH . "wp-admin" . '/includes/image.php' );
        $attach_data = wp_generate_attachment_metadata( $attach_id, $filedest );
        wp_update_attachment_metadata( $attach_id,  $attach_data );
      }
    }
  }
}
?>

 

Как Разрешить пользователям Установить пароль Во время Регистрации

Сейчас  делаю проект с 0, стараюсь не использовать плагины, всё своими руками 🙂

С ужасом заметил что при регистрации в WordPress нельзя указать собственный пароль.

Пришлось это исправить:

<?php
// Add Password, Repeat Password and Are You Human fields to WordPress registration form

add_action( 'register_form', 'ts_show_extra_register_fields' );
function ts_show_extra_register_fields(){
?>
	<p>
		<label for="password">Password<br/>
		<input id="password" class="input" type="password" tabindex="30" size="25" value="" name="password" />
		</label>
	</p>
	<p>
		<label for="repeat_password">Repeat password<br/>
		<input id="repeat_password" class="input" type="password" tabindex="40" size="25" value="" name="repeat_password" />
		</label>
	</p>
<?php
}

// Check the form for errors
add_action( 'register_post', 'ts_check_extra_register_fields', 10, 3 );
function ts_check_extra_register_fields($login, $email, $errors) {
	if ( $_POST['password'] !== $_POST['repeat_password'] ) {
		$errors->add( 'passwords_not_matched', "<strong>ERROR</strong>: Passwords must match" );
	}
	if ( strlen( $_POST['password'] ) < 8 ) {
		$errors->add( 'password_too_short', "<strong>ERROR</strong>: Passwords must be at least eight characters long" );
	}
}
?>

Что делает скрипт:

  1. Проверяет, совпадают ли пароли
  2. Проверяет длину пароля

Если какой-то из этих пунктов не выполняется, сообщение об ошибке будет отображаться выше формы регистрации. Если все хорошо, WordPress перейдёт к созданию новой учетной записи пользователя . Но , так как мы хотим, чтобы WordPress сохранил в базу пароль, который ввёл пользователь надо применить Хук :

<?php
// Storing WordPress user-selected password into database on registration
add_action( 'user_register', 'ts_register_extra_fields', 100 );
function ts_register_extra_fields( $user_id ){
	$userdata = array();
	$userdata['ID'] = $user_id;
	if ( $_POST['password'] !== '' ) {
		$userdata['user_pass'] = $_POST['password'];
	}
	$new_user_id = wp_update_user( $userdata );
}
?>

Чтобы  в письме пришел не новый, а указанный пользователем пароль используем хук:

<?php
// Editing WordPress registration confirmation message
add_filter( 'gettext', 'ts_edit_password_email_text' );
function ts_edit_password_email_text ( $text ) {
	if ( $text == 'A password will be e-mailed to you.' ) {
		$text = 'If you leave password fields empty one will be generated for you. Password must be at least eight characters long.';
	}
	return $text;
}
?>

 

Как изменить тип страницы WordPress

В интернете наткнулся на вопрос:

Как перевести записи в товары?

Доброго времени суток!
На wordpress стоят 3500 записей. Их нужно перевести из записей в товары. Как мне кажется, записи и товары по сути очень похожи, просто по разному называются и имеют разный инструментарий для работы с ними. Если ли подходящие плагины или интересный способ, который позволяет перенести записи в товары?
Спасибо!
Решил помочь и написать статью на эту тему 🙂
Распишу что будет происходить:
  1. Формируем список материала для изменения
  2. Проходим по списку и изменяем тип поста.

Вроде бы всё просто и понятно, а значит пора приступать!

Копируем этот код в файл functions.php  и открываем любую страницу сайта. Проверяем, всё ли получилось и удаляем этот код.

$OltType = "post"; //Старый тип поста
$NewType = "product"; //Новый тип
// Дальше можно ничего не менять

$my_posts = new WP_Query;
$myposts = $my_posts->query( array(
	'post_type' => $OltType
) );
foreach( $myposts as $post ){
	set_post_type( $post->ID, $NewType );
}

PS не забывайте перед добавлением этого кода сделать бэкап, изменения необратимы.

PSS когда этот код вставлен в файл functions.php сайт может долго открываться, в зависимости от количества постов для переноса.

Назначаем шаблон страницы в зависимости от родителя

В интернете увидел вопрос:

Как установить шаблон страницы в зависимости от её родителя

Решение написал достаточно быстро.

Буду рад, если вам пригодится 🙂

Нижеуказанное добавляем в файл functions.php

function update_page_template( $post_id ) {
	if(get_post_type($post_id) = "post"){ //применяем только для страниц
		$parents = get_post_ancestors( $post_id ); // Получаем родителя
		if(array_search('parent-slug', $parents)){ // Заменить 'parent-slug' на slug родителя 
			update_post_meta( $post_id, '_wp_page_template', 'template-name.php' );  //Тут указываем шаблон
		}
	}
}
add_action( 'save_post', 'update_page_template' );

В данном примере устанавливается шаблон страницы при сохранении\обновлении.

Вывести под категории на странице категорий WordPress

Уже не раз на форумах видел темы с вопросом «Как вывести список под категорий на странице категории?»

В одном проекте мне это пришлось реализовать, а теперь я могу с вами поделиться своим решением.

<?php
$cat = get_category(get_query_var('cat'),false); //получаем id основной рубрики
$args = array(  
    'type'                     => 'post'  
    ,'parent'                   => $cat->term_id //только в основной рубрике
    ,'hide_empty'               => 0  //не скрывать пустые
);
  
$categories = get_categories( $args );  
 foreach ($categories as $cat) : ?>
Тут выводим всё, что нас интересует
// Данные в объекте $cat

		// $cat->term_id
		// $cat->name (Рубрика 1)
		// $cat->slug (rubrika-1)
		// $cat->term_group (0)
		// $cat->term_taxonomy_id (4)
		// $cat->taxonomy (category)
		// $cat->description ()
		// $cat->parent (0)
		// $cat->count (14)
		// $cat->object_id (2743)
		// $cat->cat_ID (4)
		// $cat->category_count (14)
		// $cat->category_description ()
		// $cat->cat_name (Рубрика 1)
		// $cat->category_nicename (rubrika-1)
		// $cat->category_parent (0)
 <?php endforeach; ?>

В коде внес некоторые комментарии. Чуть позже расширю эту статью и распишу все возможные варианты того, как с этим кодом работать

(далее…)

Список всех используемых хуков в WordPress

Чем быстрее грузится сайт, тем лучше! Это всем известный факт.

Когда сайт функционирует долгое время, то список подключенных плагинов становится неизменным и тогда стоит задуматься о том, сколько же файлов стилей и сколько скриптов подключено у вас на страницах сайта.

И встал вопрос: как узнать список активных хуков для их отключения. Решение оказалось очень простым:

В файл functions.php  вставляем следующий код:

function list_hooked_functions($tag=false){
 global $wp_filter;
 if ($tag) {
  $hook[$tag]=$wp_filter[$tag];
  if (!is_array($hook[$tag])) {
  trigger_error("Nothing found for '$tag' hook", E_USER_WARNING);
  return;
  }
 }
 else {
  $hook=$wp_filter;
  ksort($hook);
 }
 echo '<pre>';
 foreach($hook as $tag => $priority){
  echo "<br />&gt;&gt;&gt;&gt;&gt;\t<strong>$tag</strong><br />";
  ksort($priority);
  foreach($priority as $priority => $function){
  echo $priority;
  foreach($function as $name => $properties) echo "\t$name<br />";
  }
 }
 echo '</pre>';
 return;
}

Для вывода списка вставляем ниже приведенный код в том файле, в котором хотим увидеть результат, я вставлял в head.php

<?php list_hooked_functions() ?>

Также можно посмотреть хуки только для определенной функции:

<?php list_hooked_functions('wp_head'); ?>

 

Пагинация WordPress в стиле Bootstrap используя WP-Pagenavi

Если вы используете WordPress и тему на основе Bootstrap 3, то вам нужно интегрировать это элегантный компонент с нумерацией страниц. Вы можете сделать это, написав свою функцию или с помощью плагина WP-PageNavi. (далее…)

Как добавить роль Worddpress

Вечерком наводил я порядок на одном из сайтов и понял, что существующие роли, которые есть на сайте  мне не подходят, нужно было что-то уникально, а именно:

Пользователи, которые не могут делать совсем ничего, но при этом были выделены в отдельную группу, чтобы выводить их в блоке «Лица компании».

Я начал искать решение и…. нашел! (далее…)

Как автоматически удалить стандартные ссылки на изображения в WordPress

С помощью WordPress вы можете очень просто загружать изображения и создавать галереи изображений. Однако есть один раздражающий момент, который касается добавления изображений к записям – WordPress автоматически связывает ссылкой изображение с медиафайлом. Вы можете убрать флажок с этой опции при добавлении изображения, однако иногда пользователи просто забывают об этом. В данной статье мы покажем вам, как автоматически удалить все стандартные ссылки на изображения в WordPress. (далее…)

Responsive video — Отзывчивый видео плеер WordPress без плагинов

На проекте jff.by пришло время делать адаптивный дизайн. Т.к. сайт о кино, то логично, что на нем есть видеоплеер. Я использовал стандартный видеоплеер WordPress, но вот беда — плеер не адаптивный и с этим надо что-то делать!

Адаптивный в данном случае значит, что размеры плеер должны подстраиваться под размеры экрана устройства, с которого зашли на сайт.

Для этих целей я попробовал устанавливать дополнительные плагины, но они мне не подходили, часть из них просто не работали, а часть мне не нравилась.

Не долгий поиск по просторам интернета и решение было найдено. (далее…)