仅限“POST”类型的默认精选图片(不包括“页面”)

时间:2017-01-18 14:17:10

标签: php wordpress post codex

您好我正在尝试为post_type ='发布'设置默认的精选图片集,但不包括post_type ='page'。

我在子主题的函数文件中编写了以下代码,但我不断收到此错误:

  

注意:尝试获取非对象的属性   /home/ossettto/public_html/wp-content/themes/sport-child/functions.php   第18行

function wpforce_featured()
{
    global $post;
    $post_type = get_post_type($post->ID);
    if ($post_type === 'post')
    {
        $already_has_thumb = has_post_thumbnail($post->ID); // If post have a featured image use that.
        if (!$already_has_thumb)
        {
            //If post does not have a featured image then get the first post image and set as featured image.
            $attached_image = get_children("post_parent=$post->ID&post_type=attachment&post_mime_type=image&numberposts=1"); // Number 1 relates to taking post image number 1 and adding it as a featured image.
            if ($attached_image)
            {
                foreach ($attached_image as $attachment_id => $attachment)
                {
                    set_post_thumbnail($post->ID, $attachment_id);
                    //$attachment_id = attachment_url_to_postid( $image_url );
                    //echo $attachment_id;
                }
            }
            else
            {
                set_post_thumbnail($post->ID, '27264'); // Find attachment media id by right clicking the image in the Media library and selecting inspect element. Look for the data-id number. This number is then added to the post id.
            }
        }
    }
}

//end function
add_action('the_post', 'wpforce_featured');
add_action('save_post', 'wpforce_featured');
add_action('draft_to_publish', 'wpforce_featured');
add_action('new_to_publish', 'wpforce_featured');
add_action('pending_to_publish', 'wpforce_featured');
add_action('future_to_publish', 'wpforce_featured');

任何帮助将不胜感激 感谢。

1 个答案:

答案 0 :(得分:3)

有两件事情不清楚:

  1. 为什么要在the_postsave_post和其他钩子中共同执行此操作。
  2. 知道哪一行是第18行会很有帮助,但我猜这一行是$post_type = get_post_type( $post->ID );
  3. 但是,您收到通知的原因是这些操作不一定都有$post对象可供您global $post使用。此外,这些操作都具有不同的功能签名,将$post作为参数传递到不同的地方。

    鉴于您要连接的所有过滤器,您需要创建一个"抽象"或"包装"围绕你的函数,以便你可以在$post的正确位置正确调用它。

    查看文档以查看传递$post的示例:

    the_post action - 仅作为参数传递 save_post action - 传递为SECOND参数
    draft_to_published(和其他钩子) - 作为THIRD参数传递

    // New function that accepts proper parameters for save action
    function wpforce_featured_on_save( $post_id, $post, $update ) {
        // No need to duplicate code.  Instead, call your original function
        // passing it the $post parameter
        wpforce_featured_status( $post );
    }
    
    // New function that accepts proper parameters for these actions
    function wpforce_featured_on_status_change( $new, $old, $post ) {
        // No need to duplicate code.  Instead, call your original function
        // passing it the $post parameter
        wpforce_featured( $post );
    }
    
    // Your original function with slight modifications
    // NOTE: ONLY accepts $post object - no global post
    function wpforce_featured( $post ) {
          // REMOVED global $post - not helpful here
          $post_type = get_post_type( $post->ID );
          // ... the rest of your code here
    }
    
    // Your original hook, it's passing the $post_object parameter
    add_action('the_post', 'wpforce_featured');
    // The save hook, which passes parameters - modified to call a different function
    add_action('save_post', 'wpforce_featured_save', 10, 3);
    // The status change hooks, which pass parameters - modified to call a different function
    add_action('draft_to_publish', 'wpforce_featured_on_status_change', 10, 3);
    add_action('new_to_publish', 'wpforce_featured_on_status_change', 10, 3);
    add_action('pending_to_publish', 'wpforce_featured_on_status_change', 10, 3);
    add_action('future_to_publish', 'wpforce_featured_on_status_change', 10, 3);