Как добавить категорию в: 'wp-admin / post-new.php'?

9

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

Я пробовал wp-admin/post-new.php?post_category=12и wp-admin/post-new.php?cat=12, но ни сработало. Я также попытался использовать имя, а не идентификатор категории; который также не имел никакого влияния.

Как создать ссылку на новый пост с категорией по умолчанию?

В
источник

Ответы:

4

Дэйв Джеймс Миллер из GitHub приколол мне этот. Ни одна из работ не от меня, я просто публикую его код, завернутый в плагин, так как он работает отлично, как рекламируется:

<?php
/**
 * Plugin Name: Set default category from url parameter
 * Plugin URI:  https://gist.github.com/davejamesmiller/1966543
 * Description: enables you to setup new post links with the post_title, category and tags in the url: <code><a href="<?= esc_attr(admin_url('post-new.php?post_title=Default+title&category=category1&tags=tag1,tag2')) ?>">New post</a></code>
 * Version:     0.0.1
 * Author:      davejamesmiller
 * Author URI:  https://gist.github.com/davejamesmiller
 */

// I used this code to automatically set the default post title, category and
// tags for a new WordPress post based on which link was clicked. It could also
// be tweaked to hard-code the values instead of using request parameters.


add_filter('wp_get_object_terms', function($terms, $object_ids, $taxonomies, $args)
{
    if (!$terms && basename($_SERVER['PHP_SELF']) == 'post-new.php') {

        // Category - note: only 1 category is supported currently
        if ($taxonomies == "'category'" && isset($_REQUEST['category'])) {
            $id = get_cat_id($_REQUEST['category']);
            if ($id) {
                return array($id);
            }
        }

        // Tags
        if ($taxonomies == "'post_tag'" && isset($_REQUEST['tags'])) {
            $tags = $_REQUEST['tags'];
            $tags = is_array($tags) ? $tags : explode( ',', trim($tags, " \n\t\r\0\x0B,") );
            $term_ids = array();
            foreach ($tags as $term) {
                if ( !$term_info = term_exists($term, 'post_tag') ) {
                    // Skip if a non-existent term ID is passed.
                    if ( is_int($term) )
                        continue;
                    $term_info = wp_insert_term($term, 'post_tag');
                }
                $term_ids[] = $term_info['term_id'];
            }
            return $term_ids;
        }
    }
    return $terms;
}, 10, 4);
user67014
источник
Использование описанного выше метода прекрасно работает, однако может показаться, что расширенные правила настраиваемых полей (еще один популярный плагин), основанные на категории записей, загружаются некорректно (т.е. не загружаются настраиваемые поля для этой категории). Кто-нибудь нашел обходной путь для этого?
Aphire
9

Подключитесь wp_insert_post, проверьте статус сообщения auto-draftи URL для GETпараметра.

Но сначала нам нужна вспомогательная функция для получения и очистки GETпараметра:

/**
 * Set default category.
 *
 * @wp-hook pre_option_default_category
 * @return  string Category slug
 */
function t5_get_default_cat_by_url()
{
    if ( ! isset( $_GET['post_cat'] ) )
        return FALSE;

    return array_map( 'sanitize_title', explode( ',', $_GET['post_cat'] ) );
}

Теперь обработчик автопроекта:

add_action( 'wp_insert_post', 't5_draft_category', 10, 2 );

/**
 * Add category by URL parameter to auto-drafts.
 *
 * @wp-hook wp_insert_post
 * @param   int $post_ID
 * @param   object $post
 * @return  WP_Error|array An error object or term ID array.
 */
function t5_draft_category( $post_ID, $post )
{
    if ( ! $cat = t5_get_default_cat_by_url()
        or 'auto-draft' !== $post->post_status )
        return;

    // return value will be used in unit tests only.
    return wp_set_object_terms( $post_ID, $cat, 'category' );
}

Это работает, только если get_default_post_to_edit()был вызван со вторым параметром, $create_in_dbустановленным в TRUE. Чтобы поймать другой случай, вы должны отфильтровать опцию default_category:

add_filter( 'pre_option_default_category', 't5_get_default_cat_by_url' );

Теперь вы можете использовать этот параметр post_catдля передачи списка разделенных запятыми категорий слагов:

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

Смотрите также:

