Intereting Posts
Как обновить meta сообщения внутри цикла WP_Query или цикла WordPress? Файл дескриптора WordPress – fopen, fwrite не работает с $ .ajax или $ .post JQuery проблема с метаячейкой с фильтром поиска Как я могу подключиться к полю заголовка постредактора, чтобы изменить HTML? Получить сообщение Число с локальным циклом и шаблоном Что не так с этим кодом? Я хочу удалить http: //, который автоматически добавляется в адрес профиля пользователя Как проверить, имеет ли категория родительские и дочерние категории? Возможна ли переделка на страницах? У темы, похоже, есть разные варианты на wordpress.com и установка собственного сервера Word пресса заменяет символы Unicode на «?» S Отправить еженедельную электронную почту, если пользователи не заполнили свои профили Показывать сообщение подтверждения перед активацией подключаемого модуля WP All Import – Выполнить импорт Какой лучший способ защитить паролем магазин Woocommerce?

Как добавить «Прикрепите это сообщение на первую страницу» до конца?

У меня есть сайт, связанный с бейсболом, с несколькими авторами. Я использую «Придерживайтесь этого сообщения на первой странице», чтобы обозначить «Редакторский подбор» в статье. Я хотел бы добавить ссылку / кнопку, чтобы позволить редактору сделать это с передней стороны. Метод может быть либо в самой статье, либо в панели администратора. У меня нет особого предпочтения.

Я просмотрел множество разных плагинов «Admin Bar», но не нашел ничего, что касалось «Stick this post to the front page».

благодаря

Я думаю, что этот небольшой исходный код – ваше решение. В настоящее время у него нет обратной связи с интерфейсом для изменения Sticky Post, но вы можете улучшить эту строку, класс или все, что хотите, в функции fb_stick_post .

Первая функция добавляет элемент в панель администратора и создает новый Url с параметром. Кроме того, on click функция считывает параметр Url и, если это правда, то делайте изменения в липкий статус этого идентификатора сообщения.

 add_action( 'admin_bar_menu', 'fb_add_admin_bar_sticky', 35 ); function fb_add_admin_bar_sticky() { global $wp_admin_bar; if ( ! is_super_admin() || ! is_admin_bar_showing() ) return; $current_object = get_queried_object(); if ( empty($current_object) ) return; if ( ! empty( $current_object->post_type ) && ( $post_type_object = get_post_type_object( $current_object->post_type ) ) && current_user_can( $post_type_object->cap->edit_post, $current_object->ID ) ) { $wp_admin_bar->add_menu( array( 'id' => 'sticky_post', 'title' => __('Sticky'), 'href' => get_permalink() . '?stick_post=true', 'meta' => array( 'title' => __( 'Click me' ), 'onclick' => fb_stick_post( get_the_ID() ) ) ) ); } } function fb_stick_post( $post_id ) { if ( isset($_GET['stick_post']) && 'true' == htmlspecialchars( $_GET['stick_post'] ) ) stick_post( $post_id ); } 

Обновление 30.07.2012

Теперь небольшой плагин с простым решением. Плагин добавляет элемент внутри панели администратора. Строка проверки кнопки является липкой и дает возможность придерживаться или отклеивать текущую запись.

Пример в Twenty Eleven Theme для сообщения, был с липким флагом

