Intereting Posts
шаблон продукта woocommerce дополнительно настраиваемое поле под описанием продукта Bake-in TinyMCE Продвинутый в тему? Функция is_tax () работает не так, как ожидалось WordPress Ajax Login без перезагрузки страницы Отсутствует сообщение из пользовательского типа сообщения Почему инструменты Google для веб-мастеров говорят, что весь сайт заблокирован файлом robots.txt, когда у меня нет файла robots.txt? Список сообщений CPT, перечисленных в соответствующих пользовательских правилах таксономии, отображает только 10 должностей на срок – как изменить / удалить лимит? Ошибка 404 WordPress Отключить обновление базы данных? сломать мой сайт Multisite – один пользователь разрешил доступ ко всем сайтам? Установка значения сеанса с Ajax не работает Как подключиться к основным сообщениям об ошибках проблема с медиа-каналом / проблема при подаче файлов в реальном времени как я могу сменить папки для загрузки в% год% /% месяц% /% день%? Сортировка сообщений с нескольких сайтов по дате

Как сделать проекты сообщений или сообщений в обзоре доступными через полный url / slug?

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

Я реализовал это решение, представленное здесь: https://wordpress.org/support/topic/problem-filtering-query-to-allow-displaying-drafts-even-for-not-logged-users

Теперь, когда любой пользователь может теперь получить доступ к сообщениям о статьях / ожидающих сообщениях без входа в систему, сообщения доступны только через post_id, например:

http://my-domain.com/?p=1234

Они недоступны через их slug / nice permalink, которые раньше были такими:

http://my-domain.com/2015/12/07/post-with-nice-slug/

Кто-нибудь имеет представление о том, как «включить» постоянные ссылки на проекты сообщений / ожидающих сообщений?

Спасибо!

ОБНОВЛЕНИЕ 20 февраля

Ответ, данный @userabuser, работает как шарм! Поскольку все мои предыдущие / проекты сообщений были ранее опубликованы, мне не нужно было делать трюк для публикации в первую очередь. Я думал, что сам придумал рабочее решение, но: вот код, который я использовал раньше, который не работал (и я не понимаю, почему это так):