Фуксия
источник
Я попробовал это решение, вставив код в файл functions.php, и он не сработал. Я что-то пропустил? Нужно ли мне больше делать вызов функции, чтобы она выполняла свою работу?
Джейми
@ Джейми Не работает слишком расплывчато. :)
fuxia
Я подумал, добавив код в functions.php, что, когда я отмечу категорию, он добавит этот параметр в конец строки, как на фотографии выше. Я пытаюсь добавить метабокс только к определенной категории. Затем я буду использовать $ _GET, чтобы проверить, нахожусь ли я в правильной категории для загрузки метабокса. Когда я попробовал код и попытался повторить то, что на вашей фотографии выше, ничего не произошло. Все, что я получил, было wp-admin / post-new.php. Я пытаюсь получить wp-admin / post-new.php? Post_cat = audio
Джейми
@Jamie Этот код работает наоборот: вы создаете ссылку вручную (например, чтобы отправить ее кому-то по электронной почте), и код устанавливает правильную категорию. Это не создает никакой ссылки.
Фуксия
1

Я думаю, что вы можете перейти к опции по умолчанию default_categoryи отфильтровать option_default_categoryее, если в URL есть параметр для категории, как в примере с исходным кодом. Используйте его как плагин, протестируйте его. Был написан с нуля и не проверен.

Параметр url post_catи вы можете установить категорию, как этот URL: /wp-admin/post-new.php?post_cat=categoryname

<?php
/**
 * Plugin Name: .my Test
 * Plugin URI:  http://bueltge.de/
 * Description: 
 * Version:     0.0.1
 * Author:      Frank B&uuml;ltge
 * Author URI:  http://bueltge.de/
 */
class Set_Default_Cat_From_Url_Param {

    protected static $classobj = NULL;

    public static function init() {

        NULL === self::$classobj and self::$classobj = new self();

        return self::$classobj;
    }

    function __construct() {

        if ( isset( $_GET['post_cat'] ) )
            add_filter( 'option_default_category', array( $this, 'get_category' ) );
    }

    function get_category( $category ) {

        if ( isset( $_GET['post_cat'] ) )
            $category = get_cat_ID( esc_attr( $_GET['post_cat'] ) );

        return $category;
    }

}
add_action( 'load-post-new.php', array( 'Set_Default_Cat_From_Url_Param', 'init' ) );
bueltge
источник
0

Я понимаю, что на это уже ответили, но я хотел добавить свой собственный дубль. Я добавил его в список здесь https://gist.github.com/malcalevak/ba05b4fbed0c6e33ac8c18c1451bd857

Чтобы избавить вас от хлопот, вот код:

function set_category () {

    global $post;
  //Check for a category parameter in our URL, and sanitize it as a string
    $category_slug = filter_input(INPUT_GET, 'category', FILTER_SANITIZE_STRING, array("options" => array("default" => 0)));

  //If we've got a category by that name, set the post terms for it
    if ( $category = get_category_by_slug($category_slug) ) {
        wp_set_post_terms( $post->ID, array($category->term_id), 'category' );
    }

}

//hook it into our post-new.php specific action hook
add_action( 'admin_head-post-new.php', 'set_category', 10, 1 );

Подобно всем остальным, вы бы запустили его через /wp-admin/post-new.php?category=categoryname

К вашему сведению, если вы используете расширенные пользовательские поля, такие как @Aphire, это БУДЕТ работать.

Malcalevak
источник
это работает, если это простой пост. Если есть параметр post_type, он не работает. Как я могу это исправить, чтобы распознать wp-admin / post-new.php? Post_type = wpdmpro? Category = mycategory
yurividal
@yurividal К сожалению, в настоящее время у меня нет настроенной среды, память у меня мутная, но быстрый взгляд на код WordPress Download Manager выглядит так, как будто проблема в том, что он использует собственную таксономию, которая «выглядит» как встроенная категория таксономии, но это не так.
Малкалевак
@yurividal не хотел заканчивать комментарий. Скорее всего, вам нужно настроить функцию get_category_by_slug с помощью функции get_term_by, а затем настроить wp_set_post_terms для установки пользовательской таксономии wpdmcategory.
Малкалевак
Вау, это звучит немного сложно, и я не думаю, что у меня достаточно навыков для этого. В любом случае, спасибо за вашу помощь, я постараюсь углубиться в это.
19
@yurividal Я не думаю , что было бы , что сложно, но я мог определенно видеть , как укрощать к менее инициирована с PHP и / или WordPress. Если я найду свободное время, я постараюсь собрать что-то вместе, моя единственная проблема в том, что я не могу сейчас это проверить, что сделало бы диагностику проблем немного ... сложной.
Малкалевак