Я изменяю крючок, чтобы добавить элемент панели администратора в'template_redirect` для использования перенаправления после обновления флага на столбе.

 <?php /** * Plugin Name: Stick/Unstick post via Admin bar * */ if ( ! function_exists( 'fb_add_admin_bar_sticky' ) ) { add_action( 'template_redirect', 'fb_add_admin_bar_sticky' ); function fb_add_admin_bar_sticky() { global $wp_admin_bar; if ( ! is_super_admin() || ! is_admin_bar_showing() ) return; $current_object = get_queried_object(); if ( empty($current_object) ) return; if ( ! empty( $current_object->post_type ) && ( $post_type_object = get_post_type_object( $current_object->post_type ) ) && current_user_can( $post_type_object->cap->edit_post, $current_object->ID ) ) { // check, if an sticky post if ( is_sticky( get_the_ID() ) ) { $title = __('Unsticky'); $link = '?unstick_post=true'; $attr_title = __( 'Make this post unsticky' ); } else { $title = __('Sticky'); $link = '?stick_post=true'; $attr_title = __( 'Make this post sticky' ); } $wp_admin_bar->add_menu( array( 'id' => 'sticky_post', 'title' => $title, 'href' => get_permalink() . $link, 'meta' => array( 'title' => $attr_title, 'onclick' => fb_stick_post( get_the_ID() ) ) ) ); } } function fb_stick_post( $post_id ) { if ( isset($_GET['stick_post']) && 'true' == htmlspecialchars( $_GET['stick_post'] ) ) { stick_post( $post_id ); wp_redirect( get_permalink( $post_id ) ); exit(); } if ( isset($_GET['unstick_post']) && 'true' == htmlspecialchars( $_GET['unstick_post'] ) ) { unstick_post( $post_id ); wp_redirect( get_permalink( $post_id ) ); exit(); } } } 

или скачать этот плагин Gist 3214922

Здесь есть несколько функций:

  • unstick_postunstick_post сообщение
  • stick_post – Придерживайтесь сообщения
  • is_sticky – выяснить, является ли сообщение липким

Учитывая эти три вопроса, все, что нам нужно сделать, это придерживаться их вместе с некоторым клеем панели меню администратора.

Прежде всего, давайте обернем все в класс для удовольствия и прибыли. Этот класс будет иметь некоторые константы, которые мы будем использовать позже: nonce, действие для отмены публикации и действие для прикрепления сообщения.

 class WPSE_58818_Stick_Post { /** * Ajax nonce. * * @since 1.0 */ const NONCE = 'wpse58818_nonce_'; /** * Unstick ajax action * * @since 1.0 */ const UNSTICK = 'wpse58818_unstick'; /** * Stick Ajax action * * @since 1.0 */ const STICK = 'wpse58818_stick'; } // end class 

Затем добавим функцию init, чтобы добавить наши действия. Первое действие заключается в том, что мы подключаемся к template_redirect.

 <?php class WPSE_58818_Stick_Post { // snip snip /** * Adds actions and such. * * @since 1.0 * @access public * @uses add_action */ public static function init() { add_action( 'template_redirect', array(__CLASS__, 'template_r') ); } } 

ПРИМЕЧАНИЕ: отсюда я буду опускать бит class . Здесь вы можете посмотреть все.

В функции, подключенной к template_redirect , мы проверим, есть ли у нас одна страница, и может ли пользователь ее редактировать. Если они могут, мы подключимся к admin_bar_menu и wp_footer .

 /** * Hooked into `template_redirect`. Adds the admin bar stick/unstick * button if we're on a single post page and the current user can edit * the post * * @since 1.0 * @access public * @uses add_action */ public static function template_r() { if( !is_single() || !current_user_can('edit_post', get_queried_object_id()) ) return; // not a single post or the user can't edit it // Hook into admin_bar_menu to add stuff add_action( 'admin_bar_menu', array(__CLASS__, 'menu'), 100 ); // Hook into the footer and spit out some JavaScript add_action( 'wp_footer', array(__CLASS__, 'footer') ); } 

В функции menu , подключенной к admin_bar_menu , мы можем добавить наш новый элемент:

 /** * Hooked into `admin_bar_menu`. Adds our stick/unstick node. * * @since 1.0 * @access public */ public static function menu($mb) { // get the current post ID $post_id = get_queried_object_id(); $mb->add_node(array( 'id' => 'wpse58818-sticker', 'meta' => array( 'class' => 'wpse58818-sticker', 'title' => is_sticky($post_id) ? 'unstick' : 'stick' ), 'title' => is_sticky($post_id) ? __('Unstick') : __('Stick'), 'href' => self::get_url($post_id) )); } 

Здесь мы получаем нашу первую «служебную функцию», которая создает URL-адрес узла панели меню администратора. Это просто оболочка add_query_arg для nonce и создайте URL-адрес, который мы будем использовать с AJAX позже:

 /** * Get an Ajax URL to use for a given post * * @since 1.0 * @access protected */ protected static function get_url($post_id) { return add_query_arg(array( 'post_id' => absint($post_id), 'action' => is_sticky($post_id) ? self::UNSTICK : self::STICK, 'nonce' => wp_create_nonce(self::NONCE . $post_id) ), admin_url('admin-ajax.php')); } 

Функция footer просто выплевывает какой-то JavaScript для вызова AJAX. Основной обзор: когда кто-то нажимает на нашу новую ссылку, сделайте запрос GET на указанный URL. Если это успешно, измените href, текст и заголовок ссылки (un) stick.

 /** * Hooked into `wp_footer`. Spits out a bit of JS to stick/unstick a post * * @since 1.0 * @access public */ public static function footer() { ?> <script type="text/javascript"> jQuery(document).ready(function($) { $('.wpse58818-sticker a').on('click', function(e) { e.preventDefault(); var action = $(this).attr('title'); var that = this; $.get( $(this).attr('href'), {}, function(data) { if('0' == data) { console.log(data); alert('<?php echo esc_js(__('An error occurred')); ?>'); return; } $(that).attr('href', data); if('stick' == action) { $(that).html('<?php echo esc_js(__('Unstick')); ?>'); $(that).attr('title', 'unstick'); } else { $(that).html('<?php echo esc_js(__('Stick')); ?>'); $(that).attr('title', 'stick'); } } ); }); }); </script> <?php } 

И теперь мы приходим к обратным вызовам AJAX. Ajax в плагинах / темах стоит прочитать.

Мы немного изменим нашу функцию init чтобы добавить еще два действия:

 /** * Adds actions and such. * * @since 1.0 * @access public * @uses add_action */ public static function init() { add_action( 'template_redirect', array(__CLASS__, 'template_r') ); // Ajax actions add_action( 'wp_ajax_' . self::STICK, array(__CLASS__, 'stick') ); add_action( 'wp_ajax_' . self::UNSTICK, array(__CLASS__, 'unstick') ); } 

И наши обратные вызовы AJAX. Это может быть очень легко. Я разделил их здесь, потому что в будущем было легче продлить / изменить. Обе эти проверки проверяют, является ли запрос AJAX действительным, (un) придерживаться сообщения соответствующим образом и вывести новый URL для будущего (un) приклеивания.

 /** * Ajax callback for the stick function * * @since 1.0 * @access public */ public static function stick() { $post_id = self::can_ajax(); stick_post($post_id); echo self::get_url($post_id); die(); } /** * Ajax callback for the unstick function * * @since 1.0 * @access public * @uses unstick_post */ public static function unstick() { $post_id = self::can_ajax(); // nonces checked, everything is good to go. Unstick! unstick_post($post_id); echo self::get_url($post_id); die(); } 

Здесь появляется вторая «функция полезности». can_ajax проверяет наши права пользователя и пользователя и возвращает идентификатор сообщения (un). Если какие-либо проверки не выполняются, он выходит (через die('1') ).

 /** * Check to see if the current user can ajax. Returns the post ID to * stick/unstick if successful. Kills the program otherwise * * @since 1.0 * @access protected */ protected static function can_ajax() { $post_id = isset($_REQUEST['post_id']) ? $_REQUEST['post_id'] : ''; if( !$post_id || !check_ajax_referer(self::NONCE . $post_id, 'nonce', false) ) die('0'); if(!current_user_can('edit_post', $post_id)) die('0'); return $post_id; } 

Вот этот беспорядок как плагин .

Вот гораздо более простое решение, которое выполнит работу с the_content фильтра-фильтра the_content

 add_filter('the_content','simplest_sticky_solution'); function simplest_sticky_solution($content){ global $post; //early exit if not needed if (!is_single() || !current_user_can('edit_post',$post->ID)) return $content; //check if form is submitted and act as needed if (isset($_POST['sticky_action']) && isset($_POST['sticky_id']) && isset($_POST['sticky_nonce']) && wp_verify_nonce($_POST['sticky_nonce'], 'StickIt')){ if (is_sticky($post->ID)){ stick_post($post->ID); }else{ unstick_post($post->ID); } } //create the form $label = (is_sticky())? "Unstick": "Stick"; $form = ' <form action="" method="POST"> <input type="hidden" name="sticky_id" value="'.$post->id.'"> <input type="hidden" name="sticky_action" value="stickit"> <input type="hidden" name="sticky_nonce" value="'.wp_create_nonce('StickIt').'"> <input type="button" name="submit" value="'.$label.'"> </form>'; return $form.'<br/>'.$content; }