Bagaimana cara menambahkan kategori ke: 'wp-admin / post-new.php'?

9

Saya ingin memiliki tautan untuk membuat posting baru yang menetapkan kategori juga.

Saya sudah mencoba wp-admin/post-new.php?post_category=12dan wp-admin/post-new.php?cat=12, tetapi tidak berhasil. Saya juga mencoba menggunakan nama daripada id kategori; yang juga tidak berpengaruh.

Bagaimana cara membuat tautan ke posting baru dengan kategori default?

DI
sumber

Jawaban:

4

Dave James Miller di GitHub memaku yang ini untukku. Tidak ada pekerjaan yang berasal dari saya, saya hanya memposting kodenya yang dibungkus menjadi plguin karena berfungsi dengan baik seperti yang diiklankan:

<?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);
pengguna67014
sumber
Menggunakan metode di atas berfungsi dengan baik, namun akan tampak bahwa bidang khusus lanjutan (plug-in populer lainnya) aturan yang bergantung pada kategori posting, tidak memuat dengan benar (yaitu bidang khusus untuk kategori itu tidak memuat). Adakah yang menemukan solusi untuk ini?
Aphire
9

Hubungkan ke wp_insert_post, uji status posting auto-draft, dan URL untuk GETparameter.

Tetapi pertama-tama kita membutuhkan fungsi pembantu untuk mendapatkan dan membersihkan GETparameter:

/**
 * 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'] ) );
}

Sekarang penangan konsep otomatis:

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' );
}

Ini hanya berfungsi jika get_default_post_to_edit()dipanggil dengan parameter kedua $create_in_dbdiatur ke TRUE. Untuk menangkap kasus lain, Anda harus memfilter opsi default_category:

add_filter( 'pre_option_default_category', 't5_get_default_cat_by_url' );

Sekarang Anda dapat menggunakan parameter post_catuntuk melewati daftar siput kategori yang dipisahkan koma:

masukkan deskripsi gambar di sini

Lihat juga:

fuxia
sumber
Saya mencoba solusi ini dengan menempelkan kode ke file functions.php saya dan tidak berhasil. Apakah saya melewatkan sesuatu? Apakah saya perlu melakukan lebih banyak seperti memanggil fungsi untuk membuatnya melakukan pekerjaan?
Jamie
@Jamie Tidak bekerja terlalu samar. :)
fuxia
Saya pikir dengan menambahkan kode ke functions.php bahwa ketika saya mencentang kategori, itu akan menambahkan parameter itu ke akhir string seperti pada foto di atas. Saya mencoba menambahkan metabox hanya ke kategori tertentu. Maka saya akan menggunakan $ _GET untuk menguji apakah saya dalam kategori yang benar untuk memuat metabox. Ketika saya mencoba kode dan mencoba meniru apa yang ada di foto Anda di atas, tidak ada yang terjadi. Yang saya dapatkan hanyalah wp-admin / post-new.php. Saya mencoba mendapatkan wp-admin / post-new.php? Post_cat = audio
Jamie
@Jamie Kode ini berfungsi sebaliknya: Anda membuat tautan secara manual (misalnya mengirimnya ke seseorang per email), dan kode akan menetapkan kategori yang tepat. Itu tidak membuat tautan apa pun.
fuxia
1

Saya pikir Anda dapat pergi tentang opsi default default_categorydan memfilter option_default_categoryini, jika url memiliki param untuk kategori, seperti contoh sumber ini. Gunakan itu sebagai plugin, ujilah. Apakah menulis dari awal dan tidak diuji.

Param url adalah post_catdan Anda dapat mengatur kategorinya, seperti url ini: /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
sumber
0

Saya menyadari ini sudah dijawab, tetapi saya ingin menambahkan pendapat saya sendiri. Saya telah menambahkannya ke intisari di sini https://gist.github.com/malcalevak/ba05b4fbed0c6e33ac8c18c1451bd857

Untuk menyelamatkan Anda dari kerepotan, berikut ini kodenya:

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 );

Mirip dengan yang lainnya, Anda akan memicu melalui /wp-admin/post-new.php?category=categoryname

FYI, jika Anda menggunakan Bidang Kustom Lanjutan, seperti @Aphire, ini AKAN bekerja.

Malcalevak
sumber
ini berfungsi jika itu adalah posting sederhana. Jika ada parameter post_type, itu tidak berfungsi. Bagaimana saya bisa memperbaikinya untuk mengenali wp-admin / post-new.php? Post_type = wpdmpro? Category = mycategory
yurividal
@yurividal sayangnya, saya tidak memiliki lingkungan yang diatur saat ini, ingatan saya tidak jelas, tetapi melihat sekilas kode WordPress Download Manager sepertinya masalahnya mungkin karena menggunakan Taksonomi khusus yang "terlihat" seperti taksonomi Kategori bawaan, tetapi tidak.
Malcalevak
@Yurividal tidak bermaksud mengakhiri komentar. Anda mungkin perlu menyesuaikan fungsi get_category_by_slug dengan fungsi get_term_by dan kemudian menyesuaikan wp_set_post_terms untuk mengatur taksonomi kustom kategori wpdmcategory.
Malcalevak
Wow, kedengarannya agak rumit dan saya pikir saya tidak memiliki keterampilan php yang cukup untuk itu. Bagaimanapun, terima kasih atas bantuan Anda, saya akan mencoba menggali lebih dalam tentang itu.
yurividal
@yurividal Saya tidak berpikir itu akan menjadi yang rumit, tapi saya pasti bisa melihatnya sebagai menakutkan dengan kurang baik dimulai dengan PHP dan / atau WordPress. Jika saya dapat menemukan waktu luang, saya akan mencoba untuk melemparkan sesuatu bersama, satu-satunya kekhawatiran saya adalah bahwa saya saat ini tidak dapat mengujinya, yang akan membuat masalah diagnosis sedikit ... rumit.
Malcalevak