function guest_enable_hidden_single_post($query) { if(is_user_logged_in()) return $query; //user is not logged if(!is_single()) return $query; //this is a single post if(!$query->is_main_query())return $query; //this is the main query $query->set('post_status',array('publish', 'pending')); //allowed post statuses for guest return $query; } function guest_reload_hidden_single_post($posts) { global $wp_query, $wpdb; if(is_user_logged_in()) return $posts; //user is not logged if(!is_single()) return $posts; //this is a single post if(!$wp_query->is_main_query()) return $posts; //this is the main query if($wp_query->post_count) return $posts; //no posts were found $posts = $wpdb->get_results($wp_query->request); return $posts; } //allow guests to view single posts even if they have not post_status="publish" add_filter('pre_get_posts', 'guest_enable_hidden_single_post'); //reload hidden posts add_filter('the_posts', 'guest_reload_hidden_single_post'); 

ОБНОВЛЕНИЕ 22 февраля

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

 function preview_draft_posts($query) { if(is_user_logged_in()) return $query; // user is not logged if(is_admin()) return $query; // user is not admin if(is_attachment()) return $query; // is not an attachment if(get_query_var('suppress_filters')) return $query; // no suppressed filters if(!is_single()) return $query; // query for a single post if(!$query->is_main_query()) return $query; // this is the main query $query->set('post_status', array('publish', 'pending')); return $query; } add_filter('pre_get_posts', 'preview_draft_posts'); 

Теперь ожидающие сообщения отображаются всем, а частные сообщения все еще видны только администраторам 😉

Solutions Collecting From Web of "Как сделать проекты сообщений или сообщений в обзоре доступными через полный url / slug?"

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

Вам нужно знать два соображения:

Рассмотрение 1:

Если вы добавите новое сообщение и сохраните его с помощью post_status проекта в первую очередь, сообщение не будет иметь slug в поле *_posts таблице базы данных *_posts пока вы не опубликуете хотя бы один раз .

Рассмотрение 2:

Если вы добавите новое сообщение, сохраните его с помощью post_status черновика или просто пропустите черновик и сразу опубликуйте его, а затем верните пост в проект post_status , после чего сообщение будет вставлено в столбце post_name столбце post_name таблицу *_posts .

Почему это важно:

  • В отношении рассмотрения 1 …

WordPress опирается, по крайней мере, на один идентифицирующий маркер, обычно на id или на post_name что является уникальным для получения сообщения.

Вы заметите, что когда вы создаете черновик сообщения и пытаетесь его просмотреть, WordPress переносит вас на URL-адрес предварительного просмотра, похожий на:

http://example.com/?p=123&preview=true

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

  • В отношении рассмотрения 2 …

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

Пример кода:

Следующий код позволит вам возвращать сообщения в черновом или ожидающем статусе с помощью пули, пока публикация публикации была опубликована хотя бы один раз раньше (см. Рассмотрение 2).

 function preview_draft_posts($query) { if ( is_admin() || get_query_var('suppress_filters') ) return $query; $query->set('post_status', array('publish', 'pending', 'draft')); return $query; } add_filter('pre_get_posts', 'preview_draft_posts'); 

Вышеупомянутое будет работать для зарегистрированных пользователей и пользователей.

Что произойдет, если вы вышли из системы и хотите просмотреть черновик?

Хорошо, поэтому, если дрифт не был опубликован, по крайней мере, один раз раньше, единственный способ просмотреть сообщение – использовать следующий формат:

http://example.com/?p=123

WordPress зависит от этого формата, чтобы найти сообщение, в котором у него нет пули.

Если вы вышли из системы, хотя вы не сможете увидеть это сообщение, несмотря на логику pre_get_posts мы использовали в приведенном выше примере.

Вместо этого вам нужно подключиться к фильтру the_posts и добавить обратно сообщение к результатам, которые вы хотите просмотреть, поскольку WP_Query исключает черновики сообщений из набора результатов для выведенных из системы пользователей, потому что WP_Query из системы пользователи не имеют надлежащих возможностей пользователя.

Если, с другой стороны, вы пытаетесь (хотя и вышли из системы) получить доступ к сообщению, аналогичному рассмотренному 1, по его URL-адресу предварительного просмотра по умолчанию, как указано выше в примере http://example.com/?p=123&preview=true (с или без preview=true ), то вам будет отправлено уведомление о 404 страницах Not Found.

Следующие примеры средств защиты:

 function the_posts_preview_draft_posts($posts, $wp_query) { //abort if $posts is not empty, this query ain't for us... if ( count($posts) ) { return $posts; } $p = get_query_var('p'); //get our post instead and return it as the result... if ( !empty($p) ) { return array(get_post($p)); } } add_filter('the_posts', 'the_posts_preview_draft_posts', 10, 2); 

Отлично … но держитесь, это все еще отстойно, потому что вам нужно использовать формат URL, например http://example.com/?p=123 чтобы получить доступ к сообщению.

Вернемся к основной проблеме, изложенной в соображении 1 , единственные решения, о которых я могу думать, следующие:

Решение №1

  • сохранить черновик сообщения и найти сообщение по его названию, превратив слизь в заголовок.

Пример…

 function the_posts_preview_draft_posts($posts, $wp_query) { //abort if $posts is not empty, this query ain't for us... if ( count($posts) ) { return $posts; } $id = get_query_var('p'); $name = get_query_var('name'); //this is a bit of a bad idea... if ( empty($id) && !empty($name) ) { $name = preg_replace('/\W/', ' ', $name); global $wpdb; $id = $wpdb->get_var( " SELECT ID FROM $wpdb->posts WHERE UPPER(post_title) LIKE UPPER('".$name."') LIMIT 1" ); } //get our post instead and return it as the result... if ( !empty($id) ) { return array(get_post($id)); } } add_filter('the_posts', 'the_posts_preview_draft_posts', 10, 2); 

Вышеуказанное … ↑ … это плохая идея, а всего лишь пример длины, в которую вы должны пойти. Почему это плохая идея проста, вам нужно убедиться, что у вас нет дубликатов заголовков в базе данных, и вам нужно убедиться, что вы не изменяете пул так, чтобы он отличался от названия, когда вы сохраняете его как черновик ,

Чрезмерная проблема, как вы можете видеть.

Решение №2

Вероятно, лучшим способом справиться с этим было бы установить публикацию post_status публикации, чтобы столбец post_name получил значение slug, а затем сразу же отправил сообщение в статус проекта .

Выполнение этого вручную сосало бы вот так вот код:

 function allow_draft_public_preview( ) { global $post; if ( !empty($post->post_name) ) return; $html =<<<DOC <div class="misc-pub-section"> <label> <input type="checkbox" id="_allow_public_preview" name="_allow_public_preview" value="1" /> Allow public preview </label> </div> DOC; echo $html; } add_action('post_submitbox_misc_actions', 'allow_draft_public_preview'); function update_post_status( $post_id, $post, $update ) { if ( !empty($_POST['_allow_public_preview']) ) { //un-hook to prevent infinite loop remove_action( 'save_post', 'update_post_status', 13, 2 ); //set the post to publish so it gets the slug is saved to post_name wp_update_post( array( 'ID' => $post_id, 'post_status' => 'publish' ) ); //immediately put it back to draft status wp_update_post( array( 'ID' => $post_id, 'post_status' => 'draft' ) ); //re-hool add_action( 'save_post', 'update_post_status', 13, 2 ); } } add_action('save_post', 'update_post_status', 13, 2); 

Первый обратный вызов, прикрепленный к действию post_submitbox_misc_actions добавляет флажок в экран редактирования сообщения «Разрешить публичный просмотр» …

введите описание изображения здесь

… когда вы отмечаете этот флажок, он будет распознаваться вторым обратным save_post действием save_post .

В действии save_post мы проверяем наличие нашего флажка в save_post $_POST и если он присутствует, мы устанавливаем статус публикации для публикации, а затем сразу же возвращаем его в черновик .

Теперь вы можете получить доступ к сообщениям о проекте, войти в систему или выйти из системы, своими пулями / хорошими постоянными ссылками.

Все вместе сейчас:

 function preview_draft_posts($query) { if ( is_admin() || get_query_var('suppress_filters') ) return $query; $query->set('post_status', array('publish', 'pending', 'draft')); return $query; } add_filter('pre_get_posts', 'preview_draft_posts'); function the_posts_preview_draft_posts($posts, $wp_query) { //abort if $posts is not empty, this query ain't for us... if ( count($posts) ) { return $posts; } $p = get_query_var('p'); //get our post instead and return it as the result... if ( !empty($p) ) { return array(get_post($p)); } } add_filter('the_posts', 'the_posts_preview_draft_posts', 10, 2); function allow_draft_public_preview( ) { global $post; if ( !empty($post->post_name) ) return; $html =<<<DOC <div class="misc-pub-section"> <label> <input type="checkbox" id="_allow_public_preview" name="_allow_public_preview" value="1" /> Allow public preview </label> </div> DOC; echo $html; } add_action('post_submitbox_misc_actions', 'allow_draft_public_preview'); function update_post_status( $post_id, $post, $update ) { if ( !empty($_POST['_allow_public_preview']) ) { //un-hook to prevent infinite loop remove_action( 'save_post', 'update_post_status', 13, 2 ); //set the post to publish so it gets the slug is saved to post_name wp_update_post( array( 'ID' => $post_id, 'post_status' => 'publish' ) ); //immediately put it back to draft status wp_update_post( array( 'ID' => $post_id, 'post_status' => 'draft' ) ); //re-hool add_action( 'save_post', 'update_post_status', 13, 2 ); } } add_action('save_post', 'update_post_status', 13, 2);