Включить черновики во внутренний диалог ссылок


Хорошо, итак, я делаю новый проект, и мы собираемся использовать Wordpress в качестве CMS для журналов. В некоторых случаях у нас будет группа статей по какой-либо теме, и будет естественно переходить от одной статьи к другой. Итак, вот мы в финальной правке в WP.
Мы хотим добавить ссылку из одного проекта статьи в другой проект статьи в кластере, но целевая статья не была опубликована, поэтому WP не показывает ее в поле Link to Existing Content. Конечно, я могу получить короткую ссылку на черновик статьи, на которую я хочу сослаться, но затем мне нужно открыть эту вкладку, получить короткую ссылку (или фрагмент черновика), вернуться к сообщению, с которого я хочу перейти, добавить ссылку. Делать это время от времени нормально, но как постоянная задача это дерьмовый рабочий процесс.

Теперь мы можем просто опубликовать, а затем поспешно просмотреть статьи и связать их, но это неоптимально. Я не могу представить, чтобы все журналы и другие сайты, которые публикуют периодические издания с WP, делали это. Я буду играть с Отредактируйте поток, чтобы узнать, есть ли у него способ справиться с этим, но знает ли кто-нибудь способ связать один черновик с другим и сделать ссылку правильной, когда они оба будут опубликованы?

И да, я знаю, что смогу связать вещи после публикации. См. раздел "дерьмовый рабочий процесс".

Author: fuxia, 2013-06-05

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;
}
 1
Author: fuxia, 2017-04-13 12:37:34