Включить черновики во внутренний диалог ссылок
Хорошо, итак, я делаю новый проект, и мы собираемся использовать Wordpress в качестве CMS для журналов. В некоторых случаях у нас будет группа статей по какой-либо теме, и будет естественно переходить от одной статьи к другой. Итак, вот мы в финальной правке в WP.
Мы хотим добавить ссылку из одного проекта статьи в другой проект статьи в кластере, но целевая статья не была опубликована, поэтому WP не показывает ее в поле Link to Existing Content
. Конечно, я могу получить короткую ссылку на черновик статьи, на которую я хочу сослаться, но затем мне нужно открыть эту вкладку, получить короткую ссылку (или фрагмент черновика), вернуться к сообщению, с которого я хочу перейти, добавить ссылку. Делать это время от времени нормально, но как постоянная задача это дерьмовый рабочий процесс.
Теперь мы можем просто опубликовать, а затем поспешно просмотреть статьи и связать их, но это неоптимально. Я не могу представить, чтобы все журналы и другие сайты, которые публикуют периодические издания с WP, делали это. Я буду играть с Отредактируйте поток, чтобы узнать, есть ли у него способ справиться с этим, но знает ли кто-нибудь способ связать один черновик с другим и сделать ссылку правильной, когда они оба будут опубликованы?
И да, я знаю, что смогу связать вещи после публикации. См. раздел "дерьмовый рабочий процесс".
1 answers
Это очень похоже на этот вопрос.
Нам нужно подключиться к check_ajax_referer
, чтобы обратиться только к функции внутренней связи. Затем мы регистрируем действие для pre_get_posts
, чтобы расширить поиск на черновики и ожидающие публикации.
Мы все равно не получим красивых постоянных ссылок, потому что они исключены в get_permalink
. Поэтому мы также регистрируем фильтр для этого и снова запрашиваем у WordPress постоянную ссылку, но с поддельным статусом публикации.
Как код:
add_action( 'check_ajax_referer', 'internal_links_for_drafts' );
/**
* Extend search for internal links to 'draft' and 'pending' statuses.
*
* @wp-hook check_ajax_referer
* @wp-hook pre_get_posts
* @param string|WP_Query $var
* @return boolean|void
*/
function internal_links_for_drafts( $var )
{
if ( 'check_ajax_referer' === current_filter() && 'internal-linking' === $var )
return add_action( 'pre_get_posts', __FUNCTION__ );
// now we are in the 'pre_get_posts' action.
$var->set( 'post_status', array( 'publish', 'pending', 'draft' ) );
remove_action( 'pre_get_posts', __FUNCTION__ );
add_filter( 'post_link', 'draft_permalink', 10, 2 );
}
/**
* Get permalink for drafts and pending posts.
*
* Dangerous, because their title can still change.
*
* @param string $permalink
* @param object $post
* @return string
*/
function draft_permalink( $permalink, $post )
{
remove_filter( current_filter(), __FUNCTION__ );
// swap status temporary
$original_status = $post->post_status;
$post->post_status = 'publish';
$url = get_permalink( $post );
$post->post_status = $original_status;
return $url;
}