Отобразить ссылку редактирования, если автор поста - текущий пользователь

9 февр. 2013 г., 17:42:59
Просмотры: 21.8K
Голосов: 4

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

например

если testuser авторизован и текущая страница /author/testuser, он может видеть ссылки редактирования постов

но

если testuser авторизован и текущая страница /author/theee, он не может видеть ссылки

сейчас у меня есть

$curauth = (isset($_GET['author_name'])) ? get_user_by('slug', $author_name) : get_userdata(intval($author));
$th = $curauth->nickname; 
$cu = $current_user->user_login;
if ( $th = $curauth ) {
  edit_post_link('edit', '', ''); 
} else {

}

но по-прежнему только администраторы могут видеть ссылки.

5
Комментарии

Извините, но "вошедший в систему" пользователь всегда будет "текущим пользователем". Это сбивает с толку. В Codex указано (выделено мной): "Отображает ссылку для редактирования текущей записи, если пользователь вошел в систему и имеет право редактировать запись." Это подразумевает, что ваши пользователи не могут редактировать записи в вопросе, или они не вошли в систему. (А если они не вошли в систему, WordPress не может определить, могут ли они редактировать запись или нет.)

s_ha_dum s_ha_dum
9 февр. 2013 г. 17:47:15

Я пытаюсь сказать, что когда вошедший в систему пользователь просматривает страницу автора другого человека, он не должен видеть ссылку на редактирование, но когда он просматривает свою собственную страницу автора, он должен её видеть.

Emre Caglar Emre Caglar
9 февр. 2013 г. 17:51:33

О... Я бы до этого не догадался. Пожалуйста, отредактируйте ваш вопрос. У меня есть решение для вас, если никто не опередит меня.

s_ha_dum s_ha_dum
9 февр. 2013 г. 18:14:18

В модели Ролей и Возможностей WordPress, Редакторы могут редактировать записи других пользователей, тогда как Авторы могут редактировать только свои собственные. Не могли бы вы просто сделать пользователей в вопросе Авторами, а затем использовать edit_post_link()? Тогда всё будет работать как ожидается, для всех пользователей, на любом уровне (Автор, Редактор, Администратор и т.д.).

Pat J Pat J
20 мар. 2013 г. 01:26:15

Я действительно понял это (как видно в одном из моих комментариев ниже), и теперь это работает :) спасибо

Emre Caglar Emre Caglar
20 мар. 2013 г. 13:38:50
Все ответы на вопрос 4
0

Если вам нужно изменить только страницу author.php, этот фрагмент кода, скорее всего, подойдет:

<?php 

if( is_user_logged_in() && is_author(get_current_user_id()) ) {

    edit_post_link('редактировать', '', '');

}

?>

Первая часть условия проверяет, авторизован ли пользователь. Вторая часть будет истинной, если текущая страница является страницей автора текущего пользователя.

6 дек. 2013 г. 14:34:44
0

Я думаю, что ссылка на редактирование записи должна быть видна автору записи и модератору (пользователю с ролью редактора или тем, у кого есть соответствующая возможность).

Поэтому мой предлагаемый код выглядит так:

global $post;
$current_user = wp_get_current_user();

if(current_user_can( 'edit_others_posts', $post->ID ) && ($post->post_author == $current_user->ID))  { 

    //показать ссылку на редактирование    
}
27 февр. 2014 г. 14:14:48
4

Размещенный в файле functions.php вашей темы, этот код должен глобально изменить поведение функции edit_post_link. Он будет работать на всех архивах, не только на архивах авторов — везде, где используется edit_post_link.

function limit_edit_Link_wpse_85214($link) {
  global $post,$current_user;
  get_currentuserinfo();
  if ($post->post_author == $current_user->ID) {
    return $link;
  }
  return false;
}
add_filter('get_edit_post_link','limit_edit_Link_wpse_85214');

Код будет работать надежно только внутри цикла (Loop), что, в принципе, является единственным местом, где следует использовать edit_post_link.

Если вы хотите, чтобы это работало только на страницах архивов авторов, просто вставьте этот код перед циклом в шаблоне author.php и не размещайте его в function.php. В этом случае изменения затронут только эту страницу. Или вы можете использовать основную логику функции для создания своего условия, как вы уже пытались сделать.

9 февр. 2013 г. 18:23:03
Комментарии

Я попытался разместить функцию на странице page.php, но она не работала правильно. Однако, когда я вставил тот же код в author.php, который находится в цикле, для второго поля я получаю ошибку: Fatal error: Cannot redeclare limit_edit_Link_wpse_85214() (ранее объявлена в... Я думаю, мне нужно немного изменить код этой функции, но у меня не получилось. Как я могу это исправить, сэр?

Emre Caglar Emre Caglar
16 февр. 2013 г. 12:23:52

http://wordpress.org/support/topic/comparing-the-post-author-id-and-logged-in-user-id Я нашел это полезным, но похоже, что edit_post_link не работает с этим кодом. Он выводит текст, но не ссылку. ред.: А, понятно. Пользователи должны иметь как минимум права автора. Глупые ошибки :) Спасибо

Emre Caglar Emre Caglar
16 февр. 2013 г. 13:07:38

Невозможно переобъявить функцию. Это основы PHP. Если вы скопировали этот код в два разных файла, у вас будут проблемы. Этот код показывает ссылку "Редактировать", если текущий пользователь является автором записи, что означает, что только автор может видеть ссылку в архиве автора, плюс это работает и для любых других архивов. Я тестировал это, когда писал код, и проверил снова только что. При каких условиях это не работает?

s_ha_dum s_ha_dum
16 февр. 2013 г. 16:47:39

Я использовал код с http://wordpress.org/support/topic/comparing-the-post-author-id-and-logged-in-user-id. Возможно, мой первый и ваш код даже правильные, потому что у меня была проблема с ролью пользователя (изменил с подписчика на автора). Сейчас я пытаюсь позволить им редактировать свои записи через фронтенд, как объяснено здесь: http://wp.tutsplus.com/tutorials/creative-coding/posting-via-the-front-end-editing-and-deleting/, но возникли некоторые проблемы...

Emre Caglar Emre Caglar
16 февр. 2013 г. 17:27:27
0

Мне не удалось заставить работать решение от @Mat. Хотя оно выглядит правильным.

WordPress сохраняет значение $post->post_author как строку. Однако get_the_author_meta( 'ID' ) и get_current_user_id() возвращают целое число, поэтому строгое сравнение работает во второй части оператора IF.

Если вы замените get_the_author_meta( 'ID' ) на $post->post_author, вы должны использовать ==, а не === в качестве оператора сравнения, потому что значение $post->post_author является строкой, а get_current_user_id() возвращает целое число.

Тест:

<?php echo 'Тип ID автора: ' . gettype( get_the_author_meta( 'ID' ) ) . '<br>'; ?>
<?php echo 'Тип ID текущего пользователя: ' . gettype( get_current_user_id() ); ?>
<?php 
    echo 'Является ли авторизованный пользователь автором? '; 
    if ( get_the_author_meta( 'ID' ) == get_current_user_id() ) {
         echo 'ДА  <br>'; 
    } else {
        echo 'НЕТ'; 
    }
?>

Решение с использованием строгого оператора сравнения, которое работает у меня:

<?php if ( is_user_logged_in() && get_the_author_meta( 'ID' ) === get_current_user_id() ) : ?> 

  //...

<?php endif; ?>  
16 июл. 2019 г. 19:09:17