Why does my WP_Query pagination on a custom page.php only loads the homepage?

You can paginate your custom loop on a page created inside WordPress, the issue with your code is that your are using “page” parameter instead of “paged” parameter; the former is used to paginate a single post parts, while the later is used to paginate post archives or multiple posts.

So a paginated query on your page template should be something like that:

$args = array(

    "category_name"    => "Publishing",
    "orderby"          => "post_date",
    "order"            => "DESC",
    "post_type"        => "post",
    "post_status"      => "publish",
    'paged' => get_query_var('paged'), // This is the correct parameter for pagination
);

$custom_query = new WP_Query($args);

if ( $custom_query->have_posts() ) :
    while ( $custom_query->have_posts() ) : $custom_query->the_post();

        echo '<h1>' . get_the_title() . '</h1>';
        // The remaining of your code here
    endwhile;

    wp_pagenavi(array( 'query' => $custom_query ) );

    wp_reset_postdata();
endif;

Also, I see in your code that you are using “$post” variable without being defined. If you are trying to access the current post in your custom loop, it is better to use the template tags — helper methods– e.g. get_the_ID(), get_the_title(),…etc those methods can access the global $post object by default without passing it as a parameter because you have already set it using $custom_query->the_post();