Как удалять посты, не заходя в админку

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

Ссылка для редактирования поста или страницы появляется у вас и так автоматически. Давайте сделаем рядом с ней еще одну ссылку, кликнув по которой, вы отправите пост в корзину.

Откройте файл functions.php и вставьте в него такой код:

function wp_delete_post_link($link = 'Delete This', $before = '', $after = '')
{
	global $post;
	if ( $post->post_type == 'page' ) {
		if ( !current_user_can( 'edit_page', $post->ID ) )
			return;
	} else {
		if ( !current_user_can( 'edit_post', $post->ID ) )
			return;
	}
	$link = "<a>ID, 'delete-post_' . $post->ID) . "'>".$link."</a>";
	echo $before . $link . $after;
}

Этот код создает функцию, которая выводит ссылку на удаление. Ссылка эта доступна только тем, кто наделен соответствующими правами — то есть по умолчанию только администратору блога. Теперь осталось вывести эту ссылку в нужном месте. Для этого нужно вставить в single.php или а page.php, в цикл, где выводится содержимое, такой код:

<?php wp_delete_post_link('Удалить', '<p>', '</p>'); ?>

Обратите внимание, что в качестве аргументов функции выступают название ссылки и разметка HTML до и после этой ссылки. Пользуйтесь!

tiaurus

Автор n-wp.ru — блога о WordPress для новичков.

Оцените автора
Добавить комментарий

  1. Grawl

    Классно. Как-раз начинаю понимать PHP, вот и примеры жизненные находятся ^_^

    Ответить
  2. Sergey Biryukov

    Начиная с версии 2.9, можно также воспользоваться встроенной функцией

    get_delete_post_link()

    . В этом случае достаточно добавить подобный фрагмент внутри основного цикла:

    <?php if ( current_user_can('delete_post', get_the_id() ) ) : ?>
    " onclick="return confirm('Вы уверены?')">Удалить запись
    <?php endif; ?>
    
    Ответить
    1. Спасибо за подсказку!

      Ответить
  3. borodaaaa

    вы хоть сами пользуетесь этими функциями? в курсе что после удаления таким способом идет переход на несуществующую страницу

    Ответить
    1. Sergey Biryukov

      Я удалял с главной, поэтому ошибка проявилась не сразу. Чтобы после удаления происходил переход на главную страницу, можно добавить фрагмент в functions.php активной темы:

      function redirect_after_deleting_a_post($location) {
      	if ( isset($_GET['action']) && $_GET['action'] == 'trash' ) {
      		if ( strpos($location, 'wp-admin') === false )
      			$location = get_option('siteurl');
      	}
      	return $location;
      }
      add_filter('wp_redirect', 'redirect_after_deleting_a_post');
      
      Ответить
    2. tiaurus

      Да, в курсе. Мне кажется, что так оно и лучше — движок как бы дает знать, что такой страницы уже действительно не существует — на то она и 404 страница.
      Если удалять с главной страницы или из архива, то переход идет на существующую страницу.
      Ваш метод

      <?php if ( isset($_GET['trashed']) && (int) $_GET['trashed'] ) {
       wp_redirect(get_option('siteurl') . '/');
       }?>
      

      и тот, кторый предложил Сергей Бирюков для вставки в functions.php

      function redirect_after_deleting_a_post($location) {
      if ( isset($_GET['action']) && $_GET['action'] == 'trash' ) {
      if ( strpos($location, 'wp-admin') === false )
      $location = get_option('siteurl');
      }
      return $location;
      }
      add_filter('wp_redirect', 'redirect_after_deleting_a_post');
      

      — оба дают одинаковый результат и работают правильно. Спасибо!

      Ответить
  4. MrMephistofel

    Замечательный сайт, нашел здесь ответ на вопрос который нигде не мог найти. Огромное спасибо!
    Маленький вопрос по теме, после удаления поста редирект ведет на главную сайта, а можно ли сделать чтоб перенаправляло на страницу на которой был..?
    И после вставки кода

    function redirect_after_deleting_a_post($location) {
     if ( isset($_GET['action']) && $_GET['action'] == 'trash' ) {
     if ( strpos($location, 'wp-admin') === false )
     $location = get_option('siteurl');
     }
     return $location;
     }
     add_filter('wp_redirect', 'redirect_after_deleting_a_post');

    в functions.php появилась ошибочка, после замены

    &&

    на

    &&

    все пришло в норму.

    Ответить
    1. после удаления поста редирект ведет на главную сайта, а можно ли сделать чтоб перенаправляло на страницу на которой был..?

      Так а как переправить на страницу, которую вы только что удалили?

      Ответить
  5. MrMephistofel

    если удалена страница на которой был — понятно… а если нахожусь на 12 странице на которой анонсы статей… удаляю статью и перекидывает на 1 страницу, а нужно чтоб снова на 12…

    Ответить
  6. MrMephistofel

    пример с моим сайтом…
    я хочу удалить статью анонс которой находится на второй странице http://news-info.net/?paged=2
    после удаления меня перенаправит на http://news-info.net/, можно ли сделать чтоб в данном случае перенаправило снова на http://news-info.net/?paged=2…?
    Обратите внимание, что речь идет не о странице полной статьи…

    Ответить
    1. Не знаю, будет ли работать… можно попробовать встроить редирект в функцию:

      function wp_delete_post_link($link = 'Delete This', $before = '', $after = '')
      {
          global $post;
          if ( $post->post_type == 'page' ) {
              if ( !current_user_can( 'edit_page', $post->ID ) )
                  return;
          } else {
              if ( !current_user_can( 'edit_post', $post->ID ) )
                  return;
          }
          $link = "ID, 'delete-post_' . $post->ID) . "?redirect_to=' . urlencode(get_permalink()).'>".$link."";
          echo $before . $link . $after;
      }
      
      Ответить
  7. MrMephistofel

    не получается, да и ладно и так нормальный вариант, спасибо за оказаную помощь =)

    Ответить
  8. MrMephistofel

    вопрос не по теме, как добавить на страницу код типа яваскрипт так чтоб он отображался в виде простого текста, а не выполнялся?

    Ответить
  9. MrMephistofel

    всмысле создаю страницу через админку и пишу текст страницы, в котором надо написать код <script type="text……… и никак не могу это воплотить так как скрипт выполняется…

    Ответить
    1. Ответить
      1. MrMephistofel

        спасибо огромное! =)

        Ответить