Làm cách nào để thêm danh mục vào: 'wp-admin / post-new.php'?


9

Tôi muốn có một liên kết để tạo một bài đăng mới cũng thiết lập danh mục.

Tôi đã thử wp-admin/post-new.php?post_category=12wp-admin/post-new.php?cat=12, nhưng không làm việc. Tôi cũng đã thử sử dụng tên chứ không phải id của danh mục; Điều này cũng không có ảnh hưởng.

Làm cách nào để tạo liên kết đến bài đăng mới với danh mục mặc định?

Câu trả lời:


4

Dave James Miller tại GitHub đóng đinh cái này cho tôi. Không có tác phẩm nào là của tôi, tôi chỉ đăng mã của anh ấy được bọc vào một chiếc máy tính vì nó hoạt động hoàn hảo như quảng cáo:

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

Sử dụng phương pháp trên hoạt động rất tốt, tuy nhiên, sẽ xuất hiện các quy tắc trường tùy chỉnh nâng cao (một trình cắm phổ biến khác) dựa trên danh mục bài đăng, không tải chính xác (tức là các trường tùy chỉnh cho danh mục đó không tải). Có ai đã tìm ra một cách giải quyết cho điều này?
Aerald 5/11/2015

9

Kết nối wp_insert_post, kiểm tra trạng thái bài đăng auto-draftvà URL cho một GETtham số.

Nhưng trước tiên chúng ta cần một hàm trợ giúp để lấy và vệ sinh GETtham số:

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

Bây giờ trình xử lý dự thảo tự động:

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

Điều này chỉ hoạt động nếu get_default_post_to_edit()được gọi với tham số thứ hai $create_in_dbđược đặt thành TRUE. Để bắt trường hợp khác, bạn phải lọc tùy chọn default_category:

add_filter( 'pre_option_default_category', 't5_get_default_cat_by_url' );

Bây giờ bạn có thể sử dụng tham số post_catđể truyền danh sách sên danh mục được phân tách bằng dấu phẩy:

nhập mô tả hình ảnh ở đây

Xem thêm:


Tôi đã thử giải pháp này bằng cách dán mã vào tệp tin.php. Nó không hoạt động. Tui bỏ lỡ điều gì vậy? Tôi có cần phải làm nhiều hơn như gọi hàm để làm cho nó thực hiện công việc?
Jamie

@Jamie Không làm việc quá mơ hồ. :)
fuxia

Tôi nghĩ bằng cách thêm mã vào hàm.php, khi tôi đánh dấu một danh mục, nó sẽ thêm tham số đó vào cuối chuỗi như trong ảnh trên. Tôi đang cố gắng thêm một metabox vào một danh mục cụ thể. Sau đó, tôi sẽ sử dụng $ _GET để kiểm tra xem tôi có thuộc danh mục chính xác để tải metabox không. Khi tôi thử mã và cố gắng sao chép những gì trong ảnh của bạn ở trên, không có gì xảy ra. Tất cả tôi nhận được là wp-admin / post-new.php. Tôi đang cố gắng để có được wp-admin / post-new.php? Post_cat = audio
Jamie

@Jamie Mã này hoạt động theo cách khác: Bạn xây dựng liên kết theo cách thủ công (ví dụ để gửi nó cho ai đó trên mỗi email) và mã sẽ đặt danh mục phù hợp. Nó không tạo ra bất kỳ liên kết.
fuxia

1

Tôi nghĩ bạn có thể đi về tùy chọn mặc định default_categoryvà lọc option_default_categorycái này, nếu url có thông số cho danh mục, như nguồn ví dụ này. Sử dụng nó như plugin, kiểm tra nó. Đã viết từ đầu và không được kiểm tra.

Thông số url là post_catvà bạn có thể đặt danh mục, như url này: /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' ) );

0

Tôi nhận ra điều này đã được trả lời, nhưng tôi muốn thêm vào của riêng tôi. Tôi đã thêm nó vào một ý chính ở đây https://gist.github.com/malcalevak/ba05b4fbed0c6e33ac8c18c1451bd857

Tuy nhiên, để tiết kiệm cho bạn những rắc rối, đây là mã:

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

Tương tự như tất cả những cái khác, bạn sẽ kích hoạt nó thông qua /wp-admin/post-new.php?carget=cargetname

FYI, nếu bạn đang sử dụng Trường tùy chỉnh nâng cao, như @A túi, điều này SILL hoạt động.


Điều này hoạt động nếu nó là một bài viết đơn giản. Nếu có một tham số post_type, nó không hoạt động. Làm cách nào tôi có thể sửa lỗi này để nhận ra wp-admin / post-new.php? Post_type = wpdmpro? Category = myc Category
yurividal

@yurividal thật không may, hiện tại tôi không có môi trường được thiết lập, bất kỳ bộ nhớ nào của tôi đều mơ hồ, nhưng hãy xem nhanh mã Trình quản lý tải xuống của WordPress có vẻ như vấn đề có thể là do sử dụng Phân loại tùy chỉnh "trông" Phân loại phân loại tích hợp, nhưng không.
Malcalevak

@yurividal không có nghĩa là kết thúc bình luận. Bạn có thể cần điều chỉnh hàm get_carget_by_slug với một hàm để get_term_by và sau đó điều chỉnh wp_set_post_terms để đặt Phân loại wpdmc Category tùy chỉnh.
Malcalevak

Ồ, nghe có vẻ hơi phức tạp và tôi không nghĩ mình có đủ kỹ năng php cho việc đó. Dù sao, cảm ơn sự giúp đỡ của bạn, tôi sẽ cố gắng tìm hiểu sâu hơn về điều đó.
yurividal

@yurividal Tôi không nghĩ nó sẽ phức tạp như vậy , nhưng tôi chắc chắn có thể thấy nó gây khó khăn cho những người ít khởi xướng với PHP và / hoặc WordPress. Nếu tôi có thể tìm thời gian rảnh rỗi, tôi sẽ cố gắng ném một cái gì đó cùng nhau, mối quan tâm duy nhất của tôi là hiện tại tôi không thể kiểm tra nó, điều này sẽ khiến việc chẩn đoán các vấn đề hơi ... phức tạp.
Malcalevak
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.