Простая загрузка файлов в темах и плагинах 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; ?>

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

(далее…)

Установка qTranslate на WordPress

1) Избавляемся от ошибки

The qTranslate Editor has disabled itself because it hasn’t been tested with your WordPress version yet. This is done to prevent WordPress from malfunctioning. You can reenable it by clicking here (may cause data loss! Use at own risk!). To remove this message permanently, please update qTranslate to the corresponding version.

Для этого в файле /wp-content/plugins/qtranslate/qtranslate.php

меняем строку

define('QT_SUPPORTED_WP_VERSION', '3.9');

на

define('QT_SUPPORTED_WP_VERSION', $wp_version);

2) Избавляемся от названия языка в названии страницы

Для этого открываем файл

меняем строку

return "(".$q_config['language_name'][$language].") ".$lang_text;

на

return $lang_text;

 

 

 

 

 

WordPress on Nginx

Это серия статей об особенностях установки и работы WordPress на Nginx.

Задача:

Имеется сайт, который, при 300 хостов в сутки, пожирает 6Гб оперативной памяти и средняя нагрузка 0.5, с учетом того, что сервер Intel(R) Core(TM) i5-2500 CPU @ 3.30GHz 1600.000 Mhz X 4

В ближайшее время планируется увеличение посещаемости, а значит, что требуется оптимизация!

Что имеем:

  1.  VDS (Виртуализация: OpenVZ, Процессор: 1 ядро, Память: 512 Мб, Диск: 30 Гб)
  2. Желание оптимизации и ускорения сайта, а так же уменьшение затрат
  3. Повышение защиты сервера
  4. ПО:
    • ОС Debian
    • Nginx
    • Mysql

Решение:

Сначала разберемся из чего же состоит WordPress, какие файлы и папки имеет.

На момент написания статьи актуальной версией был WordPress 4.1.1

Когда мы распаковываем архив, то видим следующую картину:

Папки
  • wp-admin
  • wp-content
  • wp-includes
Файлы php
  • wp-activate.php
  • wp-blog-header.php
  • wp-comments-post.php
  • wp-config.php
  • wp-config-sample.php
  • wp-cron.php
  • wp-links-opml.php
  • wp-load.php
  • wp-login.php
  • wp-mail.php
  • wp-postpass.php
  • wp-settings.php
  • wp-signup.php
  • wp-trackback.php
  • xmlrpc.php

Давайте разберемся за что отвечает каждый из файлов.

/wp-activate.php — страница активации

/wp-login.php — авторизация пользователей

/wp-login.php?action=register — регистрация пользователей

/wp-login.php?action=lostpassword — сброс пароля пользователя

/wp-blog-header.php — В этом файле распарсивается и распознается запрос . Выбираются записи из базы по необходимости и формируется необходимая страница к выводу на основе активной темы. В том числе в этом файле подключается файл с настройками wordpress wp-config.php .

 

Страница активации — wp-activate.php

По умолчанию WordPress условно делит процесс регистрации в Multisite на два шага — заполнение формы на сайте и активация аккаунта при переходе по ссылке отправленной в электронном письме. После того, как вы заполните форму, WordPress отправляет письмо с небольшой инструкцией и ссылкой для активации аккаунта.

 

Список всех используемых хуков в 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

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

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

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