Отобразить ссылку редактирования, если автор поста - текущий пользователь
Я создаю страницу 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 {
}
но по-прежнему только администраторы могут видеть ссылки.

Если вам нужно изменить только страницу author.php, этот фрагмент кода, скорее всего, подойдет:
<?php
if( is_user_logged_in() && is_author(get_current_user_id()) ) {
edit_post_link('редактировать', '', '');
}
?>
Первая часть условия проверяет, авторизован ли пользователь. Вторая часть будет истинной, если текущая страница является страницей автора текущего пользователя.

Я думаю, что ссылка на редактирование записи должна быть видна автору записи и модератору (пользователю с ролью редактора или тем, у кого есть соответствующая возможность).
Поэтому мой предлагаемый код выглядит так:
global $post;
$current_user = wp_get_current_user();
if(current_user_can( 'edit_others_posts', $post->ID ) && ($post->post_author == $current_user->ID)) {
//показать ссылку на редактирование
}

Размещенный в файле 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
. В этом случае изменения затронут только эту страницу. Или вы можете использовать основную логику функции для создания своего условия, как вы уже пытались сделать.

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

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

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

Я использовал код с 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/, но возникли некоторые проблемы...

Мне не удалось заставить работать решение от @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; ?>
