Как перенести посты в произвольный тип записи?

Вопрос:

Добрый день!
В категории «Х» есть записи. Я создал произвольный тип записи для них..
Вопрос: Как массово перенести записи с категории «Х» в произвольный тип записей?

Решение:

Логика:

  1. Получаем список постов в указанной категории
  2. циклом изменяем тип этих постов

Код:

<?php
	$my_posts = new WP_Query;
	$myposts = $my_posts->query( array( //Получаем записи
		'post_type' => 'post', // Указываем исходный тип записи
		'cat' => 4 // Указываем id категории из которой будем брать записи для преобразования.
	) );
	foreach( $myposts as $pst ){ //Цикл для изменения типа постов
		set_post_type( $pst->ID, 'page'  ); // Указываем нужный тип поста вместо "page"
	}
?>

FAQ

Вопрос: где эту функцию нужно писать? оформить функцией в functions.php и откуда-то вызвать? или просто выполнить ее в одном из шаблонов?

Ответ: я бы посоветовал вышеуказанную функцию вставить  в отдельный файл и запускать когда, когда это надо.

Файл поместить в корень сайта, в файл записать

<?php
	// подгружаем среду WP  
	require($_SERVER['DOCUMENT_ROOT'].'/wp-load.php');
// дальше любой код
?>

 

Как определить, что в посте есть тег «ещё»?

Создавая один из проектов понадобилось выводить посты по разному, в зависимости от того, есть ли в посте тег «ещё» или «more» на английском.

Оказалось, что сделать это достаточно просто (далее…)

Разрешаем загружать только определенные типы файлов в WordPress

Оказалось, что разрешить загружать только определенные типы файлов очень легко:

add_filter('upload_mimes','restrict_mime');
function restrict_mime($mimes) {
$mimes = array(
                'jpg|jpeg|jpe' => 'image/jpeg',
                'gif' => 'image/gif',
);
return $mimes;
}

 

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

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

jQuery FullCalendar.js: отключить кнопки предыдущий\следующий для прошлых\будущих дат

В одном из проектов я использую плагин jQuery FullCalendar.js

У меня возникла необходимость запретить открытие будущих месяцев(этого требовал проект)

Как оказалось, сделать это легко:

$('#calendar').fullCalendar({
 	viewRender: function(currentView){
		var minDate = moment(),
		maxDate = moment().add(2,'weeks');
		// Past
		if (minDate >= currentView.start && minDate <= currentView.end) {
			$(".fc-prev-button").prop('disabled', true); 
			$(".fc-prev-button").addClass('fc-state-disabled'); 
		}
		else {
			$(".fc-prev-button").removeClass('fc-state-disabled'); 
			$(".fc-prev-button").prop('disabled', false); 
		}
		// Future
		if (maxDate >= currentView.start && maxDate <= currentView.end) {
			$(".fc-next-button").prop('disabled', true); 
			$(".fc-next-button").addClass('fc-state-disabled'); 
		} else {
			$(".fc-next-button").removeClass('fc-state-disabled'); 
			$(".fc-next-button").prop('disabled', false); 
		}
	}
});

 

Вывести под категории на странице категорий 